Android
ProGuard - Obscurcir et réduire votre code
Recherche…
Règles pour certaines des bibliothèques les plus utilisées
Actuellement, il contient des règles pour les bibliothèques suivantes: -
- Couteau à beurre
- RxJava
- Bibliothèque de support Android
- Bibliothèque de support de conception Android
- Rénovation
- Gson et Jackson
- Otto
- Crashlitycs
- Picasso
- Volée
- 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;
}
Activer ProGuard pour votre build
Pour activer les configurations ProGuard
pour votre application, vous devez l'activer dans votre fichier de gradation au niveau du module. vous devez définir la valeur de minifyEnabled true
.
Vous pouvez également activer shrinkResources true
ce qui supprimera les ressources ProGuard
utilisées par ProGuard.
buildTypes {
release {
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
Le code ci-dessus appliquera vos configurations ProGuard contenues dans proguard-rules.pro
("proguard-project.txt" dans Eclipse) à votre apk publié.
Pour vous permettre de déterminer ultérieurement la ligne sur laquelle une exception s'est produite dans une trace de pile, "proguard-rules.pro" doit contenir les lignes suivantes:
-renamesourcefileattribute SourceFile
-keepattributes SourceFile,LineNumberTable
Pour activer Proguard dans Eclipse, ajoutez proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
à "project.properties".
Supprimer les instructions de journalisation de trace (et autres) au moment de la génération
Si vous voulez supprimer les appels à certaines méthodes, en supposant qu'elles soient vides et sans effets secondaires (comme les appeler ne modifie aucune valeur système, argument de référence, statique, etc.), vous pouvez demander à ProGuard de les supprimer. sortie après la construction est terminée.
Par exemple, je trouve cela utile pour supprimer les instructions de journalisation / débogage utiles au débogage, mais il est inutile de générer les chaînes pour la production.
# 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(...);
}
Remarque: Si -dontoptimize
est utilisé dans une configuration ProGuard afin de ne pas minimiser / supprimer le code inutilisé, cela ne supprimera pas les instructions. (Mais qui ne voudrait pas supprimer le code inutilisé, non?)
Note 2: cet appel supprime l'appel à enregistrer, mais ne vous protège pas du code. Les chaînes resteront dans l'apk généré. Lire plus dans cet article .
Protéger votre code contre les pirates
L'obscurcissement est souvent considéré comme une solution magique pour la protection du code, en rendant votre code plus difficile à comprendre s'il est compilé par des pirates.
Mais si vous pensez que la suppression de Log.x(..)
supprime réellement les informations dont les pirates ont besoin, vous aurez une mauvaise surprise.
Supprimer tous vos appels de journal avec:
-assumenosideeffects class android.util.Log {
public static *** d(...);
...etc
}
va effectivement supprimer l'appel de journal lui-même, mais généralement pas les chaînes que vous y mettez.
Si, par exemple, dans votre journal, vous tapez un message de journal commun tel que: Log.d(MyTag,"Score="+score);
, le compilateur convertit le +
en 'new StringBuilder ()' en dehors de l'appel du journal. ProGuard ne change pas ce nouvel objet.
Votre code décompilé aura toujours un StringBuilder
pour "Score="
, ajouté à la version obscurcie de la variable score
(supposons qu'il ait été converti en b
).
Maintenant, le pirate sait ce qu'est le b
et donne un sens à votre code.
Une bonne pratique pour supprimer réellement ces résidus de votre code est de ne pas les y placer en premier lieu (utilisez plutôt le formateur de chaînes avec des règles proguard pour les supprimer), ou envelopper vos appels de Log
avec:
if (BuildConfig.DEBUG) {
Log.d(TAG,".."+var);
}
Pointe:
Testez la protection de votre code obscur en la décompilant vous-même!
Activation de ProGuard avec un fichier de configuration d'obscurcissement personnalisé
ProGuard permet au développeur de masquer, réduire et optimiser son code.
# 1 La première étape de la procédure consiste à activer le proguard sur la construction .
Cela peut être fait en définissant la commande 'minifyEnabled' sur true sur la construction de votre choix.
# 2 La deuxième étape consiste à spécifier les fichiers proguard que nous utilisons pour la construction donnée
Cela peut être fait en définissant la ligne 'proguardFiles' avec les noms de fichiers appropriés
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 Le développeur peut alors éditer son fichier proguard avec les règles qu'il souhaite.
Cela peut être fait en éditant le fichier (par exemple «proguard-rules-tests.pro») et en ajoutant les contraintes souhaitées. Le fichier suivant sert d'exemple de fichier 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
Enfin, chaque fois que le développeur exécute et / ou génère son nouveau fichier .APK, les configurations proguard personnalisées seront appliquées, répondant ainsi aux exigences.