Kompilacja z Jackiem dla Androida 6.0–8.1

Zadbaj o dobrą organizację dzięki kolekcji Zapisuj i kategoryzuj treści zgodnie ze swoimi preferencjami.

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.

Przegląd Jack
Rysunek 1. Przegląd gniazd

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

Zawartość pliku biblioteki Jack
Rysunek 2. Zawartość pliku biblioteki Jack

Jill

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

Importowanie bibliotek .jar za pomocą Jill
Rysunek 3. Przepływ pracy do importowania istniejącej biblioteki .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ą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.

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.

Biblioteki Jack z pre-dex
Rysunek 4. Biblioteki Jack z pre-dex

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 .