Jack to domyślny łańcuch narzędzi do kompilacji Androida na Androida w wersjach 6.0–8.1
Jack to łańcuch narzędzi na Androida, który skompilował kod źródłowy Java do Android dex kod bajtowy. Nie musisz robić niczego inaczej, aby wykorzystać Jacka – wystarczy, że użyjesz do skompilowania drzewa lub projektu przy użyciu standardowych poleceń Makefile. Android 8.1 to ostatnia wersja, w której używa Jacka.
Informacje o Jacku
Jacek działa, jak widać na rys. 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 szybsze kompilacje (pre-Dex).
Rysunek 2. Zawartość pliku biblioteki Jack.
Dżili
Jak widać na ilustracji poniżej, narzędzie Jill tłumaczy istniejące dane
.jar
biblioteki do nowego formatu.
Rysunek 3. Proces importowania istniejącej biblioteki .jar
.
Serwer kompilacji Jack
Przy pierwszym użyciu Jack uruchamia się lokalny serwer kompilacji Jack pod adresem Twój komputer. Ten serwer:
- Zapewnia nieodłączne przyspieszenie, ponieważ pozwala uniknąć uruchamiania nowego środowiska JRE JRE hosta, ładowanie kodu Jack, inicjowanie Jacka i rozgrzewanie JIT kompilację danych. Zapewnia też bardzo krótki czas kompilacji, kompilacje (na przykład w trybie przyrostowym).
- Jest to krótkoterminowe rozwiązanie pozwalające kontrolować liczbę równoległych słuchawek kompilacje. Serwer unika przeciążenia komputera (problem z pamięcią lub dyskiem). bo ogranicza to liczbę równoległych kompilacji.
Serwer Jack wyłącza się po pewnym czasie bezczynności bez wykonywania kompilacji.
Wykorzystuje 2 porty TCP w interfejsie hosta lokalnego i jest niedostępny
na zewnątrz. Wszystkie parametry (liczba równoległych kompilacji, czas oczekiwania, porty
itp.) można zmienić, edytując plik $HOME/.jack
.
$HOME/.jack plik
Plik $HOME/.jack
zawiera te ustawienia Jacka
zmienne serwera w pełnej składni bash:
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 do celów administracyjnych.- Element
SERVER_COUNT=1
nie jest używany. SERVER_NB_COMPILE=4
ustawia maksymalną dozwoloną liczbę równoległych połączeń kompilacje.SERVER_TIMEOUT=60
określa liczbę sekund bezczynności serwera musi czekać bez kompilacji przed zamknięciem.SERVER_LOG=${SERVER_LOG:=$SERVER_DIR/jack-$SERVER_PORT_SERVICE.log}
ustawia plik, w którym są zapisywane logi serwera. Zmienna ta może domyślnie zawierać która jest przeciążona zmienną środowiskową.JACK_VM_COMMAND=${JACK_VM_COMMAND:=java}
ustawia wartość domyślną używane do uruchomienia maszyny JVM na hoście. Zmienna ta może domyślnie zawierać przeciążona zmienną środowiskową.
Rozwiązywanie problemów z kompilacjami Jack
Problem | Działanie |
---|---|
Podczas kompilowania komputer przestaje reagować lub występują Kompilacje typu Jack kończy się niepowodzeniem z powodu błędu Za mało pamięci | Zmniejsz liczbę równoczesnych podnośników
kompilacje przez edycję $HOME/.jack i zmianę
SERVER_NB_COMPILE na niższą wartość. |
Kompilacje kończą się błędem Nie można uruchomić serwera w tle | Najbardziej prawdopodobną przyczyną jest to, że na komputerze są już używane porty TCP. Zmień
porty poprzez edycję $HOME/.jack (SERVER_PORT_SERVICE i
SERVER_PORT_ADMIN zmiennych). Aby odblokować sytuację, wyłącz
Serwer kompilacji Jack przez edycję elementu $HOME/.jack i zmianę
SERVER do false . Niestety spowalnia to znacznie
Twojej kompilacji i może wymagać uruchomienia make -j z ładowaniem
element sterujący (opcja -l z make ). |
Kompilacja zatrzymuje się bez postępu | Aby odblokować sytuację, wyłącz serwer działający w tle za pomocą
jack-admin kill-server ), a następnie usuń katalogi tymczasowe.
zawarte w folderze jack-$USER Twojego tymczasowego katalogu
(/tmp lub $TMPDIR ). |
Znajdź log Jack
Jeśli uruchomisz polecenie make
z odległym celem, log Jack będzie miał postać
znajduje się pod adresem $ANDROID_BUILD_TOP/out/dist/logs/jack-server.log
.
W przeciwnym razie dziennik możesz znaleźć, uruchamiając jack-admin server-log
.
W przypadku możliwych do odtworzenia awarii Jacka możesz uzyskać bardziej szczegółowy dziennik:
przez ustawienie tej zmiennej:
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) dołącza standardowe dane wyjściowe i błędy. Aby usunąć szczegółowe logi kompilacji, uruchom polecenie:
unset ANDROID_JACK_EXTRA_ARGS
Ograniczenia typu Jack
Domyślnie z serwera Jack może korzystać tylko jeden użytkownik
na komputerze. Aby obsługiwać dodatkowych użytkowników, wybierz inny numer portu dla każdego z nich
użytkownika i odpowiednio dostosuj ustawienie SERVER_NB_COMPILE
. Możesz też wyłączyć
serwera Jack, ustawiając SERVER=false
w $HOME/.jack
.
Kompilacja CTS działa wolno ze względu na bieżącą integrację z usługą vm-tests-tf
.
Narzędzia do manipulacji kodem bajtowym (np. JaCoCo) nie są obsługiwane.
Użyj gniazda
Jack obsługuje język programowania Java 1.7 i integruje dodatkowe funkcji opisanych poniżej.
Pre-dex
Podczas generowania pliku biblioteki Jack obiekt .dex
biblioteki jest
generowane i przechowywane w pliku biblioteki .jack
jako plik pre-dex.
Podczas kompilacji Jacek wykorzystuje wstępnie zdefiniowany plik Dex z każdej biblioteki. Wszystkie biblioteki są
wstępnie deksowany.
Rysunek 4. Biblioteki Jack z wersją wstępnego dex.
Jack nie używa ponownie biblioteki pre-Dex w przypadku kurczenia, zaciemniania lub pomniejszania w kompilacji jest używane przepakowywanie.
Kompilacja przyrostowa
Kompilacja przyrostowa oznacza, że tylko te komponenty, które zostały zmienione od ostatniej (i ich zależności) są ponownie kompilowane. Kompilacja przyrostowa może być znacznie szybsza niż pełna kompilacja, jeśli zmiany są ograniczone do dla zestawu komponentów.
Kompilacja przyrostowa jest domyślnie wyłączona (i jest automatycznie
dezaktywowane w przypadku zmniejszania, zaciemniania, przepakowywania lub starszej wersji MultiDex
). Aby włączyć kompilacje przyrostowe, dodaj ten wiersz do
Android.mk
plik projektu, który chcesz tworzyć stopniowo:
LOCAL_JACK_ENABLED := incremental
Zmniejszanie i zaciemnianie
Jack korzysta z plików konfiguracji ProGuard, aby umożliwiać zmniejszanie zaciemnianie kodu.
Typowe opcje to:
@
-include
-basedirectory
-injars
-outjars
(obsługiwany tylko 1 wyjściowy plik XML)-libraryjars
-keep
-keepclassmembers
-keepclasseswithmembers
-keepnames
-keepclassmembernames
-keepclasseswithmembernames
-printseeds
Dostępne są te opcje zmniejszania:
-dontshrink
Opcje zaciemniania kodu:
-dontobfuscate
-printmapping
-applymapping
-obfuscationdictionary
-classobfuscationdictionary
-packageobfuscationdictionary
-useuniqueclassmembernames
-dontusemixedcaseclassnames
-keeppackagenames
-flattenpackagehierarchy
-repackageclasses
-keepattributes
-adaptclassstrings
Ignorowane opcje obejmują:
-dontoptimize
(Jacek nie przeprowadza optymalizacji)-dontpreverify
(Jacek nie przeprowadza 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 konfiguracji jarjar do przepakowywania plików. A Jacek zgodne z „regułą” reguł, nie jest on zgodny z „zap”. lub „trzymaj” typy reguł.
Obsługa Multidex
Jack oferuje wbudowaną i starszą obsługę formatu Multidex. Ponieważ pliki .dex są ograniczone aplikacje korzystające z ponad 65 tys. metod trzeba podzielić na kilka metod dex . Więcej informacji: Włącz Multidex w przypadku aplikacji, które korzystają z ponad 64 tys. metod