最近开发某物业公司的APP,项目写完后感觉Apk安装包肥了点,给它做个减肥套餐。
优化的目的
减少APK文件大小、下载、安装时间。
1、可以看到主要是以下部分占用了应用大小
- classes.dex: Java字节码文件
- res: 资源文件、xml、图片等其他文件。
- lib: so库、jar包。
- resources.arsc: 二进制资源映射表
- assets: 存储音视频等原始资源文件。
1. 优化Dex文件
- minifyEnabled true proguard混淆、剔除代码。
- zipAlignEnabled true 4字节对齐提高运行效率(如果在Google play上架必须开启)
- 多余依赖库(项目基础框架包含较多库,部分库可能这个项目没有使用到)
External Libraries可以看到jar,根据项目检查是不是所用到的。
经优化减少5344-4087=1257kb
2、优化Res文件夹
- 尽量保留一套图片资源、会自动根据高低密度缩放,主流720P 、1080P放xhdpi或xxhdpi。
- 开启shrinkResources true 剔除无效资源
- png图片压缩、www.tinypng.com
- webp格式 在4.2.1以上会支持比较好,4.0~4.1不支持无损、透明通道(该方案暂未使用)。
经优化减少4087-3899=188kb
3、优化so库
- abiFilters 配置支持的cpu架构类型
so库有很多CPU架构的如:'armeabi','armeabi-v7a', 'x86', 'x86_64', 'mips', 'mips64', 'arm64-v8a'等,一般armeabi是兼容armeabi-v7a的,v7在图形渲染方面做了优化,如果没有特别要求可以不需要。
经优化减少3899-3591=308kb
4、优化resources.arsc
- 有美团方案、微信方案,我选择微信方案,关闭V2签名。
- resConfigs zh 由于项目没有国际化,暂支持中文
按官网配置后,选择构建即可。
构建后可以看到,资源混淆成功。
经优化减少3591-3009=582kb
5、其它优化
- 使用自己资源覆盖第三方未使用到的资源,比如第三方有大图在aar里面,但是这张大图并没有实际展示出来,可以放1x1大小图片覆盖,从而减少apk大小。
可以解压apk文件查看有哪些大图,创建1*1放到对应目录覆盖。
小结
最终APK大小 5.21M瘦身到2.93M,其实还可以再优化比如剔除R文件等,这些下次再好好琢磨补充文章。
2、其他建议
- 使用插件化(上架Google Play慎用)
- 尽量使用xml文件代替图片(shape,selector等)
- 剔除R文件(这次优化还没有用上)。
- 使用Webp格式(这个坑还没有掌握,项目要求4.0+,还有国产手机改了rom不支持webp)
- 使用点9图
- 使用常量代替枚举
- HTML混合开发。
参考资料
- 老司机谈APK瘦身套路-项目优化篇 http://blog.csdn.net/mynameishuangshuai/article/details/51766185
- 【推荐】 Android APP终极瘦身指南 https://mp.weixin.qq.com/s/3oSsVY5mbPUdZ-jW5T-0kQ
- 爱奇艺Android移动客户端app瘦身经验 http://blog.csdn.net/wenyiqingnianiii/article/details/52152091
- Android资源混淆打包方案 http://blog.csdn.net/xiangzhihong8/article/details/54989020
- 微信资源混淆工具 https://github.com/shwenzhang/AndResGuard
- 剔除R文件 https://github.com/meili/ThinRPlugin/blob/master/README.zh-cn.md
- 四字节对齐 http://blog.csdn.net/liujianli123/article/details/47045929
打个广告: Square开源交流 QQ群166354503 (Rxjava Retrofit EventBus MVP OKHttp等等交流)。