我想知道如何构建我的APK,以便在安装APK时在/data/data/<package name>/lib
下安装/复制我的库。
lib/arm64-v8a
文件夹。lib/arm64-v8a
中拥有的库。/data/data/<package name>
文件夹似乎是正确的位置,因此我的问题;如果有另一种方法使我的库在设备上访问,我是开放的。android.bundle.enableUncompressedNativeLibs=false
在我的gradle.properties
文件中设置了这一讨论,尽管我没有看到使用它时使用true或false的任何效果。android:extractNativeLibs="true"
但是,当我安装apk时,设备上的/data/data/<package name>/
文件夹只包含一个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,使用这些程序,我确实看到了/data/data/<package name>/lib
下的库,这是我想要的。对我来说,这表明我的问题是如何用AS 4.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。当我解压缩它时,这个.so会出现在my中,但是我的/data/data/<package name>/
文件夹没有库。
发布于 2020-12-30 10:49:43
我认为您需要添加这段代码来在适当的文件夹中添加lib,比如/data/data/<package name>/lib
。
将此添加到app的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})
注意:在对Gradle配置进行更改时,请单击工具栏中的Sync确保应用您的更改。此外,在您已经将CMake或ndk脚本文件链接到Gradle之后对其进行更改时,您应该通过从菜单栏中选择Build > Refresh链接的C++项目来同步Android和您的更改。
https://stackoverflow.com/questions/65407736
复制相似问题