2016-09-06 4 views
1

Ich habe Android-Entwicklung für ein kleines bisschen gemacht und ich bin zu einem Punkt in einem meiner Projekte, wo ich Proguard verwenden möchte, um die Größe meiner APk zu verkleinern und zu helfen das Dex-Limit. Leider bekomme ich ein paar Fehler und Stapelüberlauf hat Antworten, aber sie scheinen für diejenigen mit mehr Erfahrung ausgerichtet zu sein.Android: Erklärung der Proguard Integration

Meine Frage ist, was ist die Beziehung mit Ihrem proguard-android.txt und proguard-rules.pro? Warum gibt es zwei separate Dateien und warum sind sie in separaten Formaten? Wann werden die Anweisungen in diesen Dateien aufgerufen und in welcher Reihenfolge? Ich suche nur nach einer Erklärung des allgemeinen Kontextes der Verwendung von Progurad in einer Entwicklungsumgebung.

Vielen Dank im Voraus.

+1

Sie sollten sich https://developer.android.com/studio/build/shrink-code.html ansehen – Kassisdion

Antwort

4

ProGuard manipuliert Java-Bytecode so, wie Sie es mit Ihren Konfigurationsdateien und den darin enthaltenen Regeln angeben. ProGuard kann viele Dinge tun. Und es kann Ihre App komplett zerstören, also müssen Sie sicherstellen, dass Sie die richtigen Regeln hinzufügen.

Ich nehme an, Sie verwenden Gradle-basierte Builds für Ihre Apps. Dann haben Sie wahrscheinlich diese Schnipsel angetroffen, die ProGuard für die Freigabe ermöglicht baut der App (oder Android-Bibliothek):

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

In der Config die Liste proguardFiles erzählt die bauen, was Dateien, die enthalten ProGuard Regeln, es zu benutzen hat. Diese Liste kann beliebig viele Dateien enthalten.

Warum sind die Dateien (proguard-android.txt und proguard-rules.pro) anders definiert?

Die magische Datei getDefaultProguardFile(‘proguard-android.txt') lädt die Datei mit dem Namen proguard-android.txt vom Standardspeicherort im Android SDK (der Speicherort ist ${ANDROID_SDK}/tools/proguard/).

Andere Konfigurationsdateien werden lokal aufgelöst, daher wird erwartet, dass die Datei proguard-rules.pro im Stammverzeichnis des aktuellen Gradle-Moduls liegt.

Warum gibt es zwei separate Dateien? Und wie ist die Beziehung zwischen proguard-android.txt und proguard-rules.pro?

ProGuard-Konfiguration ist additiv. Sie können einige Regeln in einer Datei und andere in anderen Dateien definieren. Die Regeln werden intern zu einer einzelnen Liste von Regeln verkettet.

Datei getDefaultProguardFile(‘proguard-android.txt') enthält einige allgemeine Regeln für alle Android Apps (überprüfen Sie sie selbst, in der Datei in Ihrem SDK). Das lokale proguard-rules.pro enthält voraussichtlich Regeln, die für Ihre eigene App spezifisch sind. Zum Beispiel möchten Sie sicherstellen, dass eine Klasse nicht entfernt wird, wenn Sie sie nur durch Reflektion verwenden (dazu komme ich später).

Beachten Sie, dass mehrere lokale Dateien sehr nützlich sind. Sie können zum Beispiel zwei lokale Konfigurationsdateien für Debug-Builds verwenden - eine mit den Veröffentlichungsregeln für Ihre App und die zweite mit Regeln, die die Verschleierung deaktivieren.

Beachten Sie auch, dass das additive Verhalten der Konfigurationen ein wenig beunruhigend sein kann. Wenn Sie eine Regel in einer Konfigurationsdatei hinzufügen, können Sie sie nicht in einer anderen entfernen. Seien Sie also vorsichtig mit sehr allgemeinen Regeln (z. B. indem Sie -keep class ** { *; } hinzufügen).

Wann werden die Anweisungen in diesen Dateien aufgerufen und in welcher Reihenfolge?

Sie können sie in beliebiger Reihenfolge definieren, es gibt keinen Unterschied. Und Sie können die gleiche Regel in mehreren Dateien definieren, es spielt keine Rolle. Die Reihenfolge der angegebenen Dateien spielt ebenfalls keine Rolle.

ProGuard selbst wird als einzelner Job innerhalb des Android-Builds ausgeführt (eine einzelne Gradle-Task, um genau zu sein). Die Aufgabe wird alle Eingänge vorgesehen:

  • Klassen
  • Bibliotheksklassen zu manipulieren, zu verwenden, aber nicht manipulieren
  • Ausgangsweg für erzeugte verarbeitete jar
  • Regeln ProGuard Spezifizieren der Manipulation
  • Ausgangspfade für verschiedene Ausgabeinformationen (was entfernt wurde, Mapping, ...)

Und dann verarbeitet es die Dateien und Gattungen testet eine Ausgabe, die vom Gradle-Build weiterverarbeitet wird.

Wie funktioniert ProGuard? Und warum brauche ich die Regeln?

ProGuard durchläuft den gesamten Aufrufgraphen von classes/methods/fields/.... Es beginnt mit den Klassen/Methoden/..., die durch die angegebenen Regeln definiert sind. Durchläuft dann das Aufrufdiagramm und markiert Klassen/Methoden/Felder/... nach Bedarf und behält sie für die Ausgabe bei. Wenn Sie es also ohne übereinstimmende Keep-Regeln aufrufen, erzeugt es eine leere Ausgabe (oder vielleicht wird es einen Fehler auslösen und Ihnen sagen, dass Sie einige definieren sollen, an die ich mich jetzt nicht erinnere). ProGuard erkennt Aufrufe, die über Reflektion ausgeführt werden, nicht. Daher müssen Sie einige Regeln hinzufügen, um das zu behandeln. Es gibt viele andere Fälle, die erfordern, dass Sie einige Regeln hinzufügen, überprüfen Sie die documentation dafür.

Schlussnoten

Wenn Sie ProGuard documentation überprüfen können Sie verschiedene Regeln finden Sie verwenden können. Aber nicht alle Regeln sind gut für Android (ProGuard ist ein allgemeines Java-Tool).

Einige Regeln werden von Android selbst erstellt, Sie müssen sie nicht selbst definieren. Es gibt zwei Arten solcher Regeln:

  1. Allgemeine Konfigurationsregeln wie -injars, -libraryjars, ...
  2. Regeln erzeugt aus AndroidManifest.xml und Ressourcen (Layouts). Android build (aapt-Tool) generiert Regeln, um die in den Manifestlisten (Aktivitäten, Services, Empfänger, ...) und benutzerdefinierten Ansichten in Layouts verwendeten Klassen beizubehalten. Sie können diese generierten Regeln prüfen in build/intermediates/proguard-rules/${PRODUCT_FLAVOR}/${BUILD_TYPE}/aapt_rules.txt

Einige Regeln von aar Bibliotheken kommen kann. Die Bibliotheken können eine ProGuard-Konfiguration enthalten, die für das Funktionieren der Bibliothek erforderlich ist (es kann proguard.txt Datei enthalten sein).

Wenn Sie Android-Bibliotheken selbst schreiben, seien Sie sehr vorsichtig mit den Regeln, die Sie zum aar hinzufügen möchten. Aufgrund der additiven Eigenschaften der Regeln kann dies zu Problemen für die App führen, die die Bibliothek bündelt.