美文网首页性能优化与调优Android开发
关于android:extractNativeLibs的默认值

关于android:extractNativeLibs的默认值

作者: wenju | 来源:发表于2021-03-24 14:30 被阅读0次

    可能触发的问题:

    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

    相关文章

      网友评论

        本文标题:关于android:extractNativeLibs的默认值

        本文链接:https://www.haomeiwen.com/subject/enqhhltx.html