Android
ProGuard - Verschleiern und Verkleinern Ihres Codes
Suche…
Regeln für einige der weit verbreiteten Bibliotheken
Derzeit enthält es Regeln für folgende Bibliotheken: -
- Buttermesser
- RxJava
- Android-Support-Bibliothek
- Android Design-Unterstützungsbibliothek
- Nachrüstung
- Gson und Jackson
- Otto
- Crashlitycs
- Picasso
- Volley
- OkHttp3
- Paketierbar
#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;
}
Aktivieren Sie ProGuard für Ihren Build
Um ProGuard
Konfigurationen für Ihre Anwendung zu aktivieren, müssen Sie sie in Ihrer Modullevel-Datei aktivieren. Sie müssen den Wert von minifyEnabled true
.
Sie können auch shrinkResources true
, um Ressourcen zu entfernen, die ProGuard
als nicht verwendet markiert.
buildTypes {
release {
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
Der obige Code wird Ihre ProGuard-Konfigurationen, die in proguard-rules.pro
("proguard-project.txt" in Eclipse) enthalten sind, auf Ihre freigegebene apk- proguard-rules.pro
anwenden.
Damit Sie später feststellen können, in welcher Zeile eine Ausnahme in einem Stack-Trace aufgetreten ist, sollte "proguard-rules.pro" folgende Zeilen enthalten:
-renamesourcefileattribute SourceFile
-keepattributes SourceFile,LineNumberTable
Um Proguard in Eclipse zu aktivieren, fügen Sie proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
zu "project.properties" hinzu.
Entfernen Sie die Traceprotokollierungsanweisungen (und andere Anweisungen) während der Erstellung
Wenn Sie Aufrufe bestimmter Methoden entfernen möchten, vorausgesetzt, dass sie ungültig sind und keine Nebeneffekte haben (z. B. werden durch das Aufrufen keine Systemwerte, Referenzargumente, Statik usw. geändert), können Sie sie von ProGuard aus dem System entfernen Ausgabe nachdem der Build abgeschlossen ist.
Ich halte dies beispielsweise für das Entfernen von Anweisungen zum Debuggen / Verbose-Protokollieren hilfreich, die beim Debuggen hilfreich sind, aber das Generieren der Zeichenfolgen für sie ist in der Produktion nicht erforderlich.
# 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(...);
}
Hinweis: Wenn -dontoptimize
in einer ProGuard-Konfiguration verwendet wird, um nicht verwendeten Code nicht zu minimieren bzw. zu entfernen, werden die Anweisungen dadurch nicht entfernt. (Aber wer möchte nicht ungenutzten Code entfernen, oder?)
Hinweis 2: Durch diesen Aufruf wird der Anruf zum Protokollieren entfernt, der Code wird jedoch nicht geschützt. Die Strings bleiben tatsächlich im generierten apk. Lesen Sie mehr in diesem Beitrag .
Schützen Sie Ihren Code vor Hackern
Verschleierung wird oft als eine magische Lösung für den Codeschutz angesehen, indem Ihr Code schwieriger zu verstehen ist, wenn er jemals von Hackern dekompiliert wird.
Wenn Sie jedoch der Log.x(..)
sind, dass das Entfernen von Log.x(..)
tatsächlich die Informationen entfernt, die die Hacker benötigen, werden Sie eine böse Überraschung Log.x(..)
.
Entfernen Sie alle Ihre Loganrufe mit:
-assumenosideeffects class android.util.Log {
public static *** d(...);
...etc
}
entfernt zwar den Log-Aufruf selbst, aber normalerweise nicht die Strings, die Sie in sie einfügen.
Wenn Sie beispielsweise innerhalb Ihres Protokollaufrufs eine allgemeine Protokollnachricht Log.d(MyTag,"Score="+score);
z. Log.d(MyTag,"Score="+score);
.: Log.d(MyTag,"Score="+score);
Der Compiler konvertiert das +
außerhalb des Log-Aufrufs in einen neuen StringBuilder (). ProGuard ändert dieses neue Objekt nicht.
Ihr dekompilierter Code enthält weiterhin einen hängenden StringBuilder
für "Score="
, an den die verschleierte Version für die score
Variable angehängt ist (angenommen, er wurde in b
konvertiert).
Jetzt weiß der Hacker, was b
, und macht seinen Code verständlich.
Um diese Residuen tatsächlich aus Ihrem Code zu entfernen, sollten Sie sie entweder gar nicht erst dort ablegen (Verwenden Sie stattdessen String-Formatierungsprogramm mit Proguard-Regeln, um sie zu entfernen) oder um Ihre Log
Aufrufe mit folgenden Elementen zu versehen:
if (BuildConfig.DEBUG) {
Log.d(TAG,".."+var);
}
Spitze:
Testen Sie, wie gut Ihr verschleierter Code geschützt ist, indem Sie ihn selbst dekompilieren!
Aktivieren von ProGuard mit einer benutzerdefinierten Verschleierungskonfigurationsdatei
Mit ProGuard kann der Entwickler seinen Code verschleiern, verkleinern und optimieren.
# 1 Der erste Schritt des Verfahrens besteht darin, Proguard beim Build zu aktivieren .
Dies kann durch Setzen des Befehls 'minifyEnabled' für den gewünschten Build auf true gesetzt werden
# 2 Als zweiten Schritt müssen Sie angeben, welche Proguard-Dateien für den angegebenen Build verwendet werden
Dies kann durch Setzen der 'ProguardFiles'-Zeile mit den richtigen Dateinamen erfolgen
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 Der Entwickler kann dann seine Proguard-Datei mit den von ihm gewünschten Regeln bearbeiten.
Dies kann durch Bearbeiten der Datei (z. B. 'proguard-rules-tests.pro') und Hinzufügen der gewünschten Nebenbedingungen erfolgen. Die folgende Datei dient als Beispiel für eine Proguard-Datei
// 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
Immer wenn der Entwickler seine neue .APK-Datei ausführt und / oder generiert, werden die benutzerdefinierten Proguard-Konfigurationen angewendet, um die Anforderungen zu erfüllen.