安装包瘦身
从APK的组成结构可以看出,其中占用空间最大的部分就是代码和资源,所以我们要做安装包瘦身就要从代码和资源这两个方向着手。
代码部分:
冗余代码
无用代码
无用代码是指工程中那些未被引用的代码和文件,比如未被引用的变量、方法和类等。
对于无用代码,主要采用的方法就是用UCDetector对整个工程代码进行扫描,找出引用为0的变量、方法、类,然后根据情况进行处理。
冗余代码
冗余代码是指重复的代码或经过优化后可以用一段代码量更小的代码替换的代码。
使用用simian的工具,检测出可以封装的模块,提高代码复用率。
方法数缩减
- 避免在内部类中访问外部类的私有方法/变量。将成员变量的private属性替换为protected/public或者直接去掉修饰
- 避免调用派生类中的未被覆盖(override)的方法。对于不需要被覆盖的方法,显式地改成调用基类的方法。
- 将类的成员变量改为public,并去掉get、set方法。
代码混淆
使用Proguard工具混淆代码,它不但可以将代码中的各种元素名称改得简短,而且可以移除冗余代码。
资源部分
冗余资源
APK的资源主要包括图片、XML。与冗余代码类似,资源里面可能也遗留了不少旧版本使用而新版本不再使用的图片、XML等。
对冗余资源采用的方法是先用Lint扫描,然后写自动化脚本对Lint扫描结果进行处理,找到那些在代码和XML中都不再引用的资源进行删除。
资源混淆
对资源名称进行混淆,resources.arsc变小。
图片处理
- 图片压缩,在适当的场景下做图片的有损压缩。
- JPG与PNG的转换,小尺寸、色彩数少、或者有alpha通道透明度的时候,使用PNG;大尺寸、色彩渐变色多的用JPG。
- 点9图化,减少了图片量,也减少了安装包的大小。
- 无用图片的再次梳理,删除以前版本遗留的无用图片。
- 图片网络化,不重要的图片可以采用下载的方式获取。
极限压缩zip
打包过程的压缩原理
Android打包过程中压缩文件的过程:
- aapt工具对工程非asset资源的编译压缩
aapt对压缩安装包的主要贡献主要在于赋予每一个非assets资源一个ID值,以便将XML二进制化,从而节省空间,以及对图片进行无损压缩。
- SignedJarBuilder类对工程的压缩
SignedJarBuilder类对整个工程包括代码.dex文件和一些可压缩的资源、文件进行压缩,它使用的压缩算法由Java.util.zip类提供。
提高压缩级别
使用7z工具对其进行DEFLATE极限压缩以提高压缩效率。提高压缩级别可在不对APK包本身的内容做任何修改的情况下得到更小的APK包。