【问题标题】: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 文件夹加载您的自定义库。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-26
    • 2014-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多