远程二进制共享 nativeLibrary 未提取

Remote binary shared nativeLibrary not extracting

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

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

实际安装的 apk 显示 .so 文件存在于 apk ZipFile(context.applicationInfo.sourceDir).getEntry("lib/${Build.SUPPORTED_ABIS[0]}/libMyLibrary.so") 中,我可以这样提取它(只是不提取到应用程序的 nativeDir,安全例外)。并且 System.mapLibraryName("MyLibrary") returns “libMyLibrary.so”...

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

如何正确提取内容w/o 需要在我的清单中声明?

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

Guidance/help 将不胜感激!

此答案相当详细地描述了 extractNativeLibs 功能的使用,以及如何更改 packaging/deployment 进程以将其设置为 false:。 tl;dr:您的 APK 下载量会更大,但加载速度更快并且在手机上占用的空间更少 space,因为它不需要解压缩。

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

If set to false, then your native libraries must be page aligned and stored uncompressed in the 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"
}

添加到 different.package.B 的 build.gradle android

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
}

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

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