d8
to narzędzie wiersza poleceń dostępne w Android Studio i wtyczka Android Gradle.
służy do skompilowania kodu bajtowego w Javie w kod bajtowy DEX, który działa
na urządzeniach z Androidem. d8
umożliwia korzystanie z funkcji języka Java 8 w
do kodu aplikacji.
Aplikacja d8
jest też dostępna jako samodzielne narzędzie w Android Build
Narzędzia w wersji 28.0.1 lub nowszej:
android_sdk/build-tools/version/
Zastosowania ogólne
d8
wymaga tylko ścieżki do skompilowanego kodu bajtowego Java
który chcesz przekonwertować na kod bajtowy DEX. Na przykład:
d8 MyProject/app/build/intermediates/classes/debug/*/*.class
Wejściowym kodem bajtowym może być dowolna kombinacja plików *.class
lub
takich jak JAR, APK czy ZIP. Możesz też dodać
pliki DEX dla d8
, aby scalać je z danymi wyjściowymi DEX. Jest to przydatne.
podczas uwzględniania danych wyjściowych z kompilacji przyrostowej.
Domyślnie d8
kompiluje kod bajtowy Java do zoptymalizowanych plików DEX.
i zawiera informacje o debugowaniu,
służą do debugowania kodu w czasie działania. Możesz jednak dodać atrybut
do wykonywania kompilacji przyrostowej, określ klasy, które
należy skompilować do głównego pliku DEX i określić ścieżki do
dodatkowych zasobów wymaganych do korzystania z funkcji w języku Java 8.
d8 path-to-input-files [options]
W tabeli poniżej opisujemy opcjonalne flagi, których możesz używać z zasadą d8
:
Option | Opis |
---|---|
--debug
|
Kompiluj kod bajtowy DEX, aby uwzględnić informacje na potrzeby debugowania, np. symbol debugowania tabeli. Ta opcja jest domyślnie włączona. Aby umieścić dane debugowania w pliku
Kod bajtowy DEX, Podczas kompilowania plików DEX dla wersji produkcyjnej aplikacji lub
biblioteki, użyj flagi |
--release
|
Kompiluj kod bajtowy DEX bez danych debugowania. Pamiętaj jednak:
Przekazuj tę flagę podczas kompilowania kodu bajtowego wersji publicznej. |
--output path
|
Określ ścieżkę danych wyjściowych DEX. Domyślnie
Jeśli podasz ścieżkę i nazwę pliku ZIP lub JAR, |
--lib android_sdk/platforms/api-level/android.jar
|
Podaj ścieżkę do kodu android.jar pakietu Android SDK.
Ta flaga jest wymagana podczas kompilowania kodu bajtowego korzystającego z
funkcje języka Java 8.
|
--classpath path
|
Określ zasoby ścieżki klasy, których d8 może wymagać skompilowania
pliki DEX projektu. W szczególności d8 wymaga:
należy określić pewne zasoby podczas kompilowania kodu bajtowego wykorzystującego
funkcje języka Java 8.
|
--min-api number
|
Określ minimalny poziom interfejsu API, który mają być obsługiwane przez wyjściowe pliki DEX. |
--intermediate
|
Prześlij tę flagę, aby poinformować usługę d8 , że nie kompilujesz
pełny zestaw kodów bajtowych w Javie dla Twojego projektu. Ta flaga jest przydatna, gdy
przeprowadzanie kompilacji przyrostowych. Zamiast kompilować zoptymalizowane pliki DEX
który powinien działać na urządzeniu, d8 tworzy poziom pośredni
DEX i zapisuje je w określonej ścieżce wyjściowej lub domyślnej.
Jeśli chcesz skompilować pliki DEX, które zamierzasz uruchomić na urządzeniu, wyklucz tę flagę i określ ścieżkę do pośrednich klas DEX jako dane wejściowe. |
--file-per-class
|
Skompiluj poszczególne zajęcia w osobne pliki DEX. Włączenie tej flagi umożliwia wykonywanie większej liczby kompilacji przyrostowych przez ponowne skompilowanie tylko tych klas, które uległy zmianie. W trakcie realizacji kompilacji przyrostowych za pomocą wtyczki Androida do obsługi Gradle, ta optymalizacja domyślnie włączone. Nie możesz użyć tej flagi, gdy jednocześnie określasz
|
--no-desugaring
|
Wyłącz funkcje językowe Java 8. Używaj tej flagi tylko wtedy, gdy nie masz takiej zamiaru skompilować kod bajtowy Java, który korzysta z funkcji w języku Java 8. |
--main-dex-list path
|
Określ plik tekstowy z listą klas, które Ponieważ system Android w pierwszej kolejności wczytuje główny plik DEX możesz użyć tego flagi, aby nadać priorytet określonym zajęciam przy uruchamianiu przez skompilowanie ich do głównego pliku DEX. Jest to szczególnie przydatne w przypadku obsługi starszej wersji Multidex, ponieważ tylko klasy w głównej części DEX będzie dostępny w czasie działania, dopóki starsza biblioteka Multidex nie zostanie wczytano. Pamiętaj, że każdy plik DEX musi spełniać
limit plików referencyjnych do 64 tys. Nie rób tego,
określ zbyt wiele klas dla głównego pliku DEX lub otrzymasz
. Domyślnie w przypadku określania klas za pomocą metody
Nie możesz użyć tej flagi, gdy jednocześnie określasz
|
--pg-map file
|
Użyj file jako pliku mapowania do dystrybucji. |
--file-per-class-file
|
Dla każdego wejściowego pliku .class utwórz oddzielny plik DEX. Zachowaj klasy syntetyczne z ich klasą początkową. |
--desugared-lib file
|
Określ konfigurację biblioteki pozbawionej cukru. file to plik konfiguracyjny biblioteki usunięty w kodzie JSON w formacie JSON . |
--main-dex-rules file
|
Zachowaj zasady dotyczące zajęć, które mają zostać umieszczone w głównym pliku DEX. |
--main-dex-list-output file
|
Na wyjściu generuje główną listę DEX w pliku |
|
Wymuś włączenie kodu asercji wygenerowanego przez javac .
|
|
Wymuś wyłączenie kodu asercji wygenerowanego przez javac . Ten
to domyślna obsługa kodu asercji javac , gdy
i generuję pliki DEX.
|
|
Nie zmieniaj kodu asercji wygenerowanego przez javac . Ten
to domyślna obsługa kodu asercji javac , gdy
generowanie class plików.
|
|
Zmień asercję wygenerowaną przez javac i kotlinc
kod do wywoływania metody handler method z każdym asercją
zamiast ją rzucić. Element handler method został określony
jako nazwę klasy, po której następuje kropka i nazwa metody.
metoda obsługi musi przyjmować pojedynczy argument typu
java.lang.Throwable i zwracany typ void .
|
--thread-count number of threads
|
Określ liczbę wątków, które mają być używane do kompilacji. Jeśli nie podasz żadnej wartości, wyliczana jest na podstawie heurystyki, przy czym rdzeni i liczbę rdzeni. |
--map-diagnostics[
:type] from-level to-level
|
Diagnostyka mapy type (domyślnie) raportowana jako from-level do to-level, gdzie from-level i to-level to wartości „info”, „ostrzeżenie” lub „error” oraz opcjonalny type jest wymiarem prostym lub pełnym Nazwa typu Javy dla diagnostyki. Jeśli type nie jest określony, wszystkie dane diagnostyczne w lokalizacji from-level są mapowane. Pamiętaj, że krytycznych błędów kompilatora nie można zmapować. |
--version
|
Wydrukuj wersję usługi d8 , której aktualnie używasz.
|
--help
|
Drukuj tekst pomocy dotyczącej korzystania z d8 .
|
Wykonuj kompilacje przyrostowe
Aby zwiększyć szybkość kompilacji podczas programowania, na przykład na potrzeby ciągłej integracji
kompilacje, poleć usłudze d8
skompilowanie tylko podzbioru kodu Java w Twoim projekcie
kod bajtowy. Jeśli na przykład włączysz dexing dla poszczególnych klas, możesz ponownie skompilować tylko
klasy zmodyfikowane od czasu poprzedniej kompilacji.
To polecenie wykonuje przyrostową kompilację kilku klas i włącza: nauczanie klasyczne. To polecenie określa też katalog wyjściowy dla polecenia kompilację przyrostową.
d8 MainActivity.class R.class --intermediate --file-per-class --output ~/build/intermediate/dex
Gdy d8
wykonuje kompilację przyrostową, zapisuje dodatkowe informacje w
Dane wyjściowe DEX. d8
wykorzystuje później te informacje do prawidłowego przetworzenia
--main-dex-list
i scal pliki DEX podczas pełnej kompilacji aplikacji.
Na przykład podczas przetwarzania klas lambda w języku Java 8 d8
śledzi, które z nich
Klasy lambda są tworzone dla każdej klasy wejściowej. Podczas pełnej kompilacji, gdy d8
zawiera klasę w głównym pliku DEX, sprawdza metadane, aby upewnić się, że wszystkie
klas lambda utworzonych dla tych klas są również uwzględnione w głównej
DEX.
Jeśli cały kod bajtowy projektu został już skompilowany do plików DEX
w wielu przyrostowych kompilacjach, wykonaj pełną kompilację, przekazując
pośrednich plików DEX do d8
, jak w poniższym poleceniu.
Możesz też określić klasy, które d8
ma skompilować w klasie main
Plik DEX za pomocą --main-dex-list
. Dane wejściowe to zbiór plików,
skompilowane do kodu bajtowego DEX, ta kompilacja powinna zakończyć się szybciej
niż czysta konstrukcja.
d8 ~/build/intermediate/dex --release --main-dex-list ~/build/classes.txt --output ~/build/release/dex
Kompilowanie kodu bajtowego wykorzystującego funkcje języka Java 8
d8
umożliwia korzystanie z funkcji w języku Java 8
w kodzie za pomocą procesu kompilacji, który nazywamy desugaring. Odsłodzanie przekłada się na konwersję
tych przydatnych funkcji językowych w kod bajtowy, który można uruchomić
platformy.
Android Studio i wtyczka Androida do obsługi Gradle zawierają ścieżkę klasy
zasobów, których usługa d8
wymaga, aby włączyć dla Ciebie usuwanie cukru. Jednak w przypadku używania funkcji
d8
za pomocą wiersza poleceń, musisz dodać je samodzielnie.
Jednym z takich zasobów jest android.jar
z docelowego pakietu SDK na Androida. Ten
zawiera zestaw interfejsów API platformy Androida. Podaj jej ścieżkę za pomocą
flagę --lib
.
Kolejnym zasobem jest zestaw kodów bajtowych Java skompilowany do projektu nie są obecnie kompilowane do kodu bajtowego DEX, ale wymagają skompilowania innych do kodu bajtowego DEX.
Jeśli na przykład w kodzie używany jest atrybut
domyślnych i statycznych metod interfejsu, które są oparte na Javie
funkcji w 8 językach, użyj tej flagi, aby podać ścieżkę do wszystkich
kodu bajtowego w Javie, nawet jeśli nie zamierzasz skompilować całego
do kodu bajtowego DEX. Dzieje się tak, ponieważ d8
wymaga tych informacji, aby zrozumieć,
w kodzie projektu i usuwać wywołania metod interfejsu.
Następujący przykładowy kod wykonuje przyrostową kompilację klasy, która uzyskuje dostęp domyślną metodą interfejsu:
d8 MainActivity.class --intermediate --file-per-class --output ~/build/intermediate/dex --lib android_sdk/platforms/api-level/android.jar --classpath ~/build/javac/debug