【Android】apk瘦身技术分享

背景
随着业务迭代,apk体积逐渐变大 。项目中积累的无用资源,未压缩的图片资源等,都为apk带来了不必要的体积增加 。调研了一些apk瘦身的方法后,总结如下 。
可用方法
1.删除无用资源
2.删除无用方法
3.混淆(方法混淆&资源混淆
4.使用一套图片资源
5.图片压缩/其他图片格式
6.so兼容一个平台,动态下载
7.精简第三方库
删除无用资源
1??开启
在build.中配置=true
首先介绍一下的原理:在打包过程中会多出一个task,通过调用一个方法进行无用资源的分析并进行处理,具体过程
1)根据R文件生成资源表,然后遍历所有的class文件,分析class中使用的资源,标记可达 。
2)分析 res,分析资源文件引用的其他资源,标记可达 。
3)调用,标记可能到达的资源 。比如通过动态获取的资源?以下代码会将所有带有img_前缀的资源标记为已使用 。
name = .("img_", angle + 1);
res = ().(name, "", ());

【Android】apk瘦身技术分享

文章插图
(如果想开启严格检测,不标记可能到达的资源,在keep.xml配置 tools:="",对于不进行严格检测的资源,配置tools:keep 风险:开启严格检测可能导致程序有bao
??然而,经过实验发现,开启并没有使apk变小 。因为在打包时,无用资源并没有直接被清理,而是把部分无用资源用更小的东西代替掉 。
2??开启Lint检测
在 中 -Runby Name- (过程与类似)
注意下图不要打勾,无效的id对apk体积增加微乎其微,删去却可能引起bug,得不偿失 。
【Android】apk瘦身技术分享

文章插图
还有一种要注意的情况
例如 请输入用户名
其中font size="16" 会被判定为无效资源,但是lint直接清除时,会把font标签内的内容全部删除,清理后的效果
(文字丢失了,lint暂时还不够智能,但这种情况比较少见,的时候仔细检查一下)
??lint的检测可能存在遗漏,如第一次找到100个无用资源,删除后第二次查找后,可能还存在几个无用资源,可以多查几次
3??删除无用的语言资源
在语言的配置上,只保留需要用到的语言,目前项目只保留中文即可,有些项目可能保留英文
{
"zh"
删除无用方法
1??开启
实验发现,开启后方法数从13w缩减到10w,效果还是比较显著的
2??使用Lint查找无用符号并删除
【【Android】apk瘦身技术分享】——Runby Name—— ()
——Runby Name——(Java)
批量删除的时候会一直提问是否safe
开启了后无用声明等基本不会增加apk的大小
3??内部类访问宿主类中的成员时,编译的时候会自动生成acces$方法,这种情况会导致方法数增多,如果
修改为非权限就可以去除这个$方法 。(西瓜视频减少了5w左右的方法数,视不同项目决定)
4??java语言中,考虑一些变量修饰符改为非修饰,可以减少一些set和get方法
类/方法混淆
1??配置 le('-.txt'), '-rules.pro',此处采用默认的混淆文本,也可以自定义 。使用keep保持不需要进行混淆的文件 。
2??配置优化的:le('--.txt'), '-rules.pro' (不太稳定,比如在模拟器上可能发生闪退,不推荐)
资源混淆
是微信推出的一款开源工具,对资源文件进行混淆,使用的方法很简单,效果显著 。
使用方法:
原理:用更短的名字替换原来的长名字
res//icon.png资源混淆后r/a/b.png
res//icon.png============>r/c/b.png
res//.pngr/c/d.png
(同一文件夹被映射到相同的新路径,同样的名字被映射到相同的资源名字)
??白名单:若想通过方式获得资源,需要放置白名单中,否则找不到对应资源 。务必将程序桌面icon加入白名单,友盟等,加入白名单 。多测试,多测试,多测试!
【Android】apk瘦身技术分享

文章插图