Android APK从M开始不再支持安装后解压动态库

 

使用的三方动态库, 需要额外传入动态库加载路径, 不过在更新Android Studio后发现原本正常使用的APP无法找到对应的动态库导致APP闪退,也就是Android APP无法使用ApplicationInfo.nativeLibraryDir(/data/app/package/lib)来表示加载库路径。

问题描述

打包在APK的native libraries 不会再在安装的时候从apk解压缩,而是会从apk直接读取。这个功能实在Android M开始支持的额。APK 确保原生动态库不会从apk中解压缩出来, 以达到节省存储空间的目的。 一般来讲, 对于动态库的加载是无感的,也就是APP并不需要care这个过程,但是对于需要额外提供搜索路径的动态库却是致命的。原因就是这个地址不再是固定的,或者是透过ApplicationInfo.nativeLibraryDir可以拿到。使用ApplicationInfo.nativeLibraryDir得到的将会是个空目录的内容, 对应的动态库并不会被拷贝。

解决方法

对于单纯加载动态库, 可以无差别使用dlopen, 也即LD默认会搜索APK中为解压缩的动态库。对于需要传入ld libray path的, 需要支持解压缩动态库的可以参考如下方法:

  1. Update gradle.properties with android.bundle.enableUncompressedNativeLibs=false
  2. In the manifest under <Application> specify android:extractNativeLibs="true"

测试可以正常从apk解压缩出来

标签:

About: kiah


发表评论

电子邮件地址不会被公开。