为什么要瘦身
- 安装包变大,导致很多用户不愿意安装更新
- 安装包变大,导致很多用户不愿意下载
- 安装包变大,流量使用增多,增加其他边际成本
优化方式
图片资源的优化
图片选择顺序
- 首先选选择SVG
- 否则选择WebP
- 之后如果有透明通道等选择PNG
- 剩下的选择JPG
AS可将PNG转为WebP
对比效果如下
PNG压缩
- 可以采用ImageOptim或者Pngyu对png进行压缩
- AAPT会使用内置的压缩算法来优化res/drawable/目录下的PNG图片,但也可能会导致本来已经优化过的图片体积变大,可以禁止aapt优化PNG图片
aaptOptions{
cruncherEnabled = false
}
测试之后,发现不但没变小,apk包反而变大了几十k。。。
Jpg图片压缩
可以采用packJPG或者guetzli压缩jpg图片
只放一份资源
推荐放在xxhdpi
资源压缩
开启代码混淆、去除无用资源
进一步资源混淆
微信开源了AndResGuard工具,对资源进一步混淆
冗余代码优化
冗余代码的定义
- 完全一致的代码或者只修改了空格和注释
- 结构上和句法上一致的代码,例如只是修改了变量名
- 插入和删除了部分代码
- 功能和逻辑上一致的代码,语义上的拷贝
冗余代码检测
使用工具,例如PMD
- 下载后输入: ./run.sh cpdgui
- pmd -d /usr/src-R rulesets/java/quickstart.xml -f text
Lint检测
检测未使用资源
Android Studio -> Analyze -> Run inspection by Name -> unused resource
无用代码优化
Analyze -> run Inspection By Name -> unused declaration -> Moudule app -> OK
其他的
其他优化
压缩存储文件
- 导入7Zip,压缩存储预置资源
- 使用时,解压到本地,比如assert中的资源
语言资源优化
在build配置中配置resConfigs指定需要的语言类型
使用Splits根据不同的ABI以及不同的屏幕密度分别打包
https://developer.android.google.cn/studio/build/configure-apk-splits.html
重复的string,color优化
- 过滤重复的strinng
- 定义唯一的color名
减少Enum使用
- 每减少一个Enum文件可以减少1K左右的大小
- 采用常量定义
优化引用的库
- 去除不再使用的库
- 优化过时的库
- 仅仅提取使用的代码
- 选用更小的外部库
音频资源压缩
压缩音频,降低采样率、通道数
so动态下发
- So可以采用动态下发的方式加载 – 下载失败怎么办 ?
- 仅需要加载对于abi下的so