Kompilieren mit Jack (AOSP 6.0 - 8.1)

Jack ist die standardmäßige Android-Build-Toolchain für Android 6.0–8.1.

Jack ist eine Android-Toolchain, die Java-Quellcode in Android-Dex-Bytecode kompiliert. Sie müssen nichts anders machen, um Jack zu verwenden. Verwenden Sie einfach Ihre Standard-Makefile-Befehle, um den Baum oder Ihr Projekt zu kompilieren. Android 8.1 ist die letzte Version, die Jack verwendet.

Über Jack

Jack funktioniert wie in Abbildung 1 dargestellt.

Übersicht über Jack

Abbildung 1. Jack im Überblick.

Jack-Bibliotheksformat

Jack hat ein eigenes .jack-Dateiformat, das den vorkompilierten DEX-Code für die Bibliothek enthält, was eine schnellere Kompilierung (Pre-dex) ermöglicht.

Inhalt der Jack-Bibliotheksdatei.

Abbildung 2: Inhalt der Jack-Bibliotheksdatei.

Jana

Wie in der folgenden Abbildung dargestellt, übersetzt das Jill-Tool die vorhandenen .jar-Bibliotheken in das neue Bibliotheksformat.

Workflow zum Importieren einer vorhandenen „jar.“-Bibliothek.

Abbildung 3: Workflow zum Importieren einer vorhandenen .jar-Bibliothek.

Jack-Kompilierungsserver

Wenn Jack zum ersten Mal verwendet wird, startet er einen lokalen Jack-Kompilierungsserver auf Ihrem Computer. Dieser Server:

  • Es sorgt für eine intrinsische Beschleunigung, da es vermeidet, eine neue Host-JRE-JVM zu starten, Jack-Code zu laden, Jack zu initialisieren und die JIT bei jeder Kompilierung aufzuwärmen. Außerdem bietet es sehr gute Kompilierungszeiten bei kleinen Kompilierungen (z. B. im inkrementellen Modus).
  • Ist eine kurzfristige Lösung zur Steuerung der Anzahl paralleler Jack-Kompilierungen. Der Server verhindert eine Überlastung Ihres Computers (Speicher- oder Laufwerkproblem), da die Anzahl der parallelen Kompilierungen begrenzt wird.

Der Jack-Server schaltet sich nach einer Inaktivitätszeit ohne Kompilierung selbst herunter. Sie verwendet zwei TCP-Ports auf der localhost-Schnittstelle und ist extern nicht verfügbar. Alle Parameter (Anzahl der parallelen Kompilierungen, Zeitlimit, Anzahl der Ports usw.) können durch Bearbeiten der Datei $HOME/.jack geändert werden.

Datei $HOME/.jack

Die Datei $HOME/.jack enthält die folgenden Einstellungen für Jack-Servervariablen in voller Bash-Syntax:

  • SERVER=true aktiviert die Serverfunktion von Jack.
  • SERVER_PORT_SERVICE=8072 legt die TCP-Portnummer des Servers für die Kompilierung fest.
  • SERVER_PORT_ADMIN=8073 legt die TCP-Portnummer des Servers für Administratorzwecke fest.
  • SERVER_COUNT=1 wird nicht verwendet.
  • SERVER_NB_COMPILE=4 legt die maximale Anzahl zulässiger paralleler Kompilierungen fest. SERVER_TIMEOUT=60 legt die Anzahl der inaktiven Sekunden fest, die der Server ohne Kompilierung warten muss, bevor er sich selbst herunterfährt. SERVER_LOG=${SERVER_LOG:=$SERVER_DIR/jack-$SERVER_PORT_SERVICE.log} legt die Datei fest, in die Serverprotokolle geschrieben werden. Standardmäßig kann diese Variable durch eine Umgebungsvariable überlastet werden.
  • Mit JACK_VM_COMMAND=${JACK_VM_COMMAND:=java} wird der Standardbefehl festgelegt, mit dem eine JVM auf dem Host gestartet wird. Standardmäßig kann diese Variable durch eine Umgebungsvariable überlastet werden.

Fehlerbehebung bei Jack-Kompilationen

Problem Aktion
Ihr Computer reagiert während der Kompilierung nicht mehr oder die Jack-Kompilierung schlägt aufgrund des Fehlers Out of memory (Nicht genügend Arbeitsspeicher) fehl. Reduzieren Sie die Anzahl der gleichzeitigen Jack-Kompilierungen, indem Sie $HOME/.jack bearbeiten und SERVER_NB_COMPILE auf einen niedrigeren Wert setzen.
Kompilierungen schlagen auf dem folgenden3 fehl: Hintergrundserver kann nicht gestartet werden Die wahrscheinlichste Ursache ist, dass die TCP-Ports bereits auf Ihrem Computer verwendet werden. Ändern Sie Berichte, indem Sie $HOME/.jack (SERVER_PORT_SERVICE- und SERVER_PORT_ADMIN-Variablen) bearbeiten. Deaktivieren Sie zum Aufheben der Blockierung den Server für die Jack-Kompilierung. Bearbeiten Sie dazu $HOME/.jack und ändern Sie SERVER in false. Leider verlangsamt dies die Kompilierung erheblich und kann Sie dazu zwingen, make -j mit Laststeuerung zu starten (Option -l von make).
Die Kompilierung bleibt hängen, ohne dass es zu einem Fortschritt kommt Beenden Sie den Jack-Hintergrundserver mit jack-admin kill-server und entfernen Sie dann die temporären Verzeichnisse in jack-$USER Ihres temporären Verzeichnisses (/tmp oder $TMPDIR).

Jack-Protokoll suchen

Wenn Sie einen make-Befehl mit dem Ziel „dist“ ausgeführt haben, befindet sich das Jack-Protokoll unter $ANDROID_BUILD_TOP/out/dist/logs/jack-server.log. Andernfalls können Sie das Log abrufen, indem Sie jack-admin server-log ausführen. Bei reproduzierbaren Jack-Fehlern können Sie ein detaillierteres Log abrufen, indem Sie die folgende Variable festlegen:

export ANDROID_JACK_EXTRA_ARGS="--verbose debug --sanity-checks on -D sched.runner=single-threaded"

Verwenden Sie Makefile-Standardbefehle, um die Baumstruktur (oder Ihr Projekt) zu kompilieren und die Standardausgabe und die Standardfehlerausgabe anzuhängen. Führen Sie Folgendes aus, um detaillierte Build-Logs zu entfernen:

unset ANDROID_JACK_EXTRA_ARGS

Jack-Einschränkungen

Standardmäßig kann der Jack-Server nur von einem Nutzer auf einem Computer verwendet werden. Wenn Sie weitere Nutzer unterstützen möchten, wählen Sie für jeden Nutzer unterschiedliche Portnummern aus und passen Sie SERVER_NB_COMPILE entsprechend an. Sie können den Jack-Server auch deaktivieren, indem Sie SERVER=false auf $HOME/.jack setzen. Die CTS-Kompilierung ist aufgrund der aktuellen vm-tests-tf-Integration langsam. Tools zur Bytecode-Manipulation (wie JaCoCo) werden nicht unterstützt.

Jack verwenden

Jack unterstützt die Java-Programmiersprache 1.7 und integriert die unten beschriebenen zusätzlichen Funktionen.

Predexing

Beim Generieren einer Jack-Bibliotheksdatei wird der .dex der Bibliothek generiert und in der .jack-Bibliotheksdatei als Pre-dex gespeichert. Beim Kompilieren verwendet Jack den Pre-Dex aus jeder Bibliothek wieder. Alle Bibliotheken sind bereits indexiert.

Jack Libraries mit Pre-dex.

Abbildung 4: Jack-Bibliotheken mit vorkonfiguriertem Dex

Jack verwendet die Bibliothek vor dem Dex nicht wieder, wenn bei der Kompilierung die Bibliothek verkleinert, verschleiert oder neu zusammengestellt wird.

Inkrementelle Kompilierung

Bei der inkrementellen Kompilierung werden nur die seit der letzten Kompilierung betroffenen Komponenten und ihre Abhängigkeiten neu kompiliert. Die inkrementelle Kompilierung kann erheblich schneller sein als eine vollständige Kompilierung, wenn Änderungen auf eine Reihe von Komponenten beschränkt sind.

Die inkrementelle Kompilierung ist standardmäßig deaktiviert (und wird automatisch deaktiviert, wenn die Verkleinerung, Verschleierung, Neubündelung oder Multi-Dex-Legacy aktiviert ist). Wenn Sie inkrementelle Builds aktivieren möchten, fügen Sie der Android.mk-Datei des Projekts, das Sie inkrementell erstellen möchten, die folgende Zeile hinzu:

LOCAL_JACK_ENABLED := incremental

Verkürzung und Verschleierung

Jack verwendet ProGuard-Konfigurationsdateien, um die Verkleinerung und Verschleierung zu ermöglichen.

Gängige Optionen:

  • @
  • -include
  • -basedirectory
  • -injars
  • -outjars (nur 1 Ausgabe-JAR-Datei wird unterstützt)
  • -libraryjars
  • -keep
  • -keepclassmembers
  • -keepclasseswithmembers
  • -keepnames
  • -keepclassmembernames
  • -keepclasseswithmembernames
  • -printseeds

Folgende Optionen sind verfügbar:

  • -dontshrink

Zu den Optionen für die Verschleierung gehören:

  • -dontobfuscate
  • -printmapping
  • -applymapping
  • -obfuscationdictionary
  • -classobfuscationdictionary
  • -packageobfuscationdictionary
  • -useuniqueclassmembernames
  • -dontusemixedcaseclassnames
  • -keeppackagenames
  • -flattenpackagehierarchy
  • -repackageclasses
  • -keepattributes
  • -adaptclassstrings

Folgende Optionen werden ignoriert:

  • -dontoptimize (Jack führt keine Optimierung durch)
  • -dontpreverify (Jack führt keine Vorabprüfung durch)
  • -skipnonpubliclibraryclasses
  • -dontskipnonpubliclibraryclasses
  • -dontskipnonpubliclibraryclassmembers
  • -keepdirectories
  • -target
  • -forceprocessing
  • -printusage
  • -whyareyoukeeping
  • -optimizations
  • -optimizationpasses
  • -assumenosideeffects
  • -allowaccessmodification
  • -mergeinterfacesaggressively
  • -overloadaggressively
  • -microedition
  • -verbose
  • -dontnote
  • -dontwarn
  • -ignorewarnings
  • -printconfiguration
  • -dump

Neu verpacken

Jack verwendet JarJar-Konfigurationsdateien für das Umpacken. Jack ist zwar mit den Regeltypen "Regel" kompatibel, nicht jedoch mit den Regeltypen "Zap" oder "Beibehalten".

Multidex-Unterstützung

Jack bietet integrierte und ältere Multidex-Unterstützung. Da DEX-Dateien auf 65.000 Methoden begrenzt sind, müssen Anwendungen mit über 65.000 Methoden in mehrere DEX-Dateien aufgeteilt werden. Weitere Informationen finden Sie unter Multidex für Apps mit mehr als 64.000 Methoden aktivieren.