16

我在带有 Gradle 1.2.3 的 AndroidStudio 1.2.1.1 中使用 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;

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

这是refcard

有没有办法做相反的事情-keepclassmembernames

4

1 回答 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.
}
于 2015-06-05T01:07:11.950 回答