Ist es möglich, Proguard im Debug-Modus zu verwenden?

77

In meiner Android App möchte ich einige Funktionen mit eingeschaltetem Proguard testen.

Ich muss es nicht wirklich "debuggen", aber ich möchte, dass Proguard ausgeführt wird, wenn ich in Eclipse auf "Ausführen" drücke. Ich möchte die Binärdatei nicht jedes Mal exportieren (also im Release-Modus) und als apk speichern und zum Testen auf das Gerät bringen.

Gibt es eine Möglichkeit, Proguard auf diese Weise auszuführen?

Aktualisieren:

Dies scheint möglich zu sein, wenn Sie Eclipse nicht verwenden . Da der Fragentitel Eclipse nicht enthält, gibt es mehrere richtige Antworten auf diese Frage.

fränkisch
quelle
1
Vielleicht möchten Sie die akzeptierte Antwort hier ändern, da alle, einschließlich des Posters, zustimmen, dass es falsch ist, aber sie werden es nicht löschen
Michael Mrozek
Tank dich. Ich werde die Frage aktualisieren. Die aktuelle Antwort ist für Eclipse korrekt, der Fragentitel enthält jedoch nicht Eclipse. Andere Antworten sind für andere IDEs als Eclipse korrekt.
Frankish

Antworten:

44

Alte Antwort:

http://developer.android.com/tools/help/proguard.html

ProGuard wird nur ausgeführt, wenn Sie Ihre Anwendung im Release-Modus erstellen. Sie müssen sich also nicht mit verschleiertem Code befassen, wenn Sie Ihre Anwendung im Debug-Modus erstellen.

Wenn Sie Ihre Anwendung im Release- Modus erstellen , indem Sie entweder Ant Release ausführen oder den Export-Assistenten in Eclipse verwenden, überprüft das Build-System automatisch, ob die proguard.configEigenschaft festgelegt ist. Wenn dies der Fall ist, verarbeitet ProGuard automatisch den Bytecode der Anwendung, bevor alles in eine APK- Datei gepackt wird. Das Erstellen im Debug-Modus ruft ProGuard nicht auf, da das Debuggen dadurch umständlicher wird.

Update: 13-3-2016

Dies ist mit dem neuen Gradle-Build-System möglich. Sie müssen Set minifyEnabledzu trueIhrer build.gradle Datei. Im Allgemeinen läuft Pro-Guard im Release- Modus. Es stehen andere Optionen zur Verfügung, z. B. das Verkleinern von Ressourcen. Sie finden einige nützliche Informationen unter http://tools.android.com/tech-docs/new-build-system

Schauen Sie sich auch @ an

http://developer.android.com/tools/building/configuring-gradle.html

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

        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
   }
 }
Raghunandan
quelle
4
Aber gibt es einen Weg? Ich akzeptiere es als umständlich. Ich brauche den verschleierten Code nicht, aber ich werde die Verarbeitungsleistung von proguard verwenden, um Protokollfunktionen usw. gemäß der Konfigurationsdatei zu entfernen.
Frankish
@frankish nach dem, was der Doc sagt, ist es ein Nein. Ich kenne jedoch keinen alternativen Weg. Zitat aus doc "ProGuard wird nur ausgeführt, wenn Sie Ihre Anwendung im Release-Modus erstellen". Nach dieser Aussage ist es ein gerades Nein
Raghunandan
9
Sie sollten Ihre Antwort löschen, fair zu anderen sein. Es ist irreführend.
Radu
1
Diese Antwort scheint immer noch richtig zu sein, wenn Sie Eclipse verwenden. Andere Antworten sind ebenfalls korrekt, jedoch nur, wenn Sie Eclipse nicht verwenden. Es ist schwierig, die akzeptierte Antwort zu ändern und den Inhalt und den Titel der Frage in diesem Moment zu bearbeiten, da diese Frage und ihre Antworten viele Informationen enthalten.
Frankish
@frankish Sie können den Beitrag jederzeit bearbeiten, wenn Sie der Meinung sind, dass er mit besseren Informationen bearbeitet werden muss
Raghunandan
73

Wenn Sie den gesamten Erstellungsprozess für Sie vereinfachen möchten, sollten Sie zu Gradle und Android Studio IDE wechseln.

Dann können Sie Ihrer build.gradle-Datei ganz einfach Folgendes hinzufügen, um ProGuard auszuführen:

android {
    buildTypes {
        release {
        }
        debug {
            minifyEnabled true
            proguardFile 'proguard-android.txt'
            zipAlignEnabled true
        }
    }
}

Dadurch wird ProGuard auf Ihrem Debug-Build ausgeführt, der mit der Datei "proguard-android.txt" konfiguriert ist, die im Stammordner Ihres Projekts abgelegt werden soll. Außerdem wird Ihre apk zip-ausgerichtet (entfernen Sie einfach "zipAlignEnabled true", wenn Sie nicht möchten, dass dies geschieht). Wenn Sie dasselbe für Ihren Release-Build tun möchten, fügen Sie einfach diese drei Zeilen unter "Release" hinzu.

Etwas abseits des Themas: Dinge wie das Hinzufügen von Abhängigkeiten, das Signieren Ihrer apk oder das Hinzufügen anderer benutzerdefinierter Aufgaben zu Ihrem Erstellungsprozess sind mit gradle ebenfalls viel unkomplizierter. Darüber hinaus können Sie Ihre apk nicht nur über die Android Studio IDE erstellen, sondern auch über einen einfachen Befehl in der Befehlszeile (z. B. ./gradlew assembleDebug). Wenn Sie also in einem Team arbeiten, ist der Einrichtungsprozess für neue Mitglieder nur einen "./gradlew assembleDebug" entfernt. Ohne dass eine IDE-Konfiguration erforderlich ist. Das Importieren Ihres Projekts einschließlich aller Abhängigkeiten ist so einfach wie ein Ein-Klick-Vorgang

BEARBEITEN: Ab Gradle Android Build Tools Version 0.14.0 haben sich die Eigenschaftsnamen geändert ( http://tools.android.com/tech-docs/new-build-system ):

  • BuildType.runProguard -> minifyEnabled
  • BuildType.zipAlign -> zipAlignEnabled

Ich habe den obigen Code aktualisiert.

MrMaffen
quelle
Danke @MrMaffen! Es ist viel einfacher, diesen Weg zu gehen.
Jake Stoeffler
2
Android Studio richtet Ihre APK automatisch aus. : developer.android.com/studio/command-line/zipalign.html
Daniel Storm
11

In Bezug auf benutzerdefinierte Ant-Builds (und basierend auf Victors Antwort) funktioniert das Hinzufügen der folgenden Dateien zu meiner build.xml-Datei für mich:

<target name="-debug-obfuscation-check">
    <!-- enable proguard even in debug mode -->
    <property name="proguard.enabled" value="true"/>

    <!-- Secondary dx input (jar files) is empty since all the jar files will be in the obfuscated jar -->
    <path id="out.dex.jar.input.ref" />
</target>

Beachten Sie, dass ich die Datei out.dex.jar.input.ref überschreiben (tatsächlich voreingestellt) musste. Andernfalls wird bei der späteren Ausführung von dx versucht, nicht disjunkte Jars zusammenzuführen und die DexException auszulösen: Mehrere Dex-Dateien definieren Xxx.

Jo Jo
quelle
7

Es ist möglich, wenn Sie mit Ant bauen. Siehe Android Maßarbeit mit Ant , wie Sie Ihr Projekt mit Ameise zu bauen. Überschreiben Sie dann einfach in der build.xml des Projekts das Ziel "-debug-obfuscation-check" und setzen Sie proguard.enabled auf true:

<target name="-debug-obfuscation-check">
    <!-- proguard is never enabled in debug mode -->
    <property name="proguard.enabled" value="true"/>
</target>
Victor Ionescu
quelle
1
Vielen Dank! Das hat bei mir fast geklappt. Ich habe eine neue Antwort hinzugefügt, die auf Ihrer basiert.
Jo Jo
0

Mit Android Studio können Sie die -dontobfuscateOption in Ihrer Proguard-Regeldatei verwenden, und der Debugger funktioniert einwandfrei. Ich bin mir nicht sicher, ob es auch mit Eclipe funktioniert.

Sealskej
quelle