我想知道如何构建我的APK,以便在安装APK时在/data/data/
下安装/复制我的库。
>
我正在使用Android Studio 4.0.1
我构建了一个APK,并在提取它时确认我有一个lib/arm64-v8a
文件夹,其中包含我的jni库。
我希望在安装APK之后,同一设备上的一些其他应用程序可以访问我在lib/arm64-v8a
中的库。/data/data/
文件夹似乎是合适的位置,因此我的问题;如果有另一种方法可以让我的库在设备上访问,我是开放的。
基于此讨论,我在gradle.properties
文件中设置了android.bundle.enableuncompressednativelibs=false
,尽管使用它与true或false一起使用没有任何效果。
我在清单中设置了android:extractnativelibs=“true”
但是,当我adb安装我的apk时,我设备上的/data/data/
文件夹只包含一个cache
和code_cache
文件夹,这两个文件夹都是空的。
我确实在/data/app/
下看到了一个包含我的库的文件夹,但它们包含的字符串是每次安装APK时随机设置的:
/data/app/~~sFE8-eNknFAkhKJ-1S03lg==/<package name>-rsDLNgpi4vult7yVBrPNOQ==/
base.apk
lib/arm64/
<my .so in there>
这些随机字符串阻止我从任何其他应用程序可靠地访问我的库。(如果有一种方法可以使这些随机字符串不作为名称的一部分,并且/data/app
是我的库与其他应用程序共享的推荐位置,那么我对这种替代方法很感兴趣。)
我还安装了其他预构建的APK,使用这些APK,我可以看到/data/data/
下的库。对我来说,这表明我的问题与我如何用AS4.0.1构建我的APK有关,而不是与我的设备、它的Android版本或我如何安装APK有关。
这是我的分级文件:
import java.util.regex.Matcher
import java.util.regex.Pattern
apply plugin: 'com.android.application'
android {
compileSdkVersion 30
buildToolsVersion "30.0.2"
lintOptions {
checkReleaseBuilds false
abortOnError false
}
sourceSets.main {
jniLibs.srcDirs = ['libs']
jni.srcDirs = []
}
defaultConfig {
applicationId "com.example.myexample"
minSdkVersion 16
targetSdkVersion 30
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
externalNativeBuild {
cmake {
version "3.17.0"
cppFlags ""
arguments "-DANDROID_STL=c++++_shared"
}
}
ndk {
moduleName "myexample"
abiFilter "arm64-v8a"
ldLibs "log"
}
packagingOptions {
exclude "lib/arm64-v8a/libassets.so"
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
externalNativeBuild {
cmake {
version "3.17.0"
path "src/main/cpp/CMakeLists.txt"
// There can be only one CMAKE per project: https://developer.android.com/studio/projects/gradle-external-native-builds
}
}
}
task copyFiles(type: Copy) {
description = 'Testing a manual copy operation (confirmed it works)...'
from file("../dsp/external/ship/libmyexample_skel.so")
into file("$buildDir/res/raw/")
}
project.afterEvaluate {
preBuild.dependsOn copyFiles
}
dependencies {
implementation fileTree(dir: "libs", include: ["*.jar"])
implementation 'androidx.appcompat:appcompat:1.2.0'
implementation 'androidx.constraintlayout:constraintlayout:2.0.1'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test.ext:junit:1.1.2'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
}
我还尝试了一些:我手动创建了一个src/main/jnilibs.arm64-v8a文件夹,在其中放置了一个.so。当我解压缩时,That.so会出现在我的apk中,但是我的/data/data/
文件夹并没有lib。
我认为您需要添加这段代码,以便在适当的文件夹中添加库,如/data/data/
将此添加到应用程序的build.gradle
文件到Android{}
标记中
sourceSets.main {
jniLibs.srcDirs = ['libs']
jni.srcDirs = []
}
这是cmakelist.txt
文件
cmake_minimum_required(VERSION 3.4.1)
find_library( # Sets the name of the path variable.
log-lib
log)
set(distribution_DIR ${CMAKE_SOURCE_DIR}/libs)
add_library(yourLibName
SHARED
...//list of your c/c++ files here from jni folder
)
target_link_libraries(yourLibName ${log-lib})
请参阅developer.android.com
注意:当对Gradle配置进行更改时,请确保通过单击工具栏中的“同步项目”应用您的更改。此外,当您已经将CMake或ndk-build脚本文件链接到Gradle之后对其进行更改时,您应该通过从菜单栏中选择Build>Refresh linked C++Projects来将Android Studio与更改同步。
我想在我的项目的POM中引用一个jar(即vim25.jar,VMWare VSphere server management)。由于MavenRepository中没有引用此文件,我执行以下步骤: null mvn安装:install-file-dfile=./vim25.jar-dgroupid=manuallyinstalledjars-dartifactid=vim25-dversion=
当我清理/安装maven时,我会得到以下错误: 1)org.apache.maven:maven-archiver:jar:2.0.1 尝试从项目网站手动下载该文件。 然后,使用命令进行安装:mvn install:install-file-dgroupid=org.codehaus.plexus-dartifactid=plexus-utils-dversion=1.0.4-dpackaging
我最近重新安装了我的Windows。(Windows 10 64位) 我适当地安装了JDK 9。现在我正在尝试安装Android Studio 3,但Android SDK在安装中丢失了。当我打开程序时,安装向导出现并卡在下载包含此项目的组件上:https://dl.google.com/android/repository/android_m2repository_r47.zip 并一遍又一遍地
我试图将我的应用程序安装到Android L Preview Intel Atom虚拟设备中,它失败了,错误: install_failed_no_matching_abis
我是一个新的开发人员,我建立了一个应用程序Android和推到谷歌播放和出现错误时,我推一个APK文件。它需要5天,但没有修复这个错误。我使用visual studio 2017(xamarin)。 错误: 您上载的APK签名无效(了解有关签名的更多信息)。来自APKSigner的错误:错误:jar_sig_no_manifest:缺少META-INF/MANIFEST.mf