使用ProGuard

时间:2015-05-29 09:38:35

标签: java android proguard obfuscation android-proguard

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

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
[...]

但在使用AndroidGuard的androdd反编译后,我最终得到:

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

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

这是refcard

有没有办法与-keepclassmembernames相反?

1 个答案:

答案 0 :(得分:9)

从中得到: How to tell ProGuard to keep private fields without specifying each field

  

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

最重要的是,您可以使用否定符(!)。 (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.
}