背景介绍
最近工作中涉及到减包体size的需求,由于某些低端设备和低端市场对apk的推广size的大小有很大的影响。这方面的工作思路和流程:1.分析apk各文件的占比,找出优化的方向;2.删除无用的资源;3.模块化设计动态下发某些功能;4.proguard优化
工作代码中,有大量的日志代码,由于有debug日志开关的。发布正式版会去掉相关的统计,而忽略了日志d代码仍然会占用size。
其实proguard 本身就提供了去除日志代码的功能,在使用过程中需要特别小心。一开始自己按着官网上的方式来做就是出不了效果,几经折腾总数找到原因为什么不行了,期间还一直怀疑是不是官网介绍有问题。现在回想一下还是自己掉到了android-studio的坑里面了。
坑在这里,官方一直强调
-dontoptimize
不能在proguard混淆文件中,可是android-studio默认加载的混淆脚本proguad-android.txt 中确有这么一句:
Optimization is turned off by default. Dex does not like code run
through the ProGuard optimize and preverify steps (and performs some
of these optimizations on its own).
-dontoptimize
就是因为这句导致 该设置一直没有起效
-assumenosideeffects class android.util.Log {
public static * d(…);
public static * e(…);
public static * i(…);
public static * v(…);
public static * println(…);
public static * w(…);
public static * wtf(…);
}
解决办法替换成proguard-android-optimize.txt这个文件或者不引入默认的混淆文件自己独立写proguard文件,大功可成也。测试发现如网上资料所写,log代码传参中 有成员变量、方法调用、字符串拼接等情况。log代码会优化掉
但是会留下new StringBuilder()字符串拼接的代码仍然能够占用部分内存和size,这种情况最好在调用日志代码的地方加上日志开关来控制。
paramBundle = (Toolbar)findViewById(2131492971);
d().a(paramBundle);
new StringBuilder(“hhhhh”).append(getLocalClassName()).append(l);
getCallingPackage();
new StringBuilder(“hhhhh1”).append(m.a).append(m.b);
Object localObject = m.a;
new StringBuilder().append(m.b).toString();
localObject = m.a;
new StringBuilder(“hhhhhh5”).append(m.a).append(getLocalClassName()).toString();
小点
-renamesourcefileattribute SourceFile
-keepattributes SourceFile,LineNumberTable
以上两行会留下崩溃行号信息,但是size会增大10%左右
-printconfiguration you_config.txt
这个信息比较有用,可以将proguard引入的规则文件都输出在这里,方便排查问题