Wie verwende ich den ProGuard in Android Studio?

98

Dies ist mein erstes Projekt in Android Studio, und der Code meiner Apps ist nicht verschleiert. Ich verwende diese Konfiguration in der Datei build.gradle: Geben Sie hier die Bildbeschreibung ein

Ich verwende die Build> Generate Signed APK ... mit aktiviertem Run Proguard. Und wenn ich mit Apk_OneClick.v4.2 getestet habe, ist mein Code völlig einfach zu lesen:

Geben Sie hier die Bildbeschreibung ein

Bitte hilf mir. :(

Felipe Porge Xavier
quelle
Zeigen Sie Ihre Proguard-Regeln an, die in der Textdatei für verschleierten Code definiert sind.
Pyus13
Wie überprüfe ich, ob die App verschleiert ist oder nicht?
VVB
@VVB durch Reverse Engineering APK-Datei Ich denke: D
hotHead

Antworten:

71

Wahrscheinlich signieren Sie den Release-Build der APK nicht über den Signatur-Assistenten. Sie können die Release-APK entweder über die Befehlszeile mit dem folgenden Befehl erstellen:

./gradlew assembleRelease

Oder Sie können die Release-Variante in der Ansicht " Varianten erstellen" auswählen und über die GUI erstellen:

IDE-Hauptfenster mit Build-Varianten

Scott Barta
quelle
Toll! Ich habe getestet, das Debug in runProguard true zu ändern und funktioniert einwandfrei. Jetzt lese ich deine Antwort und arbeite !!!! Großartiger Mann! Danke dir.
Felipe Porge Xavier
Hoppla, ich habe versehentlich "assembleDebug" anstelle von "assembleRelease" in meine Befehlszeilenanweisungen eingefügt. Ich habe meine Antwort korrigiert.
Scott Barta
Wie lautet der Pfad der APK-Datei, die über die Befehlszeile exportiert wird?
Shajeel Afzal
50

Sie können Ihre build.gradle-Datei für die Proguard-Implementierung konfigurieren. Dies kann auf Modulebene oder auf Projektebene erfolgen.

 buildTypes {

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

    }

}

Die gezeigte Konfiguration ist für die Debug-Ebene, aber Sie können Ihre eigenen Build-Varianten wie unten gezeigt in buildTypes schreiben:

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

Besser, Sie haben Ihr Debugging mit minifyEnabled falseund Productionbuild und andere Builds als minifyEnabled true.

Kopieren Sie Ihre Datei proguard-rules.txt in das Stammverzeichnis Ihres Moduls oder Projektordners wie

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

Sie können den Namen Ihrer Datei beliebig ändern. Verwenden Sie nach der Konfiguration eine der drei verfügbaren Optionen, um Ihren Build gemäß buildType zu generieren

  1. Gehen Sie im rechten Bereich zur Gradle-Aufgabe und suchen Sie assembleRelease/assemble(#your_defined_buildtype)unter Modulaufgaben nach

  2. Gehen Sie im linken Bereich zu Build-Variante und wählen Sie den Build aus der Dropdown-Liste aus

  3. Wechseln Sie im Datei-Explorer zum Projektstammverzeichnis, öffnen Sie cmd / terminal und führen Sie es aus

Linux ./gradlew assembleRelease or assemble(#your_defined_buildtype)

Windows gradlew assembleRelease or assemble(#your_defined_buildtype)

Sie finden apk in Ihrem Modul- / Build-Verzeichnis.

Weitere Informationen zum Speicherort der Konfigurations- und Proguard-Dateien finden Sie unter dem Link

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

pyus13
quelle
Wo kann ich sagen, dass ich myproductionbuild verwenden soll?
Felipe Porge Xavier
ya, du bist richtig :) du kannst dasselbe auf der Registerkarte Build Variant auf der linken Seite sehen.
Pyus13
Aber apk haben nicht verschleiert ... :(
Felipe Porge Xavier
Haben Sie die Konfiguration in proguard-rule.txt geschrieben? Sehen Sie hier einige Beispiele. proguard.sourceforge.net/index.html#manual/examples.html
pyus13
Ich habe Gradle DSL-Methode runProguard () nicht gefunden.
SleepNot
41

NB.: Jetzt statt

runProguard false

Sie müssen verwenden

minifyEnabled false
ViliusK
quelle
5
denke, es sollte auf true gesetzt werden
anna_manzhula
1

Versuchen Sie, Ihre Datei 'proguard-rules.txt' in 'proguard-android.txt' umzubenennen, und entfernen Sie den Verweis auf 'proguard-rules.txt' in Ihrer Gradle-Datei. Der getDefaultProguardFile(...)Aufruf verweist auf eine andere Standard-Proguard-Datei, die von Google bereitgestellt wird und nicht auf die in Ihrem Projekt. Entfernen Sie dies also ebenfalls, damit hier die Gradle-Datei lautet:

buildTypes {
    release {
        runProguard true
        proguardFile 'proguard-android.txt'
    }
}
SK9
quelle
Arbeite nicht für mich. Ich habe meine benutzerdefinierte proguard-android.txt mit proguard-rules.txt in dasselbe Verzeichnis gestellt, aber an meinem Code hat sich nichts geändert.
Felipe Porge Xavier
0

Die anderen Antworten hier sind großartige Referenzen zur Verwendung von Proguard. Ich habe jedoch kein besprochenes Problem gesehen, auf das ich gestoßen bin, das ein Geisteskranker war. Nachdem Sie eine signierte Version .apk generiert haben, wird sie in den /releaseOrdner Ihrer App verschoben, aber meine App hatte eine apk, die sich nicht im /releaseOrdner befand. Daher habe ich Stunden damit verbracht, die falsche Apk zu dekompilieren und mich zu fragen, warum meine Proguard-Änderungen keine Auswirkungen hatten. Hoffe das hilft jemandem!

mikeLundquist
quelle
0

Hier sind einige der häufigsten Proguard-Regeln, die Sie in der Datei proguard-rules.pro in Android Sutdio hinzufügen müssen.

Buttermesser

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

Nachrüstung

 -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.** { *; }

Code-Verschleierung

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