使用ProGuard混淆私有字段

16

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

我的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;

我知道这种混淆的用途有限,但我希望通过ProGuard将googleApiClient重命名。如何操作?

这里是参考卡

有没有一种方法可以反向执行-keepclassmembernames


googleApiClient是唯一未混淆的字段吗?还是所有字段都是这样的? - yohann.martineau
1
我希望所有私有字段都是这样的。 - shkschneider
1个回答

12

从这个链接获取信息: 如何告诉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.
}

我使用了 -keepclassmembers class my.package { !private <fields>; protected <field>; public <fields>; <methods>; } 并且得到了我想要的结果:字段名为 abc 等等。我知道这与否定词有关,感谢您指导我正确的使用方法。我将根据个人需求进行优化,但这就是我所寻找的答案。 - shkschneider
这是我的最终 ProGuard 文件,可以解决 Android Bug #78377: https://gist.github.com/shkschneider/a1c81780cd1f35a7037d - shkschneider
谢谢你的回应和奖励!我很高兴你基于我的提示解决了问题,同时也感谢你将代码放在GitHub上,这对我来说也是一次很好的经验。 - czupe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接