0

因此,我提供二进制文件作为打包为aar. android 库libMyLibrary.so在目录中有文件src/main/jniLibs/<abi>/,因此在构建和部署时它们位于 aar 的 jni 目录中。该库唯一的另一件事是一个清单文件,其中只包含包名称package.name.A

package.name.A作为对不同项目的依赖项导入different.package.B,会导致在构建中正确打包所有内容,并且共享库包含在调试/发布 apk 的lib/<abi>/libMyLibrary.so. 但是,它们不会在安装时被提取到应用程序的本机目录中。

实际安装的 apk 显示.so文件存在于 apkZipFile(context.applicationInfo.sourceDir).getEntry("lib/${Build.SUPPORTED_ABIS[0]}/libMyLibrary.so")作品中,我可以通过这种方式提取它(只是不能提取到应用程序的 nativeDir,安全异常)。并System.mapLibraryName("MyLibrary")返回“libMyLibrary.so”...

在我将它们作为远程依赖项提供之前,它们src/main/jniLibs/<abi>/被提取,并包含在应用程序的目录中。现在,我可以在通过 an 将它们作为远程依赖项提供时提取它的唯一方法aar是包含在 Manifest 中android:extractNativeLibs="true"

我如何才能正确提取东西而无需在我的清单中声明?

我需要在远程库的清单中声明什么,以便在合并时,Android 知道共享的本机库并且它会正确提取?我需要一个 Android.mk 文件吗?

指导/帮助将不胜感激!

4

2 回答 2

0

添加到different.package.Bbuild.gradleandroid

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
}

解决了我的问题。通过aar现在提取到应用程序的本机目录提供的 *.so 文件。

见:https ://github.com/05nelsonm/TOPL-Android-TorBinary

于 2020-07-19T10:51:28.053 回答
0

该答案对 extractNativeLibs 功能的使用进行了相当详细的描述,以及您必须如何更改打包/部署过程才能将其设置为 false:https ://stackoverflow.com/a/44704840/13924538 。tl;dr:您的 APK 下载量会更大,但加载速度更快,并且在手机上占用的整体空间更少,因为它不需要解压缩。

extractNativeLibs 的文档在这里,它也提供了一些见解:https ://developer.android.com/guide/topics/manifest/application-element#extractNativeLibs

如果设置为 false,那么您的原生库必须是页面对齐的,并且未压缩地存储在 APK 中。

这是 zipalign 工具的文档,您可以在部署(预签名)过程中手动运行或与 shell 脚本合并:https ://developer.android.com/studio/command-line/zipalign

zipalign [-f] [-v] 4 infile.apk outfile.apk # f overwrites outfile.apk, v for verbose, 4 byte is the only allowed value that does anything for alignment

或者,在 gradle 中,在签署步骤之前:

task zipAlign {
   workingDir "<my apk output dir>"
   commandLine "zipalign -f -v 4 infile.apk outfile.apk"
}
于 2020-07-13T19:34:45.253 回答