我有一个项目,该项目包含我要使用的本机库,其文件格式为:lib<name>.so
确实包含在apk中。但是<name>.so
格式的文件却没有。
是否可以在lib
目录的apk中包含后一种类型?
如果没有,是否可以将文件包含到apk内的目录中,我可以从本机代码中加载该文件?
答案 0 :(得分:1)
简短的答案是 “否” 。如果本地二进制文件的名称遵循 lib….so 模式,则它们将仅打包为APK,并在安装时提取为可执行文件。
请注意,这些库将根据目标系统的ABI提取到文件中。安装程序不会检查文件的实际属性。该决定取决于APK结构中 lib 下的文件夹的名称。
如果您将属性extractNativeLibs=false添加到APK的AndroidManifest.xml中的 application 标签中,则安装程序(在Android Nougat及更高版本上)将不会提取本机库。
您可以欺骗系统,并将不符合上述规则的文件保存到APK的 lib 文件夹中,但是这样做几乎没有意义,因为它们永远不会被APK提取。加载程序(如果文件在那里,则为 it may also extract file gdbserver )。
通常的做法是将任意文件放入APK的 assets 文件夹中,并在安装后首次运行该应用时以编程方式提取它们。您无法将这些文件提取到通常的本机库所在的安全位置。您不应该将本机库提取到 sdcard (例如, getExternalFilesDir()),因为不管execute access,系统可能不允许在那里执行文件。在文件上标记。确保使用正确的ABI口味。
您可以查看Nougat本机lib loader的源代码,该源代码可以不提取而从APK加载本机库,并使用它直接从APK的 assets 文件夹中加载自定义库。