Comment utiliser ProGuard dans Android Studio?

98

C'est mon premier projet dans Android Studio, et le code de mes applications n'est pas obscurci. J'utilise cette configuration dans le fichier build.gradle: entrez la description de l'image ici

J'utilise Build> Generate Signed APK ... avec le Run Proguard coché. Et, lorsque j'ai testé en utilisant Apk_OneClick.v4.2, mon code est complètement facile à lire:

entrez la description de l'image ici

Aidez-moi, s'il vous plaît. :(

Felipe Porge Xavier
la source
affichez vos règles proguard définies dans un fichier texte pour le code obscurcir.
pyus13
Comment vérifier si l'application est obscurcie ou non?
VVB
@VVB par ingénierie inverse fichier APK je suppose: D
hotHead

Réponses:

71

Vous ne signez probablement pas la version de version de l'APK via l'assistant de signature. Vous pouvez soit créer l'APK de version à partir de la ligne de commande avec la commande:

./gradlew assembleRelease

ou vous pouvez choisir la variante de version dans la vue Build Variants et la construire à partir de l'interface graphique:

Fenêtre principale de l'EDI montrant les variantes de construction

Scott Barta
la source
Génial! J'ai testé la modification du débogage en runProguard true et fonctionne parfaitement. Maintenant, j'ai lu votre réponse, et fonctionne !!!! Grand homme! Je vous remercie.
Felipe Porge Xavier
Oups, j'ai accidentellement mis "assembleDebug" au lieu de "assembleRelease" dans mes instructions de ligne de commande. J'ai fixé ma réponse.
Scott Barta
Quel est le chemin du fichier .apk exporté via la ligne de commande?
Shajeel Afzal
50

Vous pouvez configurer votre fichier build.gradle pour l'implémentation de proguard. Cela peut être au niveau du module ou au niveau du projet.

 buildTypes {

    debug {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'

    }

}

La configuration indiquée est pour le niveau de débogage, mais vous pouvez écrire vos propres versions de construction comme indiqué ci-dessous dans buildTypes:

    myproductionbuild{
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
    }

Mieux vaut avoir votre débogage avec minifyEnabled falseet productionbuild et autres builds comme minifyEnabled true.

Copiez votre fichier proguard-rules.txt à la racine de votre module ou dossier de projet comme

$YOUR_PROJECT_DIR\YoutProject\yourmodule\proguard-rules.txt

Vous pouvez modifier le nom de votre fichier comme vous le souhaitez. Après la configuration, utilisez l'une des trois options disponibles pour générer votre build selon le buildType

  1. Accédez à la tâche de gradation dans le panneau de droite et recherchez les assembleRelease/assemble(#your_defined_buildtype)tâches sous le module

  2. Accédez à la variante de construction dans le panneau de gauche et sélectionnez la version dans la liste déroulante

  3. Accédez au répertoire racine du projet dans l'Explorateur de fichiers et ouvrez cmd / terminal et exécutez

Linux ./gradlew assembleRelease or assemble(#your_defined_buildtype)

les fenêtres gradlew assembleRelease or assemble(#your_defined_buildtype)

Vous pouvez trouver apk dans votre répertoire module / build.

Plus d'informations sur la configuration et l'emplacement des fichiers proguard sont disponibles sur le lien

http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Running-ProGuard

pyus13
la source
Où puis-je dire d'utiliser le myproductionbuild?
Felipe Porge Xavier
oui, vous avez raison :) vous pouvez voir la même chose dans l'onglet Variante de construction sur le panneau de gauche.
pyus13
Mais apk n'a pas obscurcir ... :(
Felipe Porge Xavier
avez-vous écrit la configuration dans proguard-rule.txt voir quelques exemples ici proguard.sourceforge.net/index.html#manual/examples.html
pyus13
Je n'ai pas trouvé la méthode Gradle DSL runProguard ().
SleepNot
41

NB: Maintenant au lieu de

runProguard false

vous devrez utiliser

minifyEnabled false
ViliusK
la source
5
suppose que cela devrait être
défini
1

Essayez de renommer votre fichier 'proguard-rules.txt' en 'proguard-android.txt' et supprimez la référence à 'proguard-rules.txt' dans votre fichier gradle. L' getDefaultProguardFile(...)appel fait référence à un autre fichier proguard par défaut, celui fourni par Google et non celui de votre projet. Alors supprimez-le également, de sorte qu'ici le fichier gradle se lit comme suit:

buildTypes {
    release {
        runProguard true
        proguardFile 'proguard-android.txt'
    }
}
SK9
la source
Ne travaille pas pour moi. J'ai mis mon proguard-android.txt personnalisé dans le même répertoire par proguard-rules.txt, mais rien n'a changé dans mon code.
Felipe Porge Xavier
0

Les autres réponses ici sont d'excellentes références sur l'utilisation de proguard. Cependant, je n'ai pas vu de problème discuté que j'ai rencontré et qui était un esprit pliant. Une fois que vous avez généré une version signée .apk, elle est placée dans le /releasedossier de votre application, mais mon application avait un apk qui n'était pas dans le /releasedossier. Par conséquent, j'ai passé des heures à décompiler le mauvais apk à me demander pourquoi mes modifications proguard n'avaient aucun effet. J'espère que cela aide quelqu'un!

mikeLundquist
la source
0

Voici quelques-unes des règles Proguard les plus courantes que vous devez ajouter dans le fichier proguard-rules.pro dans Android Sutdio.

Couteau à beurre

 -keep class butterknife.** { *; }
 -dontwarn butterknife.internal.**
 -keep class **$$ViewBinder { *; }
 -keepclasseswithmembernames class * {
        @butterknife.* <fields>;
  }
 -keepclasseswithmembernames class * {
        @butterknife.* <methods>;
  }

Rénovation

 -dontwarn retrofit.**
 -keep class retrofit.** { *; }
 -keepattributes Signature
 -keepattributes Exceptions

OkHttp3

 -keepattributes Signature
 -keepattributes *Annotation*
 -keep class okhttp3.** { *; }
 -keep interface okhttp3.** { *; }
 -dontwarn okhttp3.** 
 -keep class sun.misc.Unsafe { *; }
 -dontwarn java.nio.file.*
 -dontwarn org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement 

Gson

 -keep class sun.misc.Unsafe { *; }
 -keep class com.google.gson.stream.** { *; }

Obscurcissement du code

-keepclassmembers class com.yourname.models** { <fields>; }
Bhavik Nathani
la source