可能触发的问题:
Failure [INSTALL_FAILED_INVALID_APK: Failed to extract native libraries, res=-2],Apk无法安装
例如:含有.so文件,AndResGuard进行资源混淆,进行加固的APK都可能出现。
AndResGurad原理介绍
1.官方API介绍
android:extractNativeLibs
软件包安装程序是否将原生库从 APK 提取到文件系统。如果设为 false,则原生库必须保持页面对齐状态并以未压缩的形式存储在 APK 中。无需更改代码,因为链接器在运行时直接从 APK 加载库。
默认值为 "true"。
2.源码及Gradle解释
官方文档默认值为 true
,查看系统源码可以发现,读取这个属性的时候会以 true
作为默认值
if (sa.getBoolean(
com.android.internal.R.styleable.AndroidManifestApplication_extractNativeLibs,
true)) {
ai.flags |= ApplicationInfo.FLAG_EXTRACT_NATIVE_LIBS;
}
如果在 AndroidManifest.xml
中主动设置了 android:extractNativeLibs
,肯定已设置为准,但是如果默认没有设置就有所不同。
Android Gradle extractNativeLibs 行为变更官方介绍
从 AGP (Android Gradle Plugin) 的 CHANGELOG
中,我们可以看到,在 AGP 3.6.0版本中,google
更新了 extractNativeLibs
的默认行为,在构建应用时,插件现在默认会将 extractNativeLibs 设置为 false
。
通过观察编译后生成的AndroidManifest.xml
文件,发现gradle
插件设置默认值为false
是通过在处理AndroidManifest.xml
文件的时候,在其中自动插入 android:extractNativeLibs=“false"
来实现的。但是由于 android:extractNativeLibs
这个属性是在 Android M(6.0)
引入的,所以如果项目中配置 minSdkVersion < 23
的话,gradle
插件是不会做这个自动插入的。
所以我们得出 extractNativeLibs
默认值的几种情况
条件 | 默认值 |
---|---|
AGP < 3.6.0 或 minSdkVersion < 23 | true |
AGP >=3.6.0 且 minSdkVersion >= 23 | false |