Android
ProGuard - Fördunkla och krympa din kod
Sök…
Regler för några av de allmänt använda biblioteken
För närvarande innehåller det regler för följande bibliotek: -
- Smörkniv
- RxJava
- Android Support Library
- Android Design Support Library
- Retrofit
- Gson och Jackson
- otto
- Crashlitycs
- Picasso
- Volley
- 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;
}
Aktivera ProGuard för din build
För att aktivera ProGuard
konfigurationer för din applikation måste du aktivera den i din modulnivågradfil. du måste ställa in värdet på minifyEnabled true
.
Du kan också aktivera shrinkResources true
som tar bort resurser som ProGuard
markerar som oanvända.
buildTypes {
release {
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
Ovanstående kod kommer att tillämpa dina ProGuard-konfigurationer som finns i proguard-rules.pro
("proguard-project.txt" i Eclipse) på din släppta apk.
För att du senare ska kunna bestämma den rad som ett undantag inträffade i en stapelspårning bör "proguard-rules.pro" innehålla följande rader:
-renamesourcefileattribute SourceFile
-keepattributes SourceFile,LineNumberTable
För att aktivera Proguard i Eclipse lägger du till proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
till "project.properties"
Ta bort spårloggning (och andra) uttalanden vid byggtiden
Om du vill ta bort samtal till vissa metoder, förutsatt att de återgår ogiltiga och inte har några sidoeffekter (som om, att ringa dem inte ändrar några systemvärden, referensargument, statistik etc.) kan du låta ProGuard ta bort dem från efter att byggandet är slutfört.
Till exempel tycker jag att detta är användbart när jag tar bort felsöknings- / ordboksloggar som är användbart vid felsökning, men det är onödigt att producera strängarna för dem.
# 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(...);
}
Obs: Om -dontoptimize
används i någon ProGuard-konfiguration så att den inte minifierar / tar bort oanvänd kod, kommer detta inte att rensa uttalandena. (Men vem skulle inte vilja ta bort oanvänd kod, eller hur?)
Obs2: detta samtal tar bort samtalet för att logga, men skyddar inte koden. Strängarna kommer faktiskt att förbli i den genererade apk. Läs mer i det här inlägget .
Skydda din kod från hackare
Förmörkelse betraktas ofta som en magisk lösning för kodskydd genom att göra din kod svårare att förstå om den någonsin blir avkompilerad av hackare.
Men om du funderar på att ta bort Log.x(..)
faktiskt tar bort informationen som hackarna behöver, kommer du att få en otäck överraskning.
Ta bort alla dina loggsamtal med:
-assumenosideeffects class android.util.Log {
public static *** d(...);
...etc
}
kommer verkligen att ta bort själva loggsamtalet, men vanligtvis inte de strängar du lägger in dem.
Om du till exempel skriver in ett vanligt Log.d(MyTag,"Score="+score);
som: Log.d(MyTag,"Score="+score);
, omvandlar kompilatorn +
till en 'ny StringBuilder ()' utanför loggsamtalet. ProGuard ändrar inte det nya objektet.
Din de-kompilerad kod kommer fortfarande att ha en hängande StringBuilder
för "Score="
, bifogas med förvanskad version för score
variabel (låt oss säga att det omvandlades till b
).
Nu vet hackaren vad som är b
, och gör känslan av din kod.
En bra praxis för att faktiskt ta bort dessa rester från din kod är att antingen inte lägga dem där i första hand (använd strängarformat istället, med proguardregler för att ta bort dem), eller att radera dina Log
med:
if (BuildConfig.DEBUG) {
Log.d(TAG,".."+var);
}
Dricks:
Testa hur väl skyddad din dolda kod är genom att ta bort den själv!
Aktivera ProGuard med en anpassad obfusk-konfigurationsfil
ProGuard tillåter utvecklaren att fördunkla, krympa och optimera sin kod.
# 1 Det första steget i proceduren är att aktivera proguard på build .
Detta kan göras genom att ställa in kommandot 'minifyEnabled' till true på önskad build
# 2 Det andra steget är att specificera vilka proguardfiler vi använder för den givna builden
Detta kan göras genom att ställa in 'proguardFiles' -raden med rätt filnamn
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 Utvecklaren kan sedan redigera sin proguard-fil med de regler han önskar.
Det kan göras genom att redigera filen (till exempel 'proguard-rules-tests.pro') och lägga till önskade begränsningar. Följande fil fungerar som ett exempel på proguard-fil
// 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
Slutligen, när utvecklaren kör och / eller genererar sin nya .APK-fil, kommer de anpassade proguardkonfigurationerna att tillämpas och därmed uppfylla kraven.