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进行分析,从而对代码 ...
随机推荐
- Swift All in One
Swift All in One Swift 5.3 https://github.com/apple/swift-evolution Xcode https://developer.apple.co ...
- convert number or string to ASCII in js
convert number or string to ASCII in js ASCII dictionary generator // const dict = `abcdefghijklmnop ...
- react hooks & props change & pagination current bug
react hooks & props change & pagination current bug multi tables & pigination bug & ...
- NGK的去中心化自治实践,更人性化的DAO
2020年,DeFi市场市场火爆的同时,引爆了流动性挖矿的市场.行业内对DAO的思考也在源源不断进行,特别项目治理通证发行之前,DAO的去中心化的治理理念,是区块链属性中的重要的一环,也已引发了不同项 ...
- 一款基于 Web 的通用数据管理工具(转载)
一款基于 WEB 的通用数据管控工具 - CloudQuery 前言 前段时间,公司因为业务发展,数据量攀升,老板迫切需要一个工具对数据进行精细化管理,一是确实需要精细化管理:二是因为我们公司小,数据 ...
- Mybatis-04 日志、分页
Mybatis-04 日志.分页 日志 1.日志工厂 如果数据库操作出现异常,就需要打印日志来排错. 日志工厂会把日志工作委托实现: SLF4J Apache Commons Logging Log4 ...
- Scrapy项目_阳光热线问政平台
目的: 爬取阳光热线问政平台问题中每个帖子的标题.详情URL.详情内容.图片以及发布时间 步骤: 1.创建爬虫项目 1 scrapy startproject yangguang 2 cd yangg ...
- Django框架-模型层3/数据传输/Ajax
目录 一.orm查询优化 1.only与defer 2.select_related与prefatch_related 二.模型层choices参数 三.MTV与MVC模型 1.MVC 2.MTV 3 ...
- Elasticsearch常用API
Note:以下API基于ES 5x,6x/7x可能略有不同,具体查看官方文档 ES常用API # 查看集群node curl "http://localhost:9200/_cat/node ...
- “蚂蚁牙黑”太火,想玩就用ModelArts做一个!
摘要:本文将介绍如何借力一站式 AI 开发平台,"傻瓜式"操作实现生成"蚂蚁牙黑"小视频. 作者:华为云EI专家胡琦 一夜之间,朋友圈都在"蚂蚁牙黑& ...