2015-05-29 165 views
14

我在AndroidStudio 1.2.1.1中使用ProGuard和Gradle 1.2.3。使用ProGuard混淆私人領域

我的搖籃的發行版本配置,像這樣:

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更名。如何做?

這裏是refcard

有沒有辦法做到-keepclassmembernames的反義詞?

+0

是googleApiClient唯一是非模糊字段還是所有字段都是一樣的? –

+1

我想爲所有私人領域。 – shkschneider

回答

8

從這個入門: How to tell ProGuard to keep private fields without specifying each field

根據ProGuard documenation通配符任何 場比賽。

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

我用過'-keepclassmembers類my.package {!private ;保護;公衆; ; }'並得到我想要的:名稱爲'a','b','c'等的字段。我知道這與取消者有關,這要感謝他引導我正確使用。我會根據我的個人用法進行改進,但這是我正在尋找的答案。 – shkschneider

+0

這裏是我最後一個ProGuard文件,它工程bug bug#78377:https://gist.github.com/shkschneider/a1c81780cd1f35a7037d – shkschneider

+0

謝謝你的迴應和獎勵! 我很高興你根據我的提示制定了出來,也感謝你加入github,這對我來說也是一次很好的體驗。 – czupe