Apk包瘦身笔记
背景
随着业务功能的不断更迭,apk安装包的体积越来越大,最新的薄荷app android版本的安装包大小已经达到了22.5M,过大的安装包对于用户的体验来说会造成不好的影响,所以减小apk包的大小就显得尤为重要。
问题原因
NimbleDroid网站可以分析出apk安装包的各种大文件排行和各种依赖包的方法数,我们比较关注的是大文件的大小。上图
不看不知道,一看真是吓一跳,超过100k的图片文件就那么多,而且超过300k的就有7个之多。
还有两个MP3文件也很大。
解决办法
资源混淆
资源混淆的方案采用的微信团队的AndResGuard。使用方法输入一个apk文件,压缩混淆后输出一个apk包,采用引用gradle插件的方式集成到项目中,但是插件并不支持,所以就需要适配多渠道打包。薄荷项目中多渠道打包使用的是美团的方案,参考Android批量打包提速
方法如下
|
|
执行完resguard混淆压缩后生成apk文件,调用python脚本执行多渠道打包。
还有一点需要注意的是,使用该方案要注意动态查找id导致找不到id的问题。需要添加白名单,项目中有明确的说明。但是对于引用第三方项目较多的来说,挨个添加id就很不现实了。
所以在白名单中添加所有的id
集成改方案后apk包大概较小了4M。并且资源文件也已经混淆,资源路径长路径变成段路径res/drawable/icon -> res/drawable/a
对于反编译apk来说难度增加了。
删除无用代码和资源
在Android Studio中使用lint分析无用的文件
Analyze -> Run Inspection by Name
|
|
会列出无用资源列表,特别是图片全部干掉。
另外一点,由于项目更新迭代快,业务功能更改比较频繁,这就导致了项目中的无用代码特别多,但是依靠lint检查就比较有限,需要我们根据项目功能手动删除。删除无用代码后又会引出很多无用的资源文件,lint检查后再删除一遍。
做完这一步大概减少了1.5M左右。但是还有好多无用的代码还没有删除,以后有时间再处理。
去除无用的语言资源
具体项目具体执行,对于没有国际化的项目比如薄荷,在build.gradle中添加一句
|
|
只使用中文资源,不光对本项目生效,还会对依赖的项目生效,比如support包。这样打包后只会打包中文资源,大概减小了1M左右。
删除多余的so库
薄荷一直以来至保留armable,这一点可以根据具体项目来定。
混淆
Proguard是编译时对java代码进行压缩,混淆,优化,预编译等操作的集成化工具。达到删除冗余,增加安全防护,减小大小的功效。薄荷一直以来并没有加入代码混淆,一方面原因是项目越来越大,混淆的话如果测试不充分很容易出问题,另一方面,薄荷一直提倡开源,并且核心并不在app端,并且有很多初学者会反编译薄荷app学习一些开发技巧。但是,对于提升用户体验来说这些都显得微不足道。我们也在着手做相关的混淆工作。
其余一些建议
- tiny图片处理 目前所知图片压缩效果最好的网站。蘑菇街写了tiny的gradle插件,薄荷还没有实践
- 删除音频文件 薄荷项目中有一些音频文件,好在下个版本改业务功能即将下线,所以这些文件可以直接删除;另外一种方法是可以走网络获取,在线化。
- 用更小的库
- png转成webp 可能会有点兼容性问题
参考
本文链接: http://w4lle.com/2016/04/10/Apk包瘦身笔记/
版权声明:本文为 w4lle 原创文章,可以随意转载,但必须在明确位置注明出处!
本文链接: http://w4lle.com/2016/04/10/Apk包瘦身笔记/