2015-05-29 14 views
14

Ich benutze ProGuard in AndroidStudio 1.2.1.1 mit Gradle 1.2.3.Verschlüsseln private Felder mit ProGuard

Mein Gradle des Release-Build ist wie so konfiguriert:

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

Ich würde die privaten Felder von Klassen wie verschleiert werden.

Hier ist meine proguard Config-Datei (nach vielen Versuchen) ab sofort:

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

Aber ich am Ende, nach decompiling mit androdd von AndroidGuard, mit:

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

weiß, dass ich die Die Verwendung dieser Verschleierung ist begrenzt, aber ich möchte googleApiClient von ProGuard umbenannt werden. Wie geht das?

Hier ist die refcard.

Gibt es eine Möglichkeit, das Gegenteil von -keepclassmembernames zu tun?

+0

ist googleApiClient die einzige unverschleierte Feld oder ist es für alle Felder gleich? –

+1

Ich möchte das für alle privaten Bereiche. – shkschneider

Antwort

8

von dieser Anfahrt: How to tell ProGuard to keep private fields without specifying each field

Nach ProGuard documenation der Platzhalter paßt zu jedem Feld.

Top of, Sie können Negatoren (!) Verwenden. (http://proguard.sourceforge.net/#manual/usage.html)

Attributnamen können enthalten?, * Und ** Platzhalter, und sie können durch die voran sein! Negator.

Ich bin nicht so in diesem Bereich erfahren, so ist es eher eine Vermutung, aber einfacher, in einem neuen Kommentar zu schreiben. So etwas sollte den Job (nicht getestet) tun:

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

sein kann Sie so verwenden können, aber nicht sicher, wie es mit einem Negator arbeitet zuerst:

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

Ich habe '-keepclassmembers class my.package {! Private ; geschützt ; öffentlich ; ; } 'und bekam, was ich wollte: Felder mit den Namen' a', 'b',' c' usw. Ich wusste, dass dies mit Negatoren zu tun hat, danke, dass sie mich zur richtigen Verwendung geführt haben. Ich werde für meinen persönlichen Gebrauch verfeinern, aber das ist die Antwort, nach der ich gesucht habe. – shkschneider

+0

Hier ist meine letzte ProGuard-Datei, die funktioniert Bug Android-Fehler # 78377: https://gist.github.com/shkschneider/a1c81780cd1f35a7037d – shkschneider

+0

Vielen Dank für Ihre Antwort und für die Belohnung! Ich bin froh, dass Sie basierend auf meinen Tipps ausgearbeitet haben, auch danke für das Setzen auf GitHub, es war eine gute Erfahrung für mich auch. – czupe