APK瘦身属性——android:extractNativeLibs
先描述一下结论:
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分别打包为aar与apk,两者占用的磁盘空间差距巨大:
打包为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 Size 与Download Size 差距较大,那Raw File Size与Download 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 Size 与download 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.xml中extractNativeLibs属性使用方式:
<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的更多相关文章
- Android APK瘦身之Android Studio Lint (代码审查)
******** ******** 第一部分: 瘦身内容介绍 ******** ******** 项目新版本的迭代接近尾声, 因为历史累积问题, 导致有很多无效的资源让已经臃肿的APK变得更肿, 因此 ...
- Drawable实战解析:Android XML shape 标签使用详解(apk瘦身,减少内存好帮手)
Android XML shape 标签使用详解 一个android开发者肯定懂得使用 xml 定义一个 Drawable,比如定义一个 rect 或者 circle 作为一个 View 的背景. ...
- Android XML shape 标签使用详解(apk瘦身,减少内存好帮手)
Android XML shape 标签使用详解 一个android开发者肯定懂得使用 xml 定义一个 Drawable,比如定义一个 rect 或者 circle 作为一个 View 的背景. ...
- Android性能优化系列之apk瘦身
Android性能优化系列之布局优化 Android性能优化系列之内存优化 为什么APK要瘦身.APK越大,在下载安装过程中.他们耗费的流量会越多,安装等待时间也会越长:对于产品本身,意味着下载转化率 ...
- Android APK 瘦身 - JOOX Music项目实战
导语 JOOX Music是腾讯海外布局的一个音乐产品,2014年发布以来已经成为5个国家和地区排名第一的音乐App.东南亚是JOOX Music的主要发行地区,由于JOOX Music所面对的市场存 ...
- 安卓APK瘦身
之前打包的时候直接就用eclipse或者android studio直接生成签名文件,并没有关心大小问题,近期有人问我有没有对APK进行瘦身.对这方面内容一致没有关注过,今天试用了各种方式把项目签名a ...
- APK瘦身记,如何实现高达53%的压缩效果
作者:非戈@阿里移动安全 1.我是怎么思考这件事情的 APK是Android系统安装包的文件格式,关于这个话题其实是一个老生常谈的题目,不论是公司内部,还是外部网络,前人前辈已经总结出很多方法和规律. ...
- APK瘦身实践
首发地址:http://www.jayfeng.com/2015/12/29/APK%E7%98%A6%E8%BA%AB%E5%AE%9E%E8%B7%B5/ 因为推广的需要,公司需要把APK的大小再 ...
- APK瘦身
APK瘦身 主要从一下三方面来瘦身: 1. Java 源代码 1) ,这方面主要是通过最简洁的代码实现最直接的功能,还有就是提出上线前不必要的java代码,可以使用UCDector进行分析,从而对代码 ...
随机推荐
- tensorflow加载ckpt出错
Issue链接 问题: tensorflow加载ckpt出错 此处原因: 该ckpt文件对应的tensorflow版本过老, 其中的部分内置变量名发生了改变. 提示: Key lstm_o/bidir ...
- 如何用 js 实现一个类似微信红包的随机算法
如何用 js 实现一个类似微信红包的随机算法 js, 微信红包, 随机算法 "use strict"; /** * * @author xgqfrms * @license MIT ...
- Regular Expression & rgb2hex
Regular Expression & rgb2hex regex // 颜色字符串转换 function rgb2hex(sRGB = 'rgb(255, 255, 255)') { co ...
- nasm astrcat函数 x86
xxx.asm %define p1 ebp+8 %define p2 ebp+12 %define p3 ebp+16 section .text global dllmain export ast ...
- SPC空投价值高达310万美金,生态建设者直呼真香!
市场上面有句名言:"人赚不到自己认知以外的财富",这在数字加密上也是共通的.早在本月12日,也就是前天,NGK官方发行的第N波利好---SPC侧链代币空投已经陆续发放了,NGK以及 ...
- NGK公链DeFi发力,Baccarat项目引爆流动性挖矿热潮
DeFi市值屡创新高,在这条康庄大道上,人们摩拳擦掌,就像90年代美国西部淘金热一般.DeFi带来的流动性挖矿构成了今年加密货币一道靓丽的风景线,而人们手握的不再是当年的锄头铲子,而是一串代码. 随着 ...
- go-admin在线开发平台学习-3[细节解析]
本章节主要的内容是对go-admin中的一些有趣编码进行分析,为自己以后提供一些借鉴 使用cli方式启动项目 使用cobra[眼镜蛇]完成强壮cli的工具,确保稳定. 使用cli的方式启动项目的好处显 ...
- 疯狂的String
本文转载自疯狂的String 导语 在java中字符串是我们比较常用的一个类型,字符串是不可变的,类被声明为final , 存储字符的char[] value数据也被声明为final ,我们对Stri ...
- python进阶(1)Lambda表达式
Lambda表达式 lambda表示的是匿名函数,不需要用def来声明,一句话就可以声明出一个函数 语法 函数名 = lambda 参数:返回值 注意点 1.函数的参数可以有多个,多个参数之间用逗号隔 ...
- 微信小程序(二十)-UI组件(Vant Weapp)-01按装配置
1.官网 https://vant-contrib.gitee.io/vant-weapp/#/intro https://gitee.com/vant-contrib/vant-weapp 2.按装 ...