【问题标题】:Include files with different prefixes in apk在 apk 中包含具有不同前缀的文件
【发布时间】:2019-03-29 18:45:43
【问题描述】:
我有一个项目,其中包含我想使用的本机库,文件格式为:lib<name>.so 确实包含在 apk 中。但<name>.so 格式的文件不会。
有没有办法将后面的类型包含到lib目录下的apk中?
如果没有,有没有办法将文件包含到 apk 内的目录中,我可以从我的本机代码加载它?
【问题讨论】:
标签:
android
android-ndk
android-gradle-plugin
【解决方案1】:
简短的回答是“否”。如果它们的名称遵循 lib....so 模式,则本机二进制文件只会打包到 APK 中,并在安装时解压缩为可执行文件。
请注意,这些库将根据目标系统的 ABI 提取到文件中。安装程序不会检查文件的实际属性。该决定基于 APK 结构中 lib 下的文件夹名称。
如果您将属性 extractNativeLibs=false 添加到 APK 的 AndroidManifest.xml 中的 application 标记,安装程序(Android Nougat 及更高版本)将不会提取本机库。
你可以欺骗系统,将不符合上述规则的文件放到APK的lib文件夹中,但是没有多大意义,因为它们永远不会被loader(it may also extract file gdbserver 如果文件在那里)。
通常的做法是将任意文件放在 APK 的 assets 文件夹中,并在应用安装后首次运行时以编程方式提取它们。您无法将这些文件提取到通常的本机库所在的安全位置。您不应该将本机库提取到 sdcard(例如 getExternalFilesDir()),因为系统可能不允许在那里执行文件,无论 execute access 标志在文件。确保使用正确的 ABI 风格。
您可以查看 Nougat 原生库加载器的源代码,它可以从 APK 加载原生库而无需提取,并使用它直接从 APK 的 assets 文件夹加载您的自定义库。