Android 11 要求,预装的apk,target sdk 为 30 以上,必须在 apk 中使用未压缩的 so 库。
检查方式,运行命令 unzip -v your_app.apk ‘lib//.so’
如果 so 库文件显示 Defi,表示经过压缩
$ unzip -v demo.apk 'lib/*/*.so'
Archive: demo.apk
Length Method Size Cmpr Date Time CRC-32 Name
-------- ------ ------- ---- ---------- ----- -------- ----
43016 Defl:N 18785 56% 1980-00-00 00:00 8e1effa3 lib/arm64-v8a/libpl_gif.so
46812 Defl:N 23961 49% 1980-00-00 00:00 122a3c0e lib/armeabi-v7a/libpl_gif.so
-------- ------- --- -------
android:extractNativeLibs
软件包安装程序是否将原生库从 APK 提取到文件系统。如果设为 false,则原生库必须保持页面对齐状态并以未压缩的形式存储在 APK 中。无需更改代码,因为链接器在运行时直接从 APK 加载库。默认值为 “true”。
意思是:
- extractNativeLibs = false ,签名过程中 so 库对齐不压缩,安装时不会将应用内的 so 库提取到系统中,运行时直接从 APK 中加载 so。好处是 so 只有一份,可以随 apk 升级,节省空间;缺点是 APK 包变大。
- extractNativeLibs = true,签名过程中 so 库会被压缩,安装时需要将应用内的 so 库提取到系统中,运行时才能调用 so。
Android 11 要求预装 apk 设成 false:
<application
......
android:extractNativeLibs="false"
>
</application>
检查结果:
$ unzip -v demo.apk 'lib/*/*.so'
Archive: demo.apk
Length Method Size Cmpr Date Time CRC-32 Name
-------- ------ ------- ---- ---------- ----- -------- ----
43016 Stored 18785 56% 1980-00-00 00:00 8e1effa3 lib/arm64-v8a/libpl_gif.so
46812 Stored 23961 49% 1980-00-00 00:00 122a3c0e lib/armeabi-v7a/libpl_gif.so
-------- ------- --- -------