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进行分析,从而对代码 ...
随机推荐
- 如何使用 js 写一个正常人看不懂的无聊代码
如何使用 js 写一个正常人看不懂的无聊代码 代码质量, 代码可读性, 代码可维护性, clean code WAT js WTF https://www.destroyallsoftware.com ...
- Github Actions All In One
Github Actions All In One https://github.com/features/actions https://github.com/marketplace?type=ac ...
- Express All In One
Express All In One express.js, node.js web framework # v4.17.1 Latest, on May 26, 2019 $ yarn add ex ...
- 「NGK每日快讯」12.15日NGK公链第42期官方快讯!
- Java审计之CMS中的那些反序列化漏洞
Java审计之CMS中的那些反序列化漏洞 0x00 前言 过年这段时间比较无聊,找了一套源码审计了一下,发现几个有意思的点拿出来给分享一下. 0x01 XStream 反序列化漏洞 下载源码下来发现并 ...
- C++算法模板集合
我的常用刷题网站:http://218.5.5.242:9018/JudgeOnline/ https://www.luogu.com.cn/ 排序 选择排序(selection sort) 1 vo ...
- js获取数字数组最大值的几种方式
原生Math.max方法 Math.max 方法不能接收数组,可以使用ES6的...将数组打散 const arr = [111, 12, 111, 34, 2, 5, 76]; console.lo ...
- 3分钟学会如何上手supervisor看门狗
软硬件环境 centos7.6.1810 64bit cat /etc/redhat-release #查看系统版本 supervisor 3.4.0 python 2.7.5 supervisor简 ...
- DRF 视图家族及路由层补充
目录 视图家族 一.views视图类 1.APIView类 2.GenericAPIView类(generics中) 二.mixins类:视图辅助工具 1.RetrieveModelMixin 2.L ...
- apiAutoTest:支持自定义函数,用例中可调用
0. 前言 apiAutoTest从去年8月以来开源至今,也更新了不少内容,一起来看看吧 第一个版本 - 2020/08/08 增加实际响应存储数据的方法,并在字典可以处理依赖见tools/svae_ ...