性能优化与调优Android开发

关于android:extractNativeLibs的默认值

2021-03-24  本文已影响0人  wenju

可能触发的问题:

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
上一篇下一篇

猜你喜欢

热点阅读