d8

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, d8 oczekuje, że podany kod bajtowy Java zawiera te informacje. Na przykład, jeśli używasz tagu javac skompilować kod, musisz przekazać flagę -g, by umieścić w niej kod dane debugowania w wyjściowym kodzie bajtowym Java.

Podczas kompilowania plików DEX dla wersji produkcyjnej aplikacji lub biblioteki, użyj flagi --release.

--release

Kompiluj kod bajtowy DEX bez danych debugowania. Pamiętaj jednak: d8 zawiera niektóre informacje używane podczas generowania stosów i wyjątków logowania.

Przekazuj tę flagę podczas kompilowania kodu bajtowego wersji publicznej.

--output path

Określ ścieżkę danych wyjściowych DEX. Domyślnie d8 na wyjściu generuje pliki DEX w aktualnie działającym środowisku katalogu.

Jeśli podasz ścieżkę i nazwę pliku ZIP lub JAR, d8 utworzy określony plik i dołączy wyjściowe pliki DEX. Jeśli określ ścieżkę do istniejącego katalogu, d8 na wyjściu plików DEX w tym katalogu.

--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 --main-dex-list

--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 d8 powinna zawierać w głównym pliku DEX, który zwykle nosi nazwę classes.dex. Jeśli nie określisz listy klas za pomocą tej flagi, Funkcja d8 nie gwarantuje, które zajęcia zostaną uwzględnione w głównej DEX.

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 --main-dex-list, d8 zawiera tylko te w głównym pliku DEX. Służy do zgłaszania problemów związanych z zajęciami których brakuje w głównym pliku DEX. Jeśli określisz Tryb --release, d8 próbuje zmniejszyć liczbę plików DEX spakowanych do wersji produkcyjnej aplikacji przez łącznie z jak największą liczbą innych klas w głównym pliku DEX do osiągnięto limit 64 tys.

Nie możesz użyć tej flagi, gdy jednocześnie określasz --file-per-class

--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 file.

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

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

Wymuś włączenie kodu asercji wygenerowanego przez javac.

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

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

Wymuś wyłączenie kodu asercji wygenerowanego przez javac. Ten to domyślna obsługa kodu asercji javac, gdy i generuję pliki DEX.

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

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

Nie zmieniaj kodu asercji wygenerowanego przez javac. Ten to domyślna obsługa kodu asercji javac, gdy generowanie class plików.

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

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

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