2015-05-29 13 views
14

Utilizzo ProGuard in AndroidStudio 1.2.1.1 con Gradle 1.2.3.Obfuscate private fields using ProGuard

build di rilascio di mio Gradle è configurato in questo modo:

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

Vorrei i campi privati ​​delle classi per essere offuscato.

Ecco il mio file di Proguard di configurazione (dopo molti tentativi) fin d'ora:

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

Ma io alla fine, dopo la decompilazione con androdd da AndroidGuard, con:

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

So che la l'uso di questa offuscazione è limitato, ma vorrei che lo googleApiClient venga rinominato ProGuard. Come si fa?

Ecco lo refcard.

C'è un modo per fare l'opposto di -keepclassmembernames?

+0

è googleApiClient l'unica unobfuscated campo o è lo stesso per tutti i campi? –

+1

Mi piacerebbe questo per tutti i campi privati. – shkschneider

risposta

8

ottenere da questo: How to tell ProGuard to keep private fields without specifying each field

Secondo ProGuard documenation il jolly corrisponde a qualsiasi campo .

In cima a questo, è possibile utilizzare i negatori (!). (http://proguard.sourceforge.net/#manual/usage.html)

nomi attributo può contenere?, * E ** caratteri jolly, e possono essere preceduto dal! negatore.

Non sono così esperto in questo campo, quindi è piuttosto un'ipotesi, ma più facile da scrivere in un nuovo commento. Qualcosa del genere dovrebbe fare il lavoro (non testato):

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

Può essere che si può usare in questo modo, ma non sicuro di come funziona con un negatore prima:

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

Ho usato la classe '-keepclassmembers my.package {! Private ; protetto ; pubblico ; ; } 'e ho ottenuto quello che volevo: campi con i nomi' a', 'b',' c' ecc. Sapevo che questo ha a che fare con i negatori, grazie per avermi portato all'uso corretto. Raffinerò per il mio uso personale, ma questa è la risposta che stavo cercando. – shkschneider

+0

Ecco il mio file ProGuard finale che funziona bug bug di Android # 78377: https://gist.github.com/shkschneider/a1c81780cd1f35a7037d – shkschneider

+0

Grazie per la risposta e per il premio! Sono contento che tu abbia elaborato basandomi sui miei suggerimenti, anche grazie per aver contribuito al github, è stata anche una bella esperienza per me. – czupe