Apk体积优化实战总结
Apk体积优化实战总结
今日领导在公司内部做了一个关于ios app性能优化的技术分享,就突然对Android端的apk体积优化有了兴趣,于是跟领导讨论了一下,就开始了第一次体积优化的实践。经过几天的工作,最后成功减少了22%左右的大小,最后也成功上线,下面就根据自己实践的经历,做一次体积优化总结。
前期储备知识
apk结构
技术调研
首先着手调研了一下Android apk包体优化的技术方案,包括:大图压缩/采用webp图片格式,svg格式替换中小图片,无用资源清除,so库优化,代码混淆/资源混淆等。
-
移除无用资源。
分物理移除与非物理移除。
物理移除:
Refactor -> Remove Unused Resources
Analysis -> Run inspection by name,输入unused resources,对项目进行检查,手动删除。
物理移除有风险,删除前需要检查,使用getIdentifier()方式动态调用资源要检查资源是否被误删!!!!!
非物理移除:
buildType中设置 shrinkResouces = true,在打包过程中移除无用的资源。 -
图片处理。
大图可考虑压缩。(如tinyPng)
可使用svg格式的图片作为图标。 -
library库优化。
对依赖库中重复的jar包进行整合等。 -
开启代码混淆。
开启代码混淆可以减小apk的体积。 -
资源打包配置优化。
如,移除不需要的语言如 :resConfig("zh-rCN),主要是在build.gradle中进行一些配置。 -
代码优化。
及时去除无用代码
减少枚举类的使用,使用注解@Indef
项目着手实践
-
第一步,首先从jenkins 下载apk包,拖取到AS中,便可以看到apk的组成。
-
第二步,根据这些图片,找到项目中没有被使用过的界面,进行删除。
-
第三步,通过Analysis -> Run inspection by name,搜索unused resources,找到没有被使用过的资源文件,布局文件等,进行删除(注意)
-
第四步,重复进行第三步,因为删除无用布局后,可能有些图片资源又变成了无用资源,需要进行再一次的检查删除。
-
第五步,项目中有@Deprecated标记的页面,进行清理。
最终结果:
可优化的潜力分析
考虑到可能出现的风险问题,没有进行彻底的清理,所以还有可优化的潜力。
- 代码质量的优化减少枚举类的使用,一个独立的枚举类,会占用1到1.4k的空间,改为@Indef注解。
- 图片的压缩目前只对100k以上的图片进行了压缩,剩余图片还可以进行压缩处理。
采坑点
- 无用资源依然被打包进了apk中。
原因是A布局虽然没有被使用,但是其里面的控件B的id被调用,所以仍然会被打包进apk中。 - 动态加载一些图片资源导致的错误。一些图片资源在代码里动态加载,AS lint没有检测到图片资源被使用,导致删除图片资源后出现一些bug。
总结
- 无用代码以及无用资源等,一定要及时清除。
- 有大图资源时,首先考虑优化其大小。
- apk体积优化是个持久性的工作,每个版本都要做体积优化,不能只做一次。
注
这只是我根据项目的实际情况进行的优化,主要只进行了资源的优化,代码未进行多少优化,其余的混淆,资源配置都已经设置过了。如果建议,望不吝赐教。