Kompilieren mit Jack für Android 6.0–8.1

Mit Sammlungen den Überblick behalten Sie können Inhalte basierend auf Ihren Einstellungen speichern und kategorisieren.

Jack ist eine Android-Toolchain, die Java-Quellen 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 gezeigt.

Jack-Übersicht
Abbildung 1. Jack-Übersicht

Jack-Bibliotheksformat

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

Inhalt der Jack-Bibliotheksdatei
Abbildung 2. Inhalt der Jack-Bibliotheksdatei

Jill

Das Jill-Tool übersetzt die vorhandenen .jar -Bibliotheken in das neue Bibliotheksformat, wie unten gezeigt.

Importieren von .jar-Bibliotheken mit Jill
Abbildung 3. Workflow zum Importieren einer vorhandenen .jar -Bibliothek

Jack-Compilation-Server

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

  • Bringt eine intrinsische Beschleunigung, da es das Starten einer neuen Host-JRE-JVM, das Laden von Jack-Code, das Initialisieren von Jack und das Aufwärmen des JIT bei jeder Kompilierung vermeidet. Es bietet auch sehr gute Kompilierungszeiten bei kleinen Kompilierungen (z. B. im inkrementellen Modus).
  • Ist eine kurzfristige Lösung, um die Anzahl paralleler Jack-Compilations zu kontrollieren. Der Server vermeidet eine Überlastung Ihres Computers (Speicher- oder Festplattenprobleme), da er die Anzahl paralleler Kompilierungen begrenzt.

Der Jack-Server fährt nach einer Leerlaufzeit ohne Kompilierung herunter. Es verwendet zwei TCP-Ports auf der localhost-Schnittstelle und ist nicht extern verfügbar. Alle Parameter (Anzahl paralleler Kompilierungen, Timeout, Portnummer usw.) können durch Bearbeiten der Datei $HOME/.jack werden.

$HOME/.jack-Datei

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

  • SERVER=true aktiviert die Serverfunktion von Jack.
  • SERVER_PORT_SERVICE=8072 legt die TCP-Portnummer des Servers für Kompilierungszwecke fest.
  • SERVER_PORT_ADMIN=8073 legt die TCP-Portnummer des Servers für Verwaltungszwecke fest.
  • SERVER_COUNT=1 wird nicht verwendet.
  • SERVER_NB_COMPILE=4 legt die maximale Anzahl erlaubter paralleler Kompilierungen fest.
  • SERVER_TIMEOUT=60 legt die Anzahl der Leerlaufsekunden 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 überladen werden.
  • JACK_VM_COMMAND=${JACK_VM_COMMAND:=java} legt den Standardbefehl fest, der zum Starten einer JVM auf dem Host verwendet wird. Standardmäßig kann diese Variable durch Umgebungsvariable überladen werden.

Fehlerbehebung bei Jack-Kompilationen

Problem Aktion
Ihr Computer reagiert während der Kompilierung nicht mehr oder Jack-Kompilierungen schlagen aufgrund des Fehlers „Nicht genügend Arbeitsspeicher “ fehl Reduzieren Sie die Anzahl gleichzeitiger Jack-Kompilierungen, indem $HOME/.jack und SERVER_NB_COMPILE auf einen niedrigeren Wert ändern.
Kompilierungen schlagen fehl, wenn der Hintergrundserver nicht gestartet werden kann Die wahrscheinlichste Ursache ist, dass auf Ihrem Computer bereits TCP-Ports verwendet werden. Ändern Sie die Ports, indem $HOME/.jack (Variablen SERVER_PORT_SERVICE und SERVER_PORT_ADMIN ) bearbeiten. Um die Situation zu entsperren, deaktivieren Sie den Jack-Kompilierungsserver, indem $HOME/.jack und SERVER auf false ändern. Leider verlangsamt dies Ihre Kompilierung erheblich und kann Sie dazu zwingen, make -j mit Ladekontrolle (Option -l von make ) zu starten.
Die Kompilierung bleibt ohne Fortschritt hängen Um die Situation zu entsperren, beenden Sie den Jack-Hintergrundserver mit jack-admin kill-server ) und entfernen Sie dann die temporären Verzeichnisse, die in jack-$USER Ihres temporären Verzeichnisses ( /tmp oder $TMPDIR ) enthalten sind.

Das Jack-Protokoll finden

Wenn Sie einen make -Befehl mit einem dist-Ziel ausgeführt haben, befindet sich das Jack-Protokoll unter $ANDROID_BUILD_TOP/out/dist/logs/jack-server.log . Andernfalls können Sie das Protokoll finden, indem Sie jack-admin server-log . Bei reproduzierbaren Jack-Fehlern können Sie ein detaillierteres Protokoll erhalten, indem Sie die folgende Variable setzen:

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

Verwenden Sie Standard-Makefile-Befehle, um den Baum (oder Ihr Projekt) zu kompilieren und Standardausgabe und -fehler anzuhängen. Um detaillierte Build-Protokolle zu entfernen, führen Sie Folgendes aus:

unset ANDROID_JACK_EXTRA_ARGS

Jack-Einschränkungen

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

Mit Jack

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

Vorindexieren

Beim Generieren einer Jack-Bibliotheksdatei wird die .dex -Datei der Bibliothek generiert und in der .jack -Bibliotheksdatei als Prädex gespeichert. Beim Kompilieren verwendet Jack den Prädex aus jeder Bibliothek wieder. Alle Bibliotheken sind vorindiziert.

Jack-Bibliotheken mit Prädex
Abbildung 4. Jack-Bibliotheken mit Prädex

Jack verwendet den Prädex der Bibliothek nicht wieder, wenn bei der Kompilierung Schrumpfen, Verschleiern oder Neupacken verwendet wird.

Inkrementelle Kompilierung

Inkrementelle Kompilierung bedeutet, dass nur die seit der letzten Kompilierung berührten Komponenten (und ihre Abhängigkeiten) neu kompiliert werden. Die inkrementelle Kompilierung kann erheblich schneller sein als eine vollständige Kompilierung, wenn Änderungen auf eine Gruppe von Komponenten beschränkt sind.

Die inkrementelle Kompilierung ist standardmäßig deaktiviert (und wird automatisch deaktiviert, wenn Schrumpfen, Verschleiern, Neupacken oder Multi-Dex-Legacy aktiviert ist). Um inkrementelle Builds zu aktivieren, fügen Sie die folgende Zeile zur Android.mk -Datei des Projekts hinzu, das Sie inkrementell erstellen möchten:

LOCAL_JACK_ENABLED := incremental

Schrumpfung und Verschleierung

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

Zu den gängigen Optionen gehören die folgenden:

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

Zu den Schrumpfoptionen gehören:

  • -dontshrink

Zu den Verschleierungsoptionen gehören:

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

Zu den ignorierten Optionen gehören die folgenden:

  • -dontoptimize (Jack optimiert nicht)
  • -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

Umpacken

Jack verwendet Jarjar-Konfigurationsdateien zum Neupacken. Während Jack mit den Regeltypen „Regel“ kompatibel ist, ist es nicht mit den Regeltypen „Zap“ oder „Keep“ kompatibel.

Multidex-Unterstützung

Jack bietet native und Legacy-Multidex-Unterstützung. Da dex-Dateien auf 65.000 Methoden beschränkt sind, müssen Apps mit über 65.000 Methoden in mehrere dex-Dateien aufgeteilt werden. Weitere Einzelheiten finden Sie unter Multidex für Apps mit über 64.000 Methoden aktivieren .