在 apk 中包含具有不同前缀的文件

Include files with different prefixes in apk

我有一个项目,其中包含我想使用的本机库,具有这种格式的文件:lib<name>.so 确实包含在 apk 中。但是 <name>.so 格式的文件没有。

有没有办法将后面的类型包含到 lib 目录中的 apk 中?

如果没有,有没有办法将文件包含到 apk 中的目录中,我可以从我的本机代码加载它?

简短的回答是 "no"。如果本机二进制文件的名称遵循 lib….so 模式,则它们只会被打包到 APK 中,并在安装时解压缩为可执行文件。


请注意,这些库将根据目标系统的 ABI 提取到文件中。安装程序不检查文件的实际属性。根据APK结构中lib下的文件夹名称决定。

如果您将属性 extractNativeLibs=false 添加到 APK AndroidManifest.xml 中的 application 标签,安装程序(在 Android Nougat 和higher) 不会提取本机库。

你可以欺骗系统,将不符合上述规则的文件放到APK的lib文件夹中,但意义不大,因为它们会永远不会被加载程序提取(it may also extract file gdbserver 如果文件存在)。

通常的做法是将任意文件放在 APK 的 assets 文件夹中,并在应用程序安装后首次运行时以编程方式提取它们。您无法将这些文件提取到通常的本机库所在的安全位置。您不应将本机库提取到 sdcard(例如 getExternalFilesDir()),因为系统可能不允许执行那里的文件,无论文件上的 execute access 标志。确保您使用正确的 ABI 风味。

您可以查看 Nougat 原生库加载器的源代码,它可以在不提取的情况下从 APK 加载原生库,并使用它直接从 assets 加载您的自定义库您的 APK 文件夹。