Android
ProGuard - zaciemnianie i zmniejszanie kodu
Szukaj…
Reguły dla niektórych powszechnie używanych bibliotek
Obecnie zawiera reguły dla następujących bibliotek: -
- Nóż do masła
- RxJava
- Biblioteka obsługi Androida
- Biblioteka obsługi projektu Android
- Modernizacja
- Gson i Jackson
- Otto
- Crashlitycs
- Picasso
- Salwa
- OkHttp3
- Paczka
#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;
}
Włącz ProGuard dla swojej kompilacji
Aby ProGuard
konfiguracje ProGuard
dla swojej aplikacji, musisz włączyć ją w pliku ocen poziomu modułu. musisz ustawić wartość minifyEnabled true
.
Możesz także włączyć shrinkResources true
co usunie zasoby, które ProGuard
jako nieużywane.
buildTypes {
release {
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
Powyższy kod zastosuje twoje konfiguracje ProGuard zawarte w proguard-rules.pro
(„proguard-project.txt” w Eclipse) do twojej wydanej aplikacji.
Aby umożliwić późniejsze określenie linii, w której wystąpił wyjątek w śladzie stosu, plik „proguard-rules.pro” powinien zawierać następujące linie:
-renamesourcefileattribute SourceFile
-keepattributes SourceFile,LineNumberTable
Aby włączyć Proguard w środowisku Eclipse, dodaj proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
do „ proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
”
Usuń instrukcje rejestrowania śledzenia (i inne) podczas kompilacji
Jeśli chcesz usunąć wywołania niektórych metod, zakładając, że zwrócą one nieważność i nie będą miały żadnych skutków ubocznych (jak w wywołaniu ich nie zmienia żadnych wartości systemowych, argumentów referencyjnych, statyki itp.), Możesz poprosić ProGuard o usunięcie ich z wyjście po zakończeniu kompilacji.
Na przykład uważam, że jest to przydatne w usuwaniu instrukcji debugowania / pełnego rejestrowania przydatnych w debugowaniu, ale generowanie ciągów dla nich jest niepotrzebne w produkcji.
# 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(...);
}
Uwaga: Jeśli w dowolnej konfiguracji -dontoptimize
zostanie użyta opcja -dontoptimize, aby nie minimalizować / usuwać nieużywanego kodu, nie spowoduje to usunięcia instrukcji. (Ale kto nie chciałby usunąć nieużywanego kodu, prawda?)
Uwaga 2: to połączenie usunie połączenie do zalogowania, ale nie ochroni twojego kodu. Ciągi pozostaną w wygenerowanym apk. Przeczytaj więcej w tym poście .
Ochrona twojego kodu przed hakerami
Zaciemnianie jest często uważane za magiczne rozwiązanie do ochrony kodu, ponieważ utrudnia zrozumienie kodu, jeśli hakery go zdekompilują.
Ale jeśli myślisz, że usunięcie Log.x(..)
faktycznie usuwa informacje potrzebne hakerom, będziesz miał nieprzyjemną niespodziankę.
Usuwanie wszystkich wywołań dziennika za pomocą:
-assumenosideeffects class android.util.Log {
public static *** d(...);
...etc
}
rzeczywiście usunie samo wywołanie dziennika, ale zazwyczaj nie będzie w nich wprowadzanych ciągów.
Jeśli na przykład w wywołaniu dziennika zostanie Log.d(MyTag,"Score="+score);
wspólny komunikat dziennika, taki jak: Log.d(MyTag,"Score="+score);
, kompilator konwertuje znak +
na „nowy StringBuilder ()” poza wywołaniem dziennika. ProGuard nie zmienia tego nowego obiektu.
Twój zdekompilowany kod nadal będzie miał wiszący StringBuilder
dla "Score="
, dołączony do zaciemnionej wersji zmiennej score
(powiedzmy, że został przekonwertowany na b
).
Teraz haker wie, co to jest b
, i rozumie twój kod.
Dobrą praktyką, aby faktycznie usunąć te resztki z kodu, jest albo nie umieszczanie ich tam na pierwszym miejscu (zamiast tego użyj formatyzatora ciągów, z regułami proguard, aby je usunąć) lub zawinąć wywołania Log
:
if (BuildConfig.DEBUG) {
Log.d(TAG,".."+var);
}
Wskazówka:
Sprawdź, jak dobrze chroniony jest twój zaciemniony kod, samodzielnie go dekompilując!
Włączanie ProGuard z niestandardowym plikiem konfiguracyjnym zaciemniania
ProGuard pozwala programistom zaciemniać, zmniejszać i optymalizować swój kod.
# 1 Pierwszym krokiem procedury jest włączenie proguarda w kompilacji .
Można to zrobić, ustawiając dla polecenia „minifyEnabled” wartość true dla żądanej wersji
# 2 Drugim krokiem jest określenie, jakich plików proguard używamy dla danej kompilacji
Można tego dokonać, ustawiając linię „proguardFiles” z poprawnymi nazwami plików
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 Deweloper może następnie edytować swój plik proguard zgodnie z zasadami, których pragnie.
Można to zrobić, edytując plik (na przykład „proguard-rules-tests.pro”) i dodając pożądane ograniczenia. Poniższy plik służy jako przykładowy plik 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
Wreszcie, za każdym razem, gdy programista uruchomi i / lub wygeneruje swój nowy plik .APK, zastosowane zostaną niestandardowe konfiguracje proguard, spełniając w ten sposób wymagania.