Jack to łańcuch narzędzi dla Androida, który skompilował źródło Javy do kodu bajtowego Android dex. Nie musisz robić nic innego, aby użyć Jacka — po prostu użyj standardowych poleceń makefile, aby skompilować drzewo lub projekt. Android 8.1 to ostatnia wersja, która korzysta z Jacka.
O Jacku
Jack działa tak, jak pokazano na rysunku 1.

Format biblioteki Jack
Jack ma swój własny format pliku .jack
, który zawiera wstępnie skompilowany kod dex dla biblioteki, co pozwala na szybszą kompilację (pre-dex).

Jill
Narzędzie Jill tłumaczy istniejące biblioteki .jar
na nowy format biblioteki, jak pokazano poniżej.

.jar
Serwer kompilacji Jack
Przy pierwszym użyciu Jacka uruchamia lokalny serwer kompilacji Jacka na twoim komputerze. Ten serwer:
- Zapewnia wewnętrzne przyspieszenie, ponieważ pozwala uniknąć uruchamiania nowego hosta JRE JRE, ładowania kodu Jacka, inicjowania Jacka i rozgrzewania JIT przy każdej kompilacji. Zapewnia również bardzo dobre czasy kompilacji podczas małych kompilacji (na przykład w trybie przyrostowym).
- Jest krótkoterminowym rozwiązaniem do kontrolowania liczby równoległych kompilacji Jacka. Serwer unika przeciążenia komputera (problem z pamięcią lub dyskiem), ponieważ ogranicza liczbę równoległych kompilacji.
Serwer Jack wyłącza się po okresie bezczynności bez jakiejkolwiek kompilacji. Używa dwóch portów TCP w interfejsie localhost i nie jest dostępny zewnętrznie. Wszystkie parametry (liczba równoległych kompilacji, limit czasu, liczba portów itp.) można modyfikować edytując plik $HOME/.jack
.
Plik $HOME/.jack
Plik $HOME/.jack
zawiera następujące ustawienia zmiennych serwera Jack w pełnej składni bash:
-
SERVER=true
włącza funkcję serwera Jacka. -
SERVER_PORT_SERVICE=8072
ustawia numer portu TCP serwera do celów kompilacji. -
SERVER_PORT_ADMIN=8073
ustawia numer portu TCP serwera dla celów administratora. -
SERVER_COUNT=1
nie jest używane. -
SERVER_NB_COMPILE=4
ustawia maksymalną liczbę dozwolonych równoległych kompilacji. -
SERVER_TIMEOUT=60
ustawia liczbę sekund bezczynności, przez które serwer musi czekać bez kompilacji, zanim się wyłączy. -
SERVER_LOG=${SERVER_LOG:=$SERVER_DIR/jack-$SERVER_PORT_SERVICE.log}
ustawia plik, w którym zapisywane są dzienniki serwera. Domyślnie ta zmienna może być przeciążona przez zmienną środowiskową. -
JACK_VM_COMMAND=${JACK_VM_COMMAND:=java}
ustawia domyślną komendę używaną do uruchamiania JVM na hoście. Domyślnie ta zmienna może być przeciążona przez zmienną środowiskową.
Rozwiązywanie problemów z kompilacjami Jack
Problem | Akcja |
---|---|
Komputer przestaje odpowiadać podczas kompilacji lub kompilacje Jack nie działają z powodu błędu braku pamięci | Zmniejsz liczbę jednoczesnych kompilacji Jack, edytując $HOME/.jack i zmieniając wartość SERVER_NB_COMPILE na niższą. |
Kompilacje kończą się niepowodzeniem na Nie można uruchomić serwera w tle | Najbardziej prawdopodobną przyczyną jest to, że porty TCP są już używane na Twoim komputerze. Zmień porty, edytując $HOME/.jack ( SERVER_PORT_SERVICE i SERVER_PORT_ADMIN ). Aby odblokować sytuację, wyłącz serwer kompilacji Jack, edytując $HOME/.jack i zmieniając SERVER na false . Niestety to znacznie spowalnia twoją kompilację i może zmusić cię do uruchomienia make -j z kontrolą obciążenia (opcja -l make ). |
Kompilacja utknie bez postępów | Aby odblokować sytuację, zabij serwer Jack w tle za pomocą jack-admin kill-server ), a następnie usuń katalogi tymczasowe zawarte w jack-$USER katalogu tymczasowego ( /tmp lub $TMPDIR ). |
Znalezienie dziennika Jack
Jeśli uruchomiłeś polecenie make
z celem dist, dziennik Jacka znajduje się pod adresem $ANDROID_BUILD_TOP/out/dist/logs/jack-server.log
. W przeciwnym razie możesz znaleźć dziennik, uruchamiając jack-admin server-log
. W przypadku powtarzalnych awarii Jacka możesz uzyskać bardziej szczegółowy dziennik, ustawiając następującą zmienną:
export ANDROID_JACK_EXTRA_ARGS="--verbose debug --sanity-checks on -D sched.runner=single-threaded"
Użyj standardowych poleceń makefile do skompilowania drzewa (lub projektu) i dołącz standardowe wyjście i błąd. Aby usunąć szczegółowe dzienniki kompilacji, uruchom:
unset ANDROID_JACK_EXTRA_ARGS
Ograniczenia Jacka
- Domyślnie serwer Jack może być używany tylko przez jednego użytkownika na komputerze. Aby obsługiwać dodatkowych użytkowników, wybierz różne numery portów dla każdego użytkownika i odpowiednio dostosuj
SERVER_NB_COMPILE
. Możesz również wyłączyć serwer Jack, ustawiającSERVER=false
w$HOME/.jack
. - Kompilacja CTS jest powolna ze względu na obecną integrację
vm-tests-tf
. - Narzędzia do manipulacji kodem bajtowym (takie jak JaCoCo) nie są obsługiwane.
Korzystanie z Jacka
Jack obsługuje język programowania Java 1.7 i integruje dodatkowe funkcje opisane poniżej.
Wstępne deksowanie
Podczas generowania pliku biblioteki Jack .dex
biblioteki jest generowany i przechowywany w pliku biblioteki .jack
jako pre-dex. Podczas kompilacji Jack ponownie wykorzystuje pre-dex z każdej biblioteki. Wszystkie biblioteki są wstępnie zindeksowane.

Jack nie używa ponownie pre-dexu biblioteki, jeśli w kompilacji jest używane zmniejszanie, zaciemnianie lub przepakowywanie.
Kompilacja przyrostowa
Kompilacja przyrostowa oznacza, że tylko składniki, których dotyczyła od ostatniej kompilacji (i ich zależności), są ponownie kompilowane. Kompilacja przyrostowa może być znacznie szybsza niż pełna kompilacja, gdy zmiany są ograniczone do zestawu składników.
Kompilacja przyrostowa jest domyślnie wyłączona (i jest automatycznie dezaktywowana po włączeniu zmniejszania, zaciemniania, przepakowywania lub starszego typu multidex). Aby włączyć kompilacje przyrostowe, dodaj następujący wiersz do pliku Android.mk
projektu, który chcesz kompilować przyrostowo:
LOCAL_JACK_ENABLED := incremental
Kurczenie się i zaciemnianie
Jack używa plików konfiguracyjnych ProGuard, aby umożliwić zmniejszanie i zaciemnianie.
Typowe opcje obejmują:
-
@
-
-include
-
-basedirectory
-
-injars
-
-outjars
(obsługiwany tylko 1 jar wyjściowy) -
-libraryjars
-
-keep
-
-keepclassmembers
-
-keepclasseswithmembers
-
-keepnames
-
-keepclassmembernames
-
-keepclasseswithmembernames
-
-printseeds
Opcje kurczenia obejmują:
-
-dontshrink
Opcje zaciemniania obejmują:
-
-dontobfuscate
-
-printmapping
-
-applymapping
-
-obfuscationdictionary
-
-classobfuscationdictionary
-
-packageobfuscationdictionary
-
-useuniqueclassmembernames
-
-dontusemixedcaseclassnames
-
-keeppackagenames
-
-flattenpackagehierarchy
-
-repackageclasses
-
-keepattributes
-
-adaptclassstrings
Zignorowane opcje obejmują:
-
-dontoptimize
(Jack nie optymalizuje) -
-dontpreverify
(Jack nie dokonuje wstępnej weryfikacji) -
-skipnonpubliclibraryclasses
-
-dontskipnonpubliclibraryclasses
-
-dontskipnonpubliclibraryclassmembers
-
-keepdirectories
-
-target
-
-forceprocessing
-
-printusage
-
-whyareyoukeeping
-
-optimizations
-
-optimizationpasses
-
-assumenosideeffects
-
-allowaccessmodification
-
-mergeinterfacesaggressively
-
-overloadaggressively
-
-microedition
-
-verbose
-
-dontnote
-
-dontwarn
-
-ignorewarnings
-
-printconfiguration
-
-dump
Przepakowywanie
Jack używa plików konfiguracyjnych jarjar do przepakowywania. Chociaż Jack jest zgodny z typami reguł „reguła”, nie jest kompatybilny z typami reguł „zap” lub „zachowaj”.
Obsługa Multidex
Jack oferuje natywną i starszą obsługę multidex. Ponieważ pliki dex są ograniczone do 65 tys. metod, aplikacje z ponad 65 tys. metod muszą być podzielone na wiele plików dex. Aby uzyskać więcej informacji, zapoznaj się z sekcją Włącz multideks dla aplikacji z ponad 64 tys. metod .