Android-通过@Keep注解来防止类、构造函数、方法、变量等混淆

我们在开发Android应用的时候,经常遇到这样一种问题:那就是防止proguard混淆我们特定的变量、方法等等。


举个例子,我们定义了一个类,这个类实现了Serializable接口;当然这个类不能混淆,否则反序列化会出错。通常这种情况下,我们会在proguard-rules.pro配置文件中加入以下代码:

-keepnames class * implements java.io.Serializable
 -keepclassmembers class * implements     java.io.Serializable {
static final long serialVersionUID;
private static final java.io.ObjectStreamField[]     serialPersistentFields;
!static !transient <fields>;
private void         writeObject(java.io.ObjectOutputStream);
private void readObject(java.io.ObjectInputStream);
java.lang.Object writeReplace();
java.lang.Object readResolve();
}

但是这个是混淆的实现Serializable的类,有时候我们需要混淆没有共同特征的类、方法和属性时,这种写法就非常蛋疼了。

这里介绍一种比较新颖、轻快的方法,通过@Keep注解来灵活的防止混淆,用起来非常的灵活、快捷、方便,怎样用呢?像普通的注解一样,如下:

//防止混淆类
@Keep
public class Person {}

//防止混淆变量
@Keep
public String name;

//防止混淆方法
@Keep
public int getAge(){}

但是当你加上上面的注解后,发现@Keep并没有起作用,该混淆的还是混淆了,这是为什么呢?

原因目前Gradle还不支持@Keep混淆,Google只是定义好了一个这种注解,并没有实现它,也就是说@Keep目前只是一个空壳。这里我们来手动开启它,让它支持防止混淆,在你的progurad-rules.pro配置文件里面加入以下代码:

#手动启用support keep注解
#http://tools.android.com/tech-docs/support-    annotations
-dontskipnonpubliclibraryclassmembers
-printconfiguration
-keep,allowobfuscation @interface         android.support.annotation.Keep

-keep @android.support.annotation.Keep class *
-keepclassmembers class * {
    @android.support.annotation.Keep *;
}

加入后如下:
image

这样就开启了,重新打Realease包发现程序可以正常运行了!