Jack to domyślny zestaw narzędzi do budowania systemu Android dla systemu Android 6.0–8.1
Jack to zestaw narzędzi dla systemu Android, który skompilował źródło Java do kodu bajtowego Androida dex. Nie musisz robić nic innego, aby używać Jacka - po prostu użyj standardowych poleceń makefile, aby skompilować drzewo lub swój projekt. Android 8.1 to ostatnia wersja korzystająca z Jacka.
O Jacku
Jack działa jak pokazano na rysunku 1.
Rysunek 1. Przegląd podnośnika.
Format biblioteki Jack
Jack ma swój własny format pliku .jack
, który zawiera wstępnie skompilowany kod dex dla biblioteki, pozwalający na szybszą kompilację (pre-dex).
Rysunek 2. Zawartość pliku biblioteki Jack.
Jill
Jak pokazano na poniższym rysunku, narzędzie Jill tłumaczy istniejące biblioteki .jar
na nowy format biblioteki.
Rysunek 3. Proces importowania istniejącej biblioteki .jar
.
Serwer kompilacji Jacka
Przy pierwszym użyciu Jacka uruchamia on lokalny serwer kompilacji Jacka na Twoim komputerze. Ten serwer:
- Zapewnia wewnętrzne przyspieszenie, ponieważ pozwala uniknąć uruchamiania nowej hosta JRE JVM, ł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 to krótkoterminowe rozwiązanie umożliwiające kontrolę liczby równoległych kompilacji Jacka. Serwer unika przeciążenia komputera (problem z pamięcią lub dyskiem), ponieważ ogranicza liczbę kompilacji równoległych.
Serwer Jack wyłącza się po pewnym czasie bezczynności bez żadnej kompilacji. Wykorzystuje dwa porty TCP w interfejsie hosta lokalnego i nie jest dostępny zewnętrznie. Wszystkie parametry (liczba kompilacji równoległych, limit czasu, numer 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ę serwerową Jacka. -
SERVER_PORT_SERVICE=8072
ustawia numer portu TCP serwera na potrzeby kompilacji. -
SERVER_PORT_ADMIN=8073
ustawia numer portu TCP serwera dla celów administratora. -
SERVER_COUNT=1
jest nieużywany. -
SERVER_NB_COMPILE=4
ustawia maksymalną liczbę dozwolonych kompilacji równoległych.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ą logi serwera. Domyślnie zmienna ta może być przeciążana przez zmienną środowiskową. -
JACK_VM_COMMAND=${JACK_VM_COMMAND:=java}
ustawia domyślne polecenie używane do uruchamiania maszyny JVM na hoście. Domyślnie zmienna ta może być przeciążana przez zmienną środowiskową.
Rozwiązywanie problemów z kompilacjami Jacka
Problem | Działanie |
---|---|
Komputer przestaje odpowiadać podczas kompilacji lub kompilacje Jacka kończą się niepowodzeniem z powodu błędu braku pamięci | Zmniejsz liczbę jednoczesnych kompilacji Jacka, edytując $HOME/.jack i zmieniając SERVER_NB_COMPILE na niższą wartość. |
Kompilacje nie powiodły się w przypadku błędu 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 (zmienne SERVER_PORT_SERVICE i SERVER_PORT_ADMIN ). Aby odblokować sytuację, wyłącz serwer kompilacji Jacka, edytując $HOME/.jack i zmieniając SERVER na false . Niestety to znacznie spowalnia kompilację i może zmusić cię do uruchomienia make -j z kontrolą ładowania (opcja -l make ). |
Kompilacja blokuje się bez postępu | Aby odblokować sytuację, zabij serwer Jack w tle za pomocą jack-admin kill-server ), a następnie usuń katalogi tymczasowe zawarte w jack-$USER twojego katalogu tymczasowego ( /tmp lub $TMPDIR ). |
Znajdź dziennik Jacka
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żna 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, aby skompilować drzewo (lub swój projekt) i dołączyć standardowe wyjście i błąd. Aby usunąć szczegółowe dzienniki kompilacji, uruchom:
unset ANDROID_JACK_EXTRA_ARGS
Ograniczenia Jacka
Domyślnie z serwera Jack może korzystać tylko jeden użytkownik na komputerze. Aby obsłużyć dodatkowych użytkowników, wybierz różne numery portów dla każdego użytkownika i odpowiednio dostosuj SERVER_NB_COMPILE
. Możesz także wyłączyć serwer Jack, ustawiając SERVER=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.
Wykorzystaj Jacka
Jack obsługuje język programowania Java 1.7 i integruje dodatkowe funkcje opisane poniżej.
Przed deks
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 zdeksowane.
Rysunek 4. Biblioteki Jack z pre-dex.
Jack nie używa ponownie pre-dexu biblioteki, jeśli w kompilacji zastosowano zmniejszanie, zaciemnianie lub przepakowywanie.
Kompilacja przyrostowa
Kompilacja przyrostowa oznacza, że rekompilowane są tylko te komponenty, które zostały dotknięte od ostatniej kompilacji (i ich zależności). Kompilacja przyrostowa może być znacznie szybsza niż kompilacja pełna, jeśli zmiany ograniczają się do zestawu komponentów.
Kompilacja przyrostowa jest domyślnie wyłączona (i jest automatycznie dezaktywowana po włączeniu zmniejszania, zaciemniania, przepakowywania lub starszej wersji multidex). Aby włączyć kompilacje przyrostowe, dodaj następujący wiersz do pliku Android.mk
projektu, który chcesz budować przyrostowo:
LOCAL_JACK_ENABLED := incremental
Zmniejszanie i zaciemnianie
Jack używa plików konfiguracyjnych ProGuard, aby umożliwić zmniejszanie i zaciemnianie.
Typowe opcje obejmują:
-
@
-
-include
-
-basedirectory
-
-injars
-
-outjars
(obsługiwany jest tylko 1 słoik wyjściowy) -
-libraryjars
-
-keep
-
-keepclassmembers
-
-keepclasseswithmembers
-
-keepnames
-
-keepclassmembernames
-
-keepclasseswithmembernames
-
-printseeds
Opcje zmniejszania obejmują:
-
-dontshrink
Opcje zaciemniania obejmują:
-
-dontobfuscate
-
-printmapping
-
-applymapping
-
-obfuscationdictionary
-
-classobfuscationdictionary
-
-packageobfuscationdictionary
-
-useuniqueclassmembernames
-
-dontusemixedcaseclassnames
-
-keeppackagenames
-
-flattenpackagehierarchy
-
-repackageclasses
-
-keepattributes
-
-adaptclassstrings
Ignorowane 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 kompatybilny z typami reguł „rule”, nie jest kompatybilny z typami reguł „zap” i „keep”.
Obsługa Multidexu
Jack oferuje wbudowaną i starszą obsługę multidex. Ponieważ pliki dex są ograniczone do 65 000 metod, aplikacje zawierające ponad 65 000 metod muszą zostać podzielone na wiele plików dex. Aby uzyskać więcej informacji, zobacz Włącz multidex dla aplikacji z ponad 64 tys. metod
,Jack to domyślny zestaw narzędzi do budowania systemu Android dla systemu Android 6.0–8.1
Jack to zestaw narzędzi dla Androida, który skompilował źródło Java do kodu bajtowego Androida dex. Nie musisz robić nic innego, aby używać Jacka - po prostu użyj standardowych poleceń makefile, aby skompilować drzewo lub swój projekt. Android 8.1 to ostatnia wersja korzystająca z Jacka.
O Jacku
Jack działa jak pokazano na rysunku 1.
Rysunek 1. Przegląd podnośnika.
Format biblioteki Jack
Jack ma swój własny format pliku .jack
, który zawiera wstępnie skompilowany kod dex dla biblioteki, pozwalający na szybszą kompilację (pre-dex).
Rysunek 2. Zawartość pliku biblioteki Jack.
Jill
Jak pokazano na poniższym rysunku, narzędzie Jill tłumaczy istniejące biblioteki .jar
na nowy format biblioteki.
Rysunek 3. Proces importowania istniejącej biblioteki .jar
.
Serwer kompilacji Jacka
Przy pierwszym użyciu Jacka uruchamia on lokalny serwer kompilacji Jacka na Twoim komputerze. Ten serwer:
- Zapewnia wewnętrzne przyspieszenie, ponieważ pozwala uniknąć uruchamiania nowej hosta JRE JVM, ł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 to krótkoterminowe rozwiązanie umożliwiające kontrolę liczby równoległych kompilacji Jacka. Serwer unika przeciążenia komputera (problem z pamięcią lub dyskiem), ponieważ ogranicza liczbę kompilacji równoległych.
Serwer Jack wyłącza się po pewnym czasie bezczynności bez żadnej kompilacji. Wykorzystuje dwa porty TCP w interfejsie hosta lokalnego i nie jest dostępny zewnętrznie. Wszystkie parametry (liczba kompilacji równoległych, limit czasu, numer 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ę serwerową Jacka. -
SERVER_PORT_SERVICE=8072
ustawia numer portu TCP serwera na potrzeby kompilacji. -
SERVER_PORT_ADMIN=8073
ustawia numer portu TCP serwera dla celów administratora. -
SERVER_COUNT=1
jest nieużywany. -
SERVER_NB_COMPILE=4
ustawia maksymalną liczbę dozwolonych kompilacji równoległych.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ą logi serwera. Domyślnie zmienna ta może być przeciążana przez zmienną środowiskową. -
JACK_VM_COMMAND=${JACK_VM_COMMAND:=java}
ustawia domyślne polecenie używane do uruchamiania maszyny JVM na hoście. Domyślnie zmienna ta może być przeciążana przez zmienną środowiskową.
Rozwiązywanie problemów z kompilacjami Jacka
Problem | Działanie |
---|---|
Komputer przestaje odpowiadać podczas kompilacji lub kompilacje Jacka kończą się niepowodzeniem z powodu błędu braku pamięci | Zmniejsz liczbę jednoczesnych kompilacji Jacka, edytując $HOME/.jack i zmieniając SERVER_NB_COMPILE na niższą wartość. |
Kompilacje nie powiodły się w przypadku błędu 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 (zmienne SERVER_PORT_SERVICE i SERVER_PORT_ADMIN ). Aby odblokować sytuację, wyłącz serwer kompilacji Jacka, edytując $HOME/.jack i zmieniając SERVER na false . Niestety to znacznie spowalnia kompilację i może zmusić cię do uruchomienia make -j z kontrolą ładowania (opcja -l make ). |
Kompilacja blokuje się bez postępu | Aby odblokować sytuację, zabij serwer Jack w tle za pomocą jack-admin kill-server ), a następnie usuń katalogi tymczasowe zawarte w jack-$USER twojego katalogu tymczasowego ( /tmp lub $TMPDIR ). |
Znajdź dziennik Jacka
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żna 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, aby skompilować drzewo (lub swój projekt) i dołączyć standardowe wyjście i błąd. Aby usunąć szczegółowe dzienniki kompilacji, uruchom:
unset ANDROID_JACK_EXTRA_ARGS
Ograniczenia Jacka
Domyślnie z serwera Jack może korzystać tylko jeden użytkownik na komputerze. Aby obsłużyć dodatkowych użytkowników, wybierz różne numery portów dla każdego użytkownika i odpowiednio dostosuj SERVER_NB_COMPILE
. Możesz także wyłączyć serwer Jack, ustawiając SERVER=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.
Wykorzystaj Jacka
Jack obsługuje język programowania Java 1.7 i integruje dodatkowe funkcje opisane poniżej.
Przed-deks
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 zdeksowane.
Rysunek 4. Biblioteki Jack z pre-dex.
Jack nie używa ponownie pre-dexu biblioteki, jeśli w kompilacji zastosowano zmniejszanie, zaciemnianie lub przepakowywanie.
Kompilacja przyrostowa
Kompilacja przyrostowa oznacza, że rekompilowane są tylko te komponenty, które zostały dotknięte od ostatniej kompilacji (i ich zależności). Kompilacja przyrostowa może być znacznie szybsza niż kompilacja pełna, jeśli zmiany ograniczają się do zestawu komponentów.
Kompilacja przyrostowa jest domyślnie wyłączona (i jest automatycznie dezaktywowana po włączeniu zmniejszania, zaciemniania, przepakowywania lub starszej wersji multidex). Aby włączyć kompilacje przyrostowe, dodaj następujący wiersz do pliku Android.mk
projektu, który chcesz budować przyrostowo:
LOCAL_JACK_ENABLED := incremental
Zmniejszanie i zaciemnianie
Jack używa plików konfiguracyjnych ProGuard, aby umożliwić zmniejszanie i zaciemnianie.
Typowe opcje obejmują:
-
@
-
-include
-
-basedirectory
-
-injars
-
-outjars
(obsługiwany jest tylko 1 słoik wyjściowy) -
-libraryjars
-
-keep
-
-keepclassmembers
-
-keepclasseswithmembers
-
-keepnames
-
-keepclassmembernames
-
-keepclasseswithmembernames
-
-printseeds
Opcje zmniejszania obejmują:
-
-dontshrink
Opcje zaciemniania obejmują:
-
-dontobfuscate
-
-printmapping
-
-applymapping
-
-obfuscationdictionary
-
-classobfuscationdictionary
-
-packageobfuscationdictionary
-
-useuniqueclassmembernames
-
-dontusemixedcaseclassnames
-
-keeppackagenames
-
-flattenpackagehierarchy
-
-repackageclasses
-
-keepattributes
-
-adaptclassstrings
Ignorowane 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 kompatybilny z typami reguł „rule”, nie jest kompatybilny z typami reguł „zap” i „keep”.
Obsługa Multidexu
Jack oferuje wbudowaną i starszą obsługę multidex. Ponieważ pliki dex są ograniczone do 65 000 metod, aplikacje zawierające ponad 65 000 metod muszą zostać podzielone na wiele plików dex. Aby uzyskać więcej informacji, zobacz Włącz multidex dla aplikacji z ponad 64 tys. metod