先描述一下结论:

android:extractNativeLibs = true时,gradle打包时会对工程中的so库进行压缩,最终生成apk包的体积会减小

但用户在手机端进行apk安装时,系统会对压缩后的so库进行解压,从而造成用户安装apk的时间变长

关于android:extractNativeLibs默认值设定方面,若开发人员未对android:extractNativeLibs进行特殊配置:

  • minSdkVersion < 23 或 Android Gradle plugin < 3.6.0情况下,打包时 android:extractNativeLibs=true
  • minSdkVersion >= 23 并且 Android Gradle plugin >= 3.6.0情况下,打包时android:extractNativeLibs=false

一、起因

偶然发现,使用AndroidStudio将同一Module分别打包为aarapk,两者占用的磁盘空间差距巨大:

打包为aar,占用磁盘空间4.4M;打包为apk,占用磁盘空间为11.7M;

使用AndroidStudio中 apkanalyzer 对比分析,两种打包方式so库 Rwa File Size 差距较大,但两者的Download Size 大小完全一致:

打包为aar,so库Rwa File Size为3.4M;打包为apk,so库Rwa File Size为8.2M;

打包为aar,so库Download Size为3.3M;打包为apk,so库Download Size为3.3M;

两种打包方式 apkanalyzer 对比分析如下:

两种打包方式Rwa File SizeDownload Size 差距较大,那Raw File SizeDownload Size又是如何定义的呢?

二、Raw File Size & Download Size

官方 view_file_and_size_information: 描述如下:

APK Analyzer shows raw file size and download file size values for each entity, as shown in figure 1. Raw File Size represents the unzipped size of the entity on disk while Download Size represents the estimated compressed size of the entity as it would be delivered by Google Play. The % of Total Download Size indicates the percentage of the APK's total download size the entity represents.

翻译后:

APK Analyzer 展示每个实体的 Raw File Sizedownload file size

Raw File Size 代表对应实体在磁盘上未进行压缩的大小;

Download Size 代表对应实体在Google Play中,预估的压缩后的大小;

% of Total Download Size 代表对应模块实体,在Download Size总大小中所占百分比。

看到这里,怀疑:

打包为aar时,AndroidStudio对Module中的so库进行了压缩;但打包为apk时,未对Module中的so库进行压缩

三、android:extractNativeLibs

查询相关资料,发现文章Android APK Raw File Size vs Download Size:

文章中提到:

打包APK时,是否对so库进行压缩的控制属性为 android:extractNativeLibs

AndroidManifest.xmlextractNativeLibs属性使用方式:

<application
android:extractNativeLibs="true">
</application>

3.1、android:extractNativeLibs = true

android:extractNativeLibs = true,进行apk打包时,AndroidStudio会对Module中的so库进行压缩,最终得到的apk体积较小。

  • 好处是:用户在应用市场下载和升级时,因为消耗的流量较小,用户有更强的下载和升级意愿。
  • 缺点是:因为so是压缩存储的,因此用户安装时,系统会将so解压出来,重新存储一份。因此安装时间会变长,占用的用户磁盘存储空间反而会增大。

3.2、android:extractNativeLibs = false

android:extractNativeLibs = false,进行apk打包时,AndroidStudio不会对Module中的so库进行压缩,最终生成的apk体积较大。

  • 好处是:用户安装后,直接使用/data/data/your.app.package/lib路径下的so,没有额外的so复制操作,相对于android:extractNativeLibs = true而言,节省用户磁盘存储空间;

3.3、结论

android:extractNativeLibs = true的设定还是利大于弊的。

设置为true可以工程中的so库进行压缩,最终减小生成的apk包大小。至于安装应用时,因so库解压缩而造成的安装时间增长,相对于带来的好处(提高应用市场用户的下载和升级意愿)而言,我认为是可接受的。

四、android:extractNativeLibs默认值

android:extractNativeLibs官方API描述如下:

从android:extractNativeLibs官方API描述中可以了解到:

  • 源码中 android:extractNativeLibs默认值为true;
  • 编译器Android Gradle plugin 3.6.0 或更高版本,android:extractNativeLibs默认值为false;

但真的是这样吗?一起来探究一下。

4.1、源码中extractNativeLibs默认设定

从Android 6.0(API 23)开始,Android frame源码中PackageParser.java在读取android:extractNativeLibs属性值时,默认值为true;

对应的源码路径:frameworks/base/core/java/android/content/pm/PackageParser.java

if (sa.getBoolean(
com.android.internal.R.styleable.AndroidManifestApplication_extractNativeLibs,
true)) {
ai.flags |= ApplicationInfo.FLAG_EXTRACT_NATIVE_LIBS;
}

4.2、Android Gradle plugin 3.6.0 或更高版本

编译器Android Gradle plugin 3.6.0 或更高版本,在构建应用时会默认将 extractNativeLibs 设置为 false

通过观察编译后生成的AndroidManifest.xml文件,发现 gradle 插件设置默认值为false,是通过在处理AndroidManifest.xml文件的时,在其中自动插入 android:extractNativeLibs=“false"来实现的

由于 android:extractNativeLibs 这个属性是在Android 6.0(API 23)引入的,因此如果项目配置 中minSdkVersion < 23 的话,gradle 插件不会自动插入android:extractNativeLibs=“false"

4.3、结论

开发人员在进行apk打包时,若未对android:extractNativeLibs进行特殊配置:

  • minSdkVersion < 23 或 Android Gradle plugin < 3.6.0,打包时 android:extractNativeLibs=true
  • minSdkVersion >= 23 并且 Android Gradle plugin >= 3.6.0,打包时android:extractNativeLibs=false

五、参考

apkanalyzer:

https://developer.android.com/studio/command-line/apkanalyzer

view_file_and_size_information:

https://developer.android.com/studio/build/apk-analyzer.html#view_file_and_size_information

Android APK Raw File Size vs Download Size:

https://stackoverflow.com/questions/45024723/android-apk-raw-file-size-vs-download-size-how-to-shrink-the-raw-file-size

android:extractNativeLibs:

https://developer.android.com/guide/topics/manifest/application-element.html#extractNativeLibs

Setting android:extractNativeLibs to reduce app size:

https://stackoverflow.com/questions/42998083/setting-androidextractnativelibs-false-to-reduce-app-size

========== THE END ==========

APK瘦身属性——android:extractNativeLibs的更多相关文章

  1. Android APK瘦身之Android Studio Lint (代码审查)

    ******** ******** 第一部分: 瘦身内容介绍 ******** ******** 项目新版本的迭代接近尾声, 因为历史累积问题, 导致有很多无效的资源让已经臃肿的APK变得更肿, 因此 ...

  2. Drawable实战解析:Android XML shape 标签使用详解(apk瘦身,减少内存好帮手)

    Android XML shape 标签使用详解   一个android开发者肯定懂得使用 xml 定义一个 Drawable,比如定义一个 rect 或者 circle 作为一个 View 的背景. ...

  3. Android XML shape 标签使用详解(apk瘦身,减少内存好帮手)

    Android XML shape 标签使用详解   一个android开发者肯定懂得使用 xml 定义一个 Drawable,比如定义一个 rect 或者 circle 作为一个 View 的背景. ...

  4. Android性能优化系列之apk瘦身

    Android性能优化系列之布局优化 Android性能优化系列之内存优化 为什么APK要瘦身.APK越大,在下载安装过程中.他们耗费的流量会越多,安装等待时间也会越长:对于产品本身,意味着下载转化率 ...

  5. Android APK 瘦身 - JOOX Music项目实战

    导语 JOOX Music是腾讯海外布局的一个音乐产品,2014年发布以来已经成为5个国家和地区排名第一的音乐App.东南亚是JOOX Music的主要发行地区,由于JOOX Music所面对的市场存 ...

  6. 安卓APK瘦身

    之前打包的时候直接就用eclipse或者android studio直接生成签名文件,并没有关心大小问题,近期有人问我有没有对APK进行瘦身.对这方面内容一致没有关注过,今天试用了各种方式把项目签名a ...

  7. APK瘦身记,如何实现高达53%的压缩效果

    作者:非戈@阿里移动安全 1.我是怎么思考这件事情的 APK是Android系统安装包的文件格式,关于这个话题其实是一个老生常谈的题目,不论是公司内部,还是外部网络,前人前辈已经总结出很多方法和规律. ...

  8. APK瘦身实践

    首发地址:http://www.jayfeng.com/2015/12/29/APK%E7%98%A6%E8%BA%AB%E5%AE%9E%E8%B7%B5/ 因为推广的需要,公司需要把APK的大小再 ...

  9. APK瘦身

    APK瘦身 主要从一下三方面来瘦身: 1. Java 源代码 1) ,这方面主要是通过最简洁的代码实现最直接的功能,还有就是提出上线前不必要的java代码,可以使用UCDector进行分析,从而对代码 ...

随机推荐

  1. Windows 10 自带 free 屏幕截图/录像软件 Game Bar! 不仅仅是game-游戏呦! 高清晰,高保真,perfect!不仅仅是游戏呦!

    good news! good news! good news! 重要的事情说三遍! Windows 10 自带  屏幕截图/录像软件 Game Bar! 以后再也不用第三方的 盗版软件了! 对于Wi ...

  2. BTC暴涨市值仅次于亚马逊,NGK推出新人助力空投,直接免费送VAST!

    数据显示,在谷歌搜索中,关键词"BTC"的全球搜索指数在过去一周达到满值100点.特斯拉"加持"下,比特币重启暴涨模式,最高报价48126美金单价,非小号数据显 ...

  3. USDN稳定币应用区块链旅游业

    比特币是区块链1.0时代的标志性产品,稳定币则是区块链2.0时代的标志性产品.在稳定币鼻祖USDT爆出"超发"新闻后曾引发市场的动荡,之后新兴稳定币如春笋般涌现.据不完全同济,目前 ...

  4. nginx日志文件切分

    定义cut_nginx_log.sh 日志文件脚本如下 #!/bin/bash#LOGS_PATH为日志存放路径LOGS_PATH=/weblog/nginx/logsYESTERDAY=$(date ...

  5. 微信小程序:添加全局的正在加载中图标效果

    在发送请求的时候,显示一个正在加载中的小图标.在加载下一页的时候也显示正在加载中.同时数据请求回来了,把加载中进行关闭. 开发----API-----界面 在哪里添加这两段代码会比较方便呢?一个项目有 ...

  6. Java基本概念:面向对象

    一.简介 面向过程的思维模式是简单的线性思维,思考问题首先陷入第一步做什么.第二步做什么的细节中. 面向对象的思维模式说白了就是分类思维模式.思考问题首先会解决问题需要哪些分类,然后对这些分类进行单独 ...

  7. Java基础语法:包机制

    为了更好地组织类,Java 提供了包(package)机制. 这种机制是为了防止命名冲突,访问控制,提供搜索和定位类(class).接口(interface).枚举(enumerations)和注释( ...

  8. Virtual DOM 简直就是挥霍

    彻底澄清"Virtual DOM 飞快"的神话. 注意:原文发表于2018-12-27,随着框架不断演进,部分内容可能已不适用. 近年来,如果你有使用过 JavaScript 框架 ...

  9. 阿里云CentOS8.0服务器配置Django3.0+Python 3.7 环境

    ---恢复内容开始--- 1. 下载并安装python # 安装Python3.7.6 wget https://www.python.org/ftp/python/3.7.6/Python-3.7. ...

  10. vue 递归调用组件出错

    报错信息: Avoid mutating an injected value directly since the changes will be overwritten whenever the p ...