概述
对于proguard的用途一般有两点,一是缩小包大小,proguard会优化字节码,移除未使用的代码,以及用短名称混淆其余的类、字段和方法,二是安全性,混淆过的代码晦涩难懂。
ProGuard对java文件进行压缩(shrinker),优化(optimizer),混淆(obfuscator), 和预检(preverifier)四个步骤。
- 压缩(shrinker): 移除无用的类,方法,字段和属性。
- 优化(optimizer):分析和优化方法的字节码。
- 混淆(obfuscator):使用简单的无意义的名字来重命名保留下来的类,字段和方法。
前几步是让代码,量更小,更加高效,更难逆向工程。
- 预检(preverifier): 将预验证信息添加到Java Micro Edition和Java 6及更高版本所需的类中
上面每个步骤都是可选的
具体步骤如下图:
开启混淆
仅仅在module设置需求minifyEnabled为true就可以了,如下图:
对于proguardFiles是有两个文件一个是自带的proguard-android.txt,一个是我们需要设置的proguard-rules.pro文件。
proguard-android文件可以在build->intermediates->proguard-files中查看。
proguard-rules.pro是真正我们需要自己设置的文件,并且每个module都会有此文件。
设置混淆
避免对外接口混淆
我们提供一个library给其他的module使用,或者发布到maven库供其他人使用,我们希望混淆library的内部代码,只提供部分的接口给接入方使用。这种情况下我们不能混淆接口,否则会导致接口找不到。
比如Demo中,library对外提供了一个接口供外部使用,在打开混淆后,不设置混淆的时候会报错。因此需要library中的proguard-rules.pro避免对外接口混淆。
public final class LibraryPlatform {
private LibraryPlatform() {
}
public static void test(){
}
}
MainActivity.java:14: error: cannot find symbol
LibraryPlatform.test();
^
symbol: variable LibraryPlatform
location: class MainActivity