Kompilacja z Jackiem (AOSP 6.0 - 8.1)

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.

Przegląd Jacka.

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

Zawartość pliku biblioteki Jack.

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.

Proces importowania istniejącej biblioteki `jar.`.

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

Znalezienie dziennika 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.

Używając Jacka

Jack obsługuje język programowania Java 1.7 i integruje dodatkowe funkcje opisane poniżej.

Przed indeksowaniem

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.

Biblioteki Jack z pre-dex.

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