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