Jack to domyślna linia narzędzi do kompilacji Androida w wersjach 6.0–8.1
Jack to zestaw narzędzi Androida, który kompiluje kod źródłowy Java na kod bajtowy dex Androida. Aby korzystać z Jacka, nie musisz nic robić inaczej – wystarczy użyć standardowych poleceń makefile do skompilowania drzewa lub projektu. Android 8.1 jest ostatnią wersją, która korzysta z Jacka.
Informacje o Jacku
Jack działa tak, jak pokazano na rysunku 1.
Rysunek 1. Omówienie Jacka
Format biblioteki Jack
Jack ma własny format pliku .jack
, który zawiera wstępnie skompilowany kod dex dla biblioteki, co pozwala na szybszą kompilację (pre-dex).
Rysunek 2. Jack library file contents.
Jill
Jak widać na rysunku poniżej, narzędzie Jill przekształca istniejące biblioteki .jar
w nowy format.
Rysunek 3. Proces importowania istniejącej biblioteki .jar
.
Serwer kompilacji Jack
.Gdy Jack zostanie użyty po raz pierwszy, na Twoim komputerze uruchomi się lokalny serwer kompilacji Jack. Ten serwer:
- Przynosi to przyspieszenie, ponieważ nie trzeba uruchamiać nowej hostowanej JVM JRE, wczytywać kodu Jack, inicjować Jacka i rozgrzewać JIT przy każdej kompilacji. Zapewnia też bardzo krótki czas kompilacji w przypadku małych kompilacji (np. w trybie przyrostowym).
- Jest to tymczasowe rozwiązanie umożliwiające kontrolowanie liczby równoległych kompilacji Jack. Serwer zapobiega przeciążeniu komputera (problemy z pamięcią lub dyskiem), ponieważ ogranicza liczbę równoległych kompilacji.
Serwer Jack wyłącza się po określonym czasie bezczynności bez żadnej kompilacji.
Używa 2 portów TCP na interfejsie localhost i nie jest dostępny zewnętrznie. Wszystkie parametry (np. liczba równoległych kompilacji, limit czasu, liczba portów) można zmienić, edytując plik $HOME/.jack
.
$HOME/.jack
Plik $HOME/.jack
zawiera te ustawienia zmiennych serwera Jack:
SERVER=true
włącza funkcję serwera Jacka.SERVER_PORT_SERVICE=8072
ustawia numer portu TCP serwera na potrzeby kompilacji.SERVER_PORT_ADMIN=8073
ustawia numer portu TCP serwera na potrzeby administracyjne.SERVER_COUNT=1
jest nieużywany.SERVER_NB_COMPILE=4
określa maksymalną liczbę dozwolonych kompilacji równoległych.SERVER_TIMEOUT=60
określa liczbę sekund bezczynności, przez które serwer musi czekać bez żadnej kompilacji, zanim się wyłączy.SERVER_LOG=${SERVER_LOG:=$SERVER_DIR/jack-$SERVER_PORT_SERVICE.log}
określa plik, w którym są zapisywane dzienniki serwera. Domyślnie tę zmienną można przesłonić za pomocą zmiennej środowiskowej.JACK_VM_COMMAND=${JACK_VM_COMMAND:=java}
ustawia domyślne polecenie używane do uruchamiania JVM na hoście. Domyślnie tę zmienną można zastąpić zmienną środowiskową.
Rozwiązywanie problemów z kompilacjami Jack
Problem | Działanie |
---|---|
Podczas kompilacji komputer przestaje odpowiadać lub występują problemy z kompilacją Jacka z błędem brak pamięci | Zmniejsz liczbę jednoczesnych kompilacji Jacka, edytując $HOME/.jack i zmieniając SERVER_NB_COMPILE na niższą wartość. |
Kompilacje nie udają się z powodu błędu Nie można uruchomić serwera w tle. | Najprawdopodobniej porty TCP są już używane na Twoim komputerze. Zmień raporty, edytując $HOME/.jack (zmienną SERVER_PORT_SERVICE i SERVER_PORT_ADMIN ). Aby odblokować tę sytuację, wyłącz serwer kompilacji Jacka, edytując $HOME/.jack i zmieniając SERVER na false . Niestety znacznie spowolni to kompilację i może zmusić Cię do uruchomienia make -j z kontrolą obciążenia (opcja -l w make ). |
Kompilacja się zacina bez żadnego postępu | Aby odblokować tę sytuację, zabij serwer Jack w tle, używając polecenia jack-admin kill-server , a następnie usuń katalogi tymczasowe zawarte w jack-$USER w katalogu tymczasowym (/tmp lub $TMPDIR ). |
Znajdowanie pliku dziennika Jack
Jeśli uruchomiono polecenie make
z docelowym dystrybucją, log Jacka znajduje się w folderze $ANDROID_BUILD_TOP/out/dist/logs/jack-server.log
.
W przeciwnym razie możesz znaleźć log, uruchamiając jack-admin server-log
.
W przypadku powtarzających się niepowodzeń Jack możesz uzyskać bardziej szczegółowy dziennik, ustawiając tę zmienną:
export ANDROID_JACK_EXTRA_ARGS="--verbose debug --sanity-checks on -D sched.runner=single-threaded"
Użyj standardowych poleceń makefile, aby skompilować drzewo (lub projekt), i dołącz standardowe dane wyjściowe i błąd. Aby usunąć szczegółowe dzienniki kompilacji, uruchom:
unset ANDROID_JACK_EXTRA_ARGS
Ograniczenia dotyczące dźwigu
Domyślnie serwer Jack może używać tylko jeden użytkownik na komputerze. Aby obsługiwać dodatkowych użytkowników, wybierz dla każdego z nich inny numer portu i odpowiednio dostosuj parametr SERVER_NB_COMPILE
. Możesz też wyłączyć serwer Jack, ustawiając wartość SERVER=false
w ustawieniu $HOME/.jack
.
Kompilacja CTS jest powolna z powodu obecnej integracji vm-tests-tf
.
Narzędzia do manipulowania bajtowym kodem (np. JaCoCo) nie są obsługiwane.
Użyj Jacka
Jack obsługuje język programowania Java w wersji 1.7 i integruje dodatkowe funkcje opisane poniżej.
Pre-dex
Podczas generowania pliku biblioteki Jack generowany jest .dex
biblioteki i przechowywany w pliku biblioteki .jack
jako pre-dex.
Podczas kompilowania Jack używa pre-dexa z każdej biblioteki. Wszystkie biblioteki są wstępnie zindeksujowane.
Rysunek 4. Biblioteki Jack z pre-dex.
Jack nie używa ponownie pre-dexa biblioteki, jeśli w kompilacji zastosowano kompresję, zaciemnienie lub opakowanie.
Kompilacja przyrostowa
Kompilacja przyrostowa oznacza, że ponownie kompilowane są tylko komponenty zmienione od ostatniej kompilacji (oraz ich zależności). Kompilacja przyrostowa może być znacznie szybsza niż pełna kompilacja, jeśli zmiany są ograniczone do zbioru komponentów.
Kompilacja przyrostowa jest domyślnie wyłączona (i jest automatycznie dezaktywowana, gdy włączone są kompresja, zaciemnianie, przepakowanie lub starsza wersja multi-dex). Aby włączyć kompilacje przyrostowe, dodaj ten wiersz do pliku Android.mk
projektu, który chcesz kompilować przyrostowo:
LOCAL_JACK_ENABLED := incremental
Kompresowanie i zaciemnianie
Jack używa plików konfiguracji ProGuard do kompresji i zaciemnienia.
Dostępne opcje:
@
-include
-basedirectory
-injars
-outjars
(obsługiwany jest tylko 1 plik JAR wyjściowy)-libraryjars
-keep
-keepclassmembers
-keepclasseswithmembers
-keepnames
-keepclassmembernames
-keepclasseswithmembernames
-printseeds
Opcje zmniejszania:
-dontshrink
Opcje zaciemniania:
-dontobfuscate
-printmapping
-applymapping
-obfuscationdictionary
-classobfuscationdictionary
-packageobfuscationdictionary
-useuniqueclassmembernames
-dontusemixedcaseclassnames
-keeppackagenames
-flattenpackagehierarchy
-repackageclasses
-keepattributes
-adaptclassstrings
Opcje ignorowane:
-dontoptimize
(Jack nie optymalizuje)-dontpreverify
(Jack nie jest wstępnie weryfikowany)-skipnonpubliclibraryclasses
-dontskipnonpubliclibraryclasses
-dontskipnonpubliclibraryclassmembers
-keepdirectories
-target
-forceprocessing
-printusage
-whyareyoukeeping
-optimizations
-optimizationpasses
-assumenosideeffects
-allowaccessmodification
-mergeinterfacesaggressively
-overloadaggressively
-microedition
-verbose
-dontnote
-dontwarn
-ignorewarnings
-printconfiguration
-dump
Przepakowanie
Jack używa plików konfiguracji jarjar do repakowania. Jack jest zgodny z regułami typu „reguła”, ale nie jest zgodny z regułami typu „zap” ani „keep”.
Obsługa MultiDex
Jack obsługuje wbudowaną i starszą wersję multidexu. Ponieważ pliki dex są ograniczone do 65 tys. metod, aplikacje z ponad 65 tys. metod muszą być dzielone na kilka plików dex. Więcej informacji znajdziesz w artykule Włączanie multidexu w przypadku aplikacji z ponad 64 tys. metodami.