远程二进制共享 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 文件现在解压缩到应用程序的本机目录。
所以我提供二进制文件作为打包为 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:
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 文件现在解压缩到应用程序的本机目录。