d8

d8 ist ein Befehlszeilentool, das von Android Studio und dem Android-Gradle-Plug-in Verwenden Sie, um den Java-Bytecode Ihres Projekts in DEX-Bytecode zu kompilieren, der ausgeführt wird. auf Android-Geräten. Mit d8 können Sie Java 8-Sprachfunktionen in Ihrem App-Code enthält.

d8 ist auch als eigenständiges Tool in Android Build enthalten. Tools 28.0.1 und höher: android_sdk/build-tools/version/.

Allgemeine Verwendung

d8 benötigt nur einen Pfad zum kompilierten Java-Bytecode den Sie in DEX-Bytecode umwandeln möchten. Beispiel:

d8 MyProject/app/build/intermediates/classes/debug/*/*.class

Der Eingabebytecode kann eine beliebige Kombination aus *.class-Dateien oder wie JAR-, APK- oder ZIP-Dateien. Sie können auch Nützliche DEX-Dateien für d8 werden in der DEX-Ausgabe zusammengeführt. wenn die Ausgabe eines inkrementellen Builds einbezogen wird.

Standardmäßig kompiliert d8 den Java-Bytecode in optimierte DEX-Dateien. sowie Informationen zur Fehlerbehebung, zum Debuggen des Codes während der Laufzeit. Sie können jedoch optionale Flags verwenden, um einen inkrementellen Build auszuführen, geben Sie Klassen an, in die DEX-Hauptdatei kompiliert werden und Pfade zu zusätzliche Ressourcen, die zur Verwendung der Java 8-Sprachfunktionen erforderlich sind.

d8 path-to-input-files [options]

In der folgenden Tabelle werden die optionalen Flags beschrieben, die Sie mit d8 verwenden können:

Option Beschreibung
--debug

Kompilieren Sie den DEX-Bytecode, um Debug-Informationen wie das Debug-Symbol zu berücksichtigen. Tabellen.

Diese Option ist standardmäßig aktiviert. Um Fehlerbehebungsinformationen in Ihr DEX-Bytecode d8 erwartet, dass der Java-Eingabe-Bytecode enthält diese Informationen. Wenn Sie beispielsweise javac verwenden, Um Ihren Code zu kompilieren, müssen Sie das Flag -g übergeben, um .

Wenn Sie DEX-Dateien für die veröffentlichte Version Ihrer App kompilieren oder in der Bibliothek verwenden, verwenden Sie stattdessen das Flag --release.

--release

Kompilieren Sie den DEX-Bytecode ohne Informationen zur Fehlerbehebung. Sie können jedoch d8 enthält einige Informationen, die bei der Generierung verwendet werden Stacktraces und Logging von Ausnahmen.

Übergib dieses Flag, wenn du Bytecode für einen öffentlichen Release kompilierst.

--output path

Geben Sie den gewünschten Pfad für die DEX-Ausgabe an. Standardmäßig d8 gibt die DEX-Datei(en) im aktuellen Arbeitsmodus aus. -Verzeichnis.

Wenn Sie einen Pfad und Namen einer ZIP- oder JAR-Datei angeben, d8 erstellt die angegebene Datei und nimmt die DEX-Ausgabedateien auf. Wenn Sie den Pfad zu einem vorhandenen Verzeichnis angibt, gibt d8 die DEX-Dateien in diesem Verzeichnis.

--lib android_sdk/platforms/api-level/android.jar Geben Sie den Pfad zum android.jar Ihres Android SDK an. Dieses Flag ist erforderlich, wenn Bytecode kompiliert wird, der Java 8-Sprachfunktionen
--classpath path Klassenpfadressourcen angeben, die d8 zum Kompilieren benötigt die DEX-Dateien Ihres Projekts. d8 verlangt insbesondere, dass Sie Bestimmte Ressourcen angeben, wenn Bytecode kompiliert wird, der Java 8-Sprachfunktionen
--min-api number Geben Sie das minimale API-Level an, das die DEX-Ausgabedateien unterstützen sollen.
--intermediate Übergeben Sie dieses Flag, um d8 mitzuteilen, dass Sie das Paket nicht kompilieren. einen vollständigen Satz des Java-Bytecodes Ihres Projekts. Dieses Flag ist nützlich, wenn inkrementelle Builds durchführen. Anstatt optimierte DEX-Dateien zu kompilieren die voraussichtlich auf einem Gerät ausgeführt werden soll, erstellt d8 DEX-Dateien und speichert sie im angegebenen Ausgabe- oder Standardpfad.

Wenn Sie DEX-Dateien kompilieren möchten, die auf einem Gerät ausgeführt werden sollen, Dieses Flag ausschließen und den Pfad zu den DEX-Zwischenklassen angeben als Eingabe verwenden.

--file-per-class

Kompilieren Sie jede Klasse in separate DEX-Dateien.

Wenn Sie dieses Flag aktivieren, können Sie mehr Builds inkrementell ausführen, indem Sie und nur die geänderten Klassen neu kompiliert. Bei der Durchführung Builds mit dem Android-Gradle-Plug-in steigern, ist standardmäßig aktiviert.

Sie können dieses Flag nicht verwenden, während gleichzeitig --main-dex-list

--no-desugaring Java 8-Sprachfunktionen deaktivieren Verwenden Sie dieses Flag nur, wenn Sie das zum Kompilieren von Java-Bytecode, der Java 8-Sprachfunktionen verwendet.
--main-dex-list path

Geben Sie eine Textdatei mit den Klassen an, die d8 enthalten soll in der DEX-Hauptdatei, die normalerweise classes.dex heißt. Wenn Sie mit diesem Flag keine Liste von Klassen angeben, d8 gibt keine Garantie dafür, welche Klassen im Haupt- DEX-Datei.

Da das Android-System beim Start zuerst die DEX-Hauptdatei lädt Ihrer App können Sie dieses Flag verwenden, um bestimmte Klassen beim Start zu priorisieren indem wir sie in die DEX-Hauptdatei kompilieren. Dies ist besonders nützlich, bei der Unterstützung von Legacy-Multidex, da nur Klassen im Haupt-DEX -Datei zur Laufzeit verfügbar, bis die alte Multidex-Bibliothek geladen.

Beachten Sie, dass jede DEX-Datei die das Referenzlimit von 64.000. Achten Sie also darauf, zu viele Klassen für die DEX-Hauptdatei angeben. Andernfalls erhalten Sie eine Kompilierungsfehlers. Wenn Sie Klassen mit --main-dex-list, d8 enthält nur diese Klassen in der DEX-Hauptdatei. Damit sollen Probleme in Bezug auf den Unterricht die in der DEX-Hauptdatei fehlen, ist einfacher zu debuggen. Wenn Sie Modus „--release“, d8 versucht, die Anzahl zu verringern von DEX-Dateien, die in die Release-Version Ihrer App gepackt sind, so viele andere Klassen wie möglich in die DEX-Hauptdatei aufzunehmen, das Limit von 64.000 KB erreicht wurde.

Sie können dieses Flag nicht verwenden, während gleichzeitig --file-per-class

--pg-map file Verwenden Sie file als Zuordnungsdatei für die Verteilung.
--file-per-class-file

Erstellen Sie eine separate DEX-Datei pro .class-Eingabedatei.

Synthetische Klassen mit ihrer ursprünglichen Klasse beibehalten.

--desugared-lib file

Geben Sie eine gewünschte Bibliothekskonfiguration an.

file ist eine neue Bibliothekskonfigurationsdatei in JSON. Format.

--main-dex-rules file Proguard hält Regeln für Klassen ein, die im primäre DEX-Datei.
--main-dex-list-output file Ausgabe als Ergebnis der Haupt-DEX-Liste in file.

--force-enable-assertions [:class_or_package_name...]

--force-ea [:class_or_package_name...]

Von javac generierten Assertion-Code erzwingen.

--force-disable-assertions [:class_or_package_name...]

--force-da [:class_or_package_name...]

Von javac generierten Assertion-Code erzwingen Dieses ist die standardmäßige Verarbeitung von javac-Assertion-Code, wenn Generieren von DEX-Dateien.

--force-passthrough-assertions [:class_or_package_name...]

--force-pa [:class_or_package_name...]

Ändern Sie nicht den mit javac generierten Assertion-Code. Dieses ist die standardmäßige Verarbeitung von javac-Assertion-Code, wenn class Dateien werden generiert.

--force-assertions-handler:handler method [:class_or_package_name...]

--force-ah:handler method [:class_or_package_name...]

javac- und kotlinc-generierte Assertion ändern Code zum Aufrufen der Methode handler method mit jeder Assertion anstatt sie auszugeben. handler method ist angegeben als Klassenname, gefolgt von einem Punkt und dem Methodennamen. Die Die Handler-Methode muss ein einzelnes Argument des Typs annehmen java.lang.Throwable und den Rückgabetyp void.
--thread-count number of threads Geben Sie die Anzahl der Threads an, die für die Kompilierung verwendet werden sollen. Wenn keine Angabe erfolgt, basiert die Zahl auf einer Heuristik, wobei die Zahl Kernen berücksichtigt.
--map-diagnostics[ :type] from-level to-level Kartendiagnose von type (Standardeinstellung: alle) gemeldet als from-level nach to-level, wobei from-level und to-level entweder „info“, „warning“ oder „error“ und die Optional: type ist entweder die einfache oder voll qualifizierte Java-Typname einer Diagnose. Wenn type nicht angegeben ist, gilt: Sämtliche Diagnosedaten unter from-level sind zugeordnet. Schwerwiegende Compilerfehler können nicht zugeordnet werden.
--version Drucke die aktuell verwendete Version von d8 aus.
--help Hilfetext zur Verwendung von d8 drucken.

Inkrementelle Builds ausführen

Um die Build-Geschwindigkeit während der Entwicklung zu verbessern, z. B. für Continuous Integration Builds können Sie d8 anweisen, nur einen Teil des Java-Codes Ihres Projekts zu kompilieren. Bytecode. Wenn Sie beispielsweise das Dexing pro Klasse aktivieren, können Sie nur die Neukompilierung durchführen die Klassen, die Sie seit dem vorherigen Build geändert haben.

Der folgende Befehl führt einen inkrementellen Build einiger Klassen aus und aktiviert Dexing pro Klasse. Der Befehl gibt auch ein Ausgabeverzeichnis für die inkrementeller Build.

d8 MainActivity.class R.class --intermediate --file-per-class --output ~/build/intermediate/dex

Wenn d8 einen inkrementellen Build ausführt, werden zusätzliche Informationen im DEX-Ausgabe. d8 verwendet diese Informationen später zur korrekten Verarbeitung des --main-dex-list und führen Sie DEX-Dateien während eines vollständigen Builds Ihrer App zusammen.

Bei der Verarbeitung von Lambda-Klassen für Java 8 erfasst d8 beispielsweise, welche Lambda-Klassen für jede Eingabeklasse erstellt. Während eines vollständigen Builds, wenn d8 eine Klasse in der DEX-Hauptdatei enthält, zieht sie die Metadaten heran, um sicherzustellen, Lambda-Klassen, die für diese Klasse erstellt wurden, sind auch in der DEX-Datei.

Wenn Sie bereits den gesamten Bytecode Ihres Projekts in DEX-Dateien kompiliert haben in mehreren inkrementellen Builds erstellt werden, führen Sie einen vollständigen Build durch, indem Sie den Parameter der DEX-Zwischendateien in d8, wie im folgenden Befehl gezeigt. Außerdem können Sie die Klassen angeben, die d8 in die Haupttabelle kompilieren soll. DEX-Datei mit --main-dex-list. Da die Eingabe aus einer Reihe von Dateien besteht, bereits in DEX-Bytecode kompiliert ist, sollte dieser Build schneller abgeschlossen werden. als ein sauberes Build.

d8 ~/build/intermediate/dex --release --main-dex-list ~/build/classes.txt --output ~/build/release/dex

Bytecode kompilieren, der Java 8-Sprachfunktionen verwendet

Mit d8 können Sie Java 8-Sprachfunktionen verwenden. in Ihrem Code durch einen Kompilierungsprozess, der als Desugaring bezeichnet wird. Durch Desugarieren diese nützlichen Sprachfunktionen in Bytecode umwandeln, der auf dem Android-Gerät ausgeführt werden kann, Plattform.

Android Studio und das Android-Gradle-Plug-in enthalten „classpath“ Ressourcen, die d8 benötigt, um die Entugarierung für Sie zu aktivieren. Wenn Sie jedoch d8 aus der Befehlszeile hinzu, müssen Sie sie selbst einfügen.

Eine solche Ressource ist die android.jar aus deinem Ziel-Android SDK. Dieses Ressource eine Reihe von Android-Plattform-APIs. Geben Sie den Pfad mit Das Flag --lib.

Eine weitere Ressource ist der Satz von Java-Bytecode, der in Ihr Projekt kompiliert wurde und den Sie derzeit nicht in DEX-Bytecode kompiliert werden, Klassen in DEX-Bytecode umwandeln.

Wenn in Ihrem Code beispielsweise <ph type="x-smartling-placeholder"></ph> Standard- und statischen Schnittstellenmethoden, bei denen es sich um eine Java- 8-Sprachen-Funktion verwenden, müssen Sie mit diesem Flag den Pfad zu allen Ihren den Java-Bytecode des Projekts, selbst wenn Sie nicht beabsichtigen, in DEX-Bytecode umwandeln. Das liegt daran, dass d8 diese Informationen benötigt, um Ihres Projekts an und lösen Aufrufe an die Schnittstellenmethoden auf.

Im folgenden Codebeispiel wird ein inkrementeller Build einer Klasse ausgeführt, die auf Standardschnittstellenmethode verwenden:

d8 MainActivity.class --intermediate --file-per-class --output ~/build/intermediate/dex
--lib android_sdk/platforms/api-level/android.jar
--classpath ~/build/javac/debug