【问题标题】:Remote binary shared nativeLibrary not extracting远程二进制共享 nativeLibrary 未提取
【发布时间】:2020-10-30 12:12:39
【问题描述】:

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

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

实际安装的 apk 显示 .so 文件在 apk ZipFile(context.applicationInfo.sourceDir).getEntry("lib/${Build.SUPPORTED_ABIS[0]}/libMyLibrary.so") 有效,我可以这样提取它(只是不能提取到应用程序的 nativeDir,安全异常)。而System.mapLibraryName("MyLibrary") 返回“libMyLibrary.so”...

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

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

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

非常感谢指导/帮助!

【问题讨论】:

    标签: android android-native-library


    【解决方案1】:

    此答案对 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"
    }
    

    【讨论】:

    • 所以在进一步检查之后,aar 是用压缩的 .so 文件构建的。有没有办法不压缩原生库,这样当different.package.B 导入它们时,它们就是原始的未压缩文件?
    【解决方案2】:

    添加到 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

    【讨论】:

      猜你喜欢
      • 2018-05-15
      • 2013-05-05
      • 2023-03-23
      • 1970-01-01
      • 2014-01-25
      • 1970-01-01
      • 2011-07-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多