Android
ProGuard: offuscamento e riduzione del codice
Ricerca…
Regole per alcune delle librerie ampiamente utilizzate
Attualmente contiene regole per le seguenti librerie: -
- Coltello da burro
- RxJava
- Libreria di supporto Android
- Libreria di supporto alla progettazione Android
- Retrofit
- Gson e Jackson
- Otto
- Crashlitycs
- Picasso
- raffica
- OkHttp3
- Parcelable
#Butterknife
-keep class butterknife.** { *; }
-keepnames class * { @butterknife.Bind *;}
-dontwarn butterknife.internal.**
-keep class **$$ViewBinder { *; }
-keepclasseswithmembernames class * {
@butterknife.* <fields>;
}
-keepclasseswithmembernames class * {
@butterknife.* <methods>;
}
# rxjava
-keep class rx.schedulers.Schedulers {
public static <methods>;
}
-keep class rx.schedulers.ImmediateScheduler {
public <methods>;
}
-keep class rx.schedulers.TestScheduler {
public <methods>;
}
-keep class rx.schedulers.Schedulers {
public static ** test();
}
-keepclassmembers class rx.internal.util.unsafe.*ArrayQueue*Field* {
long producerIndex;
long consumerIndex;
}
-keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueProducerNodeRef {
long producerNode;
long consumerNode;
}
# Support library
-dontwarn android.support.**
-dontwarn android.support.v4.**
-keep class android.support.v4.** { *; }
-keep interface android.support.v4.** { *; }
-dontwarn android.support.v7.**
-keep class android.support.v7.** { *; }
-keep interface android.support.v7.** { *; }
# support design
-dontwarn android.support.design.**
-keep class android.support.design.** { *; }
-keep interface android.support.design.** { *; }
-keep public class android.support.design.R$* { *; }
# retrofit
-dontwarn okio.**
-keepattributes Signature
-keepattributes *Annotation*
-keep class com.squareup.okhttp.** { *; }
-keep interface com.squareup.okhttp.** { *; }
-dontwarn com.squareup.okhttp.**
-dontwarn rx.**
-dontwarn retrofit.**
-keep class retrofit.** { *; }
-keepclasseswithmembers class * {
@retrofit.http.* <methods>;
}
-keep class sun.misc.Unsafe { *; }
#your package path where your gson models are stored
-keep class com.abc.model.** { *; }
# Keep these for GSON and Jackson
-keepattributes Signature
-keepattributes *Annotation*
-keepattributes EnclosingMethod
-keep class sun.misc.Unsafe { *; }
-keep class com.google.gson.** { *; }
#keep otto
-keepattributes *Annotation*
-keepclassmembers class ** {
@com.squareup.otto.Subscribe public *;
@com.squareup.otto.Produce public *;
}
# Crashlitycs 2.+
-keep class com.crashlytics.** { *; }
-keep class com.crashlytics.android.**
-keepattributes SourceFile, LineNumberTable, *Annotation*
# If you are using custom exceptions, add this line so that custom exception types are skipped during obfuscation:
-keep public class * extends java.lang.Exception
# For Fabric to properly de-obfuscate your crash reports, you need to remove this line from your ProGuard config:
# -printmapping mapping.txt
# Picasso
-dontwarn com.squareup.okhttp.**
# Volley
-keep class com.android.volley.toolbox.ImageLoader { *; }
# OkHttp3
-keep class okhttp3.** { *; }
-keep interface okhttp3.** { *; }
-dontwarn okhttp3.**
# Needed for Parcelable/SafeParcelable Creators to not get stripped
-keepnames class * implements android.os.Parcelable {
public static final ** CREATOR;
}
Abilita ProGuard per la tua build
Per abilitare le configurazioni di ProGuard
per la tua applicazione devi abilitarlo nel tuo file gradle di livello del modulo. è necessario impostare il valore di minifyEnabled true
.
È inoltre possibile abilitare shrinkResources true
che rimuoverà le risorse contrassegnate da ProGuard
come non utilizzate.
buildTypes {
release {
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
Il codice sopra riportato applicherà le tue configurazioni ProGuard contenute in proguard-rules.pro
("proguard-project.txt" in Eclipse) al tuo apk rilasciato.
Per consentire di determinare in seguito la riga su cui si è verificata un'eccezione in una traccia stack, "proguard-rules.pro" deve contenere le seguenti righe:
-renamesourcefileattribute SourceFile
-keepattributes SourceFile,LineNumberTable
Per abilitare Proguard in Eclipse, aggiungere proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
a "project.properties"
Rimuovere le istruzioni di registrazione traccia (e altre) al momento della compilazione
Se vuoi rimuovere le chiamate a determinati metodi, supponendo che restituiscano nulla e che non abbiano effetti collaterali (come in, chiamarli non cambia alcun valore di sistema, argomenti di riferimento, statiche, ecc.) Allora puoi fare in modo che ProGuard li rimuova dal output dopo il completamento della compilazione.
Ad esempio, trovo questo utile nella rimozione delle istruzioni di registrazione debug / verbose utili nel debug, ma la produzione di stringhe per loro non è necessaria in produzione.
# Remove the debug and verbose level Logging statements.
# That means the code to generate the arguments to these methods will also not be called.
# ONLY WORKS IF -dontoptimize IS _NOT_ USED in any ProGuard configs
-assumenosideeffects class android.util.Log {
public static *** d(...);
public static *** v(...);
}
Nota: se -dontoptimize
viene utilizzato in qualsiasi configurazione di ProGuard in modo che non stia minimizzando / rimuovendo il codice inutilizzato, questo non eliminerà le dichiarazioni. (Ma chi non vorrebbe rimuovere il codice inutilizzato, giusto?)
Nota 2: questa chiamata rimuoverà la chiamata da registrare, ma non proteggerà il tuo codice. Le stringhe rimarranno effettivamente nell'apk generato. Leggi di più in questo post .
Proteggi il tuo codice dagli hacker
L'offuscamento è spesso considerato come una soluzione magica per la protezione del codice, rendendo più difficile capire il codice se viene mai decompilato dagli hacker.
Ma se stai pensando che rimuovere Log.x(..)
realtà rimuova le informazioni di cui hanno bisogno gli hacker, avrai una brutta sorpresa.
Rimozione di tutte le tue chiamate di registro con:
-assumenosideeffects class android.util.Log {
public static *** d(...);
...etc
}
rimuoverà effettivamente la chiamata Log stessa, ma di solito non le Stringhe che hai inserito.
Se, ad esempio, all'interno della tua registrazione, digiti un messaggio di log comune come: Log.d(MyTag,"Score="+score);
, il compilatore converte il +
in un 'nuovo StringBuilder ()' all'esterno della chiamata Log. ProGuard non cambia questo nuovo oggetto.
Il tuo codice de-compilato avrà ancora un StringBuilder
sospeso per "Score="
, aggiunto alla versione offuscata per la variabile score
(diciamo che è stata convertita in b
).
Ora l'hacker sa cosa è b
e ha senso del tuo codice.
Una buona pratica per rimuovere effettivamente questi residui dal tuo codice è o non metterli lì al primo posto (usa invece String formattatore, con le regole proguard per rimuoverli), o per avvolgere le tue chiamate di Log
con:
if (BuildConfig.DEBUG) {
Log.d(TAG,".."+var);
}
Mancia:
Verifica quanto è ben protetto il tuo codice offuscato decompilando te stesso!
Abilitazione di ProGuard con un file di configurazione di offuscamento personalizzato
ProGuard consente allo sviluppatore di offuscare, ridurre e ottimizzare il suo codice.
# 1 Il primo passo della procedura è di abilitare proguard sulla build .
Questo può essere fatto impostando il comando 'minifyEnabled' su true sulla build desiderata
# 2 Il secondo passo è specificare quali file proguard utilizziamo per la build data
Questo può essere fatto impostando la linea 'proguardFiles' con i nomi file appropriati
buildTypes {
debug {
minifyEnabled false
}
testRelease {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules-tests.pro'
}
productionRelease {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules-tests.pro', 'proguard-rules-release.pro'
}
}
# 3 Lo sviluppatore può quindi modificare il suo file proguard con le regole che desidera.
Ciò può essere fatto modificando il file (ad esempio 'proguard-rules-tests.pro') e aggiungendo i vincoli desiderati. Il seguente file serve come esempio di file proguard
// default & basic optimization configurations
-optimizationpasses 5
-dontpreverify
-repackageclasses ''
-allowaccessmodification
-optimizations !code/simplification/arithmetic
-keepattributes *Annotation*
-verbose
-dump obfuscation/class_files.txt
-printseeds obfuscation/seeds.txt
-printusage obfuscation/unused.txt // unused classes that are stripped out in the process
-printmapping obfuscation/mapping.txt // mapping file that shows the obfuscated names of the classes after proguad is applied
// the developer can specify keywords for the obfuscation (I myself use fruits for obfuscation names once in a while :-) )
-obfuscationdictionary obfuscation/keywords.txt
-classobfuscationdictionary obfuscation/keywords.txt
-packageobfuscationdictionary obfuscation/keywords.txt
Infine, ogni volta che lo sviluppatore esegue e / o genera il suo nuovo file .APK, verranno applicate le configurazioni proguard personalizzate in modo da soddisfare i requisiti.