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进行分析,从而对代码 ...
随机推荐
- fibonacci number & fibonacci sequence
fibonacci number & fibonacci sequence https://www.mathsisfun.com/numbers/fibonacci-sequence.html ...
- LeetCode 数组分割
LeetCode 数组分割 LeetCode 数组怎么分割可以得到左右最大值的差值的最大 https://www.nowcoder.com/study/live/489/1/1 左右最值最大差 htt ...
- XSS (跨站脚本攻击) 的原理分析,测试 && 应对措施
1 1 1 XSS (跨站脚本攻击) 的原理分析,测试 1 demo: <!DOCTYPE html> <html lang="en"> <head& ...
- git cli all in one
git cli all in one https://www.atlassian.com/git/tutorials/learn-git-with-bitbucket-cloud git create ...
- Service Worker in Action
Service Worker in Action https://caniuse.com/#feat=serviceworkers Service Workers 1 W3C Candidate Re ...
- React Hooks & Context API
React Hooks & Context API responsive website https://reactjs.org/docs/hooks-reference.html https ...
- NGK是如何运用IPFS分布式存储的?
整个夏季,除了天气的火热,还有的火热莫过于IPFS挖矿这个领域了.IPFS的概念火热到,你可以看到到处都在卖IPFS矿机.那么,是什么原因导致IPFS这么火呢?在这之前,我们先了解一下什么是IPFS技 ...
- 「NGK每日快讯」12.2日NGK公链第29期官方快讯!
- 痞子衡嵌入式:串行NOR Flash的DQS信号功能简介
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是串行NOR Flash的DQS信号功能. 串行NOR Flash在嵌入式里的应用相当广泛,既可用作数据存储也可以用作代码(XiP)存储, ...
- RabbitMQ(二) Java使用RabbitMQ
2-1 RabbitMQ 生产者消息发送 创建 Maven 项目 Send 加入依赖 <dependency> <groupId>com.rabbitmq</groupI ...