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 Wenn Sie DEX-Dateien für die veröffentlichte Version Ihrer App kompilieren oder
in der Bibliothek verwenden, verwenden Sie stattdessen das Flag |
--release
|
Kompilieren Sie den DEX-Bytecode ohne Informationen zur Fehlerbehebung. Sie können jedoch
Ü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
Wenn Sie einen Pfad und Namen einer ZIP- oder JAR-Datei angeben, |
--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
|
--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 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
Sie können dieses Flag nicht verwenden, während gleichzeitig
|
--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 |
|
Von javac generierten Assertion-Code erzwingen.
|
|
Von javac generierten Assertion-Code erzwingen Dieses
ist die standardmäßige Verarbeitung von javac -Assertion-Code, wenn
Generieren von DEX-Dateien.
|
|
Ändern Sie nicht den mit javac generierten Assertion-Code. Dieses
ist die standardmäßige Verarbeitung von javac -Assertion-Code, wenn
class Dateien werden generiert.
|
|
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