背景
随着业务迭代,apk体积逐渐变大。项目中积累的无用资源,未压缩的图片资源等,都为apk带来了不必要的体积增加。调研了一些apk瘦身的方法后,总结如下。
可用方法
1.删除无用资源
2.删除无用方法
3.混淆(方法混淆&资源混淆
4.使用一套图片资源
5.图片压缩/其他图片格式
6.so兼容一个平台,动态下载
7.精简第三方库
删除无用资源
1⃣️开启ShrinkResource
在build.gradle中配置shrinkResource=true
首先介绍一下shrinkResource的原理:在打包过程中会多出一个task,通过调用一个analyze方法进行无用资源的分析并进行处理,具体过程
1)根据R文件生成资源表,然后遍历所有的class文件,分析class中使用的资源,标记可达。
2)分析Manifest res,分析资源文件引用的其他资源,标记可达。
3)调用keepPossiblyReferencedResources,标记可能到达的资源。比如通过getIdentifier动态获取的资源⬇以下代码会将所有带有img_前缀的资源标记为已使用。
String name = String.format("img_%1d", angle + 1);
res = getResources().getIdentifier(name, "drawable", getPackageName());
(如果想开启严格检测,不标记可能到达的资源,在keep.xml配置 tools:shrinkMode="strict",对于不进行严格检测的资源,配置tools:keep 风险:开启严格检测可能导致程序有bao
⚠️然而,经过实验发现,开启shrinkResource并没有使apk变小。因为在打包时,无用资源并没有直接被清理,而是把部分无用资源用更小的东西代替掉。