使用ProGuard混淆私有字段


问题内容

我在AndroidStudio 1.2.1.1和Gradle 1.2.3中使用了ProGuard。

My Gradle的发布版本的配置如下:

minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
shrinkResources true

我希望混淆类的私有字段。

到目前为止,这是我的proguard配置文件(经过多次尝试):

-allowaccessmodification
-dontskipnonpubliclibraryclasses
-dontskipnonpubliclibraryclassmembers
-renamesourcefileattribute SourceFile
-keepattributes SourceFile,LineNumberTable
-repackageclasses ''
-verbose
[...]

但是在androdd从AndroidGuard 反编译后,我最终得到了:

private com.google.android.gms.common.api.GoogleApiClient googleApiClient;

我知道这种混淆的使用是有限的,但是我想googleApiClient由ProGuard重命名。怎么做?

这是refcard

有什么办法可以做相反的事情-keepclassmembernames吗?


问题答案:

从此获得:
如何告诉ProGuard保留私有字段而不指定每个字段

根据ProGuard文档,通配符匹配任何字段。

最重要的是,您可以使用取反符(!)。(http://proguard.sourceforge.net/#manual/usage.html

属性名称可以包含?,*通配符,并且可以在其前面加上!!否定者。

我在该领域的经验不是很丰富,所以这只是一个猜测,但是更容易在新注释中撰写。像这样的事情应该做的工作(未测试):

-keepclassmembers class * { //should find all classes 
    !private <fields>;    
    <methods>;
    <init>; //and keep every field, method, constructor apart from private fields
}

也许您可以像这样使用,但不确定首先如何使用否定器:

-keepclassmembers class * { //should find all classes 
    !private <fields>;    
    *; //should exclude everything except private fields, which should be obfuscated.
}