Kompilowanie z użyciem wtyczki Jack (AOSP 6.0–8.1)

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.

Omówienie Jacka.

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

Zawartość pliku biblioteki Jack.

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.

Przepływ pracy związany z importowaniem istniejącej biblioteki „jar.”

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, kompilacji (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.

Biblioteki Jack z wersją wstępnego dex.

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