一、原因
APP过大会影响用户的下载安装转化率。
二、APK构成
通过解压APK包分析,可以知道APK包的主要构成:
文件/目录 | 描述 |
---|---|
lib/ | 存放so文件 |
res/ | 未被编译到resources.arsc中的资源文件,如layout、drawable、animator等 |
assets/ | 存放资源文件,会原封不动的打包到包内,通过AssetManger访问 |
classes(n).dex | java/kotlin代码编译后的字节码文件 |
resources.arsc | 编译后的二进制资源文件,包含res/values中的内容如字符串、style等,和未编译进来的资源的路径,如layout、图片等 |
META-INF/ | 文件的摘要和签名信息 |
AndroidManifest.xml | Android的清单文件,用于描述应用程序的名称、版本、所需权限、注册的四大组件 |
根据上面的APK构成看下每个部分是否有瘦身空间。
三、so优化
1、自己编译so时优化;可以尽量使用c语言,或者减少使用C++模板等,使用strip删除符号表等方式减少so包的体积,更多细节可参考这篇文章
2、集成so时只选择一套so;目前Android设备最多支持7中CPU(armeabi,armeabiv-v7a,arm64-v8a,mips, mips64, x86, x86_64)架构,也就是说最多可以放7套so,但是目前基本没有x86和mips的手机,所以我们只需要关注arm的三套so,因为arm的CPU运行so时可以向下兼容,即armeabi的so可以运行在armeabiv-v7a和arm64-v8a的设备上,所以很多APP只保留了armeabi一套so(如点评和微信)。但是目前armeabi设备越来越少,兼容模式下运行so会有性能损坏,所以目前通常推荐只保留armeabiv-v7a一套so。细节可以看相关文章文章一、 文章二、 文章三、 文章四
3、动态下发加载so;感觉这种方法对一般APP没有必要,实现细节可以参考这里
四、resources.arsc文件优化
resources.arsc文件优化,目前做的比较好的是微信的AndResGuard
,它主要是通过混淆把路径优化成a/b/c的形式,不仅减少空间,也增加逆向难度。
R.string.name -> R.string.a
res/drawable/icon -> r/s/a
五、代码和dex优化
- 减少无用代码和无用库的引入,如果只用到一个库的部分功能,可以使用源码依赖以减少无用代码的引入。
- 通过使用ProGuard来对代码进行混淆、优化、压缩,这个通常编译release包都会开启,只需要在gradle中配置minifyEnabled为true即可。
- 优化dex中的debug Items。dex文件的data区中有个debug Items区域,主要存储函数参数变量局部变量、指令集行号和源文件行号。这个区域数据主要用于debug和获取调用堆栈,占dex包的5.5%左右,但是去掉的话crash日志分析就会比较麻烦,支付宝APP的方案可以参考一下。
六、资源优化之图片优化
为了支持不同屏幕密度,android支持ldpi|mdpi|tvdpi|hdpi|xhdpi|xxhdpi|xxxhdpi等多套图片资源,通常使用一套或两套图片资源即可满足需求。
关于图片格式选择,盗用一张图片如下,能够使用VectorDrawable的优先使用VectorDrawable,系统支持WebP的优先使用WebP((Android从4.0才开始支持WebP,Android 4.2.1开始支持包含透明的WebP),其他场景如果需要透明则使用PNG,否则可以使用JPG格式。关于图片压缩工具美团的这篇文章有介绍。
七、资源优化之语言优化
一般APP只需要支持简体中文就行了,但是一些androidx库的文本支持多国语言,默认会把多国语言的文本打进包内,为了避免这种情况可以在gradle中明确支持的语言类型
android {
...
defaultConfig {
...
resConfigs "zh", "zh-rCN"
}
...
}
八、资源优化之开启资源压缩
资源文件中很多资源以及使用不到了,通过设置shrinkResources为true会将这些无用资源压缩(不删除,讲图片或layout替换为预定义好的很小的资源),设置方法如下:
buildTypes {
release {
shrinkResources true
minifyEnabled true
}
}
参考文献:
安装包立减1M--微信Android资源混淆打包工具
Google I/O 2016 笔记:APK 瘦身的正确姿势
美团Android App包瘦身优化实践
Android App安装包瘦身计划
Android性能优化之安装包性能优化