Jack è la toolchain di build Android predefinita per Android 6.0 - 8.1
Jack è una toolchain di Android che compilava il codice sorgente Java nel dexbytecode di Android. Non devi fare nulla di diverso per usare Jack: puoi usare i tuoi comandi makefile standard per compilare l'albero o il progetto. Android 8.1 è l'ultima release che utilizza Jack.
Informazioni su Jack
Jack funziona come mostrato nella Figura 1.
Figura 1. Panoramica di Jack.
Formato della libreria Jack
Jack ha un proprio formato file .jack
che contiene il codice dex precompilato per la libreria, consentendo una compilazione più rapida (pre-dex).
Figura 2. Contenuti del file della raccolta Jack.
Giulia
Come mostrato nella figura seguente, lo strumento Jill traduce le librerie .jar
esistenti nel nuovo formato della libreria.
Figura 3. Flusso di lavoro per importare una libreria .jar
esistente.
Server di compilazione di Jack
La prima volta che viene utilizzato, Jack avvia un server di compilazione Jack locale sul tuo computer. Questo server:
- Porta una velocità intrinseca perché evita di avviare una nuova JVM JRE host, di caricare codice Jack, di inizializzare Jack e di riscaldare JIT in ogni compilazione. Offre inoltre tempi di compilazione molto buoni durante le compilazioni di piccole dimensioni (ad esempio in modalità incrementale).
- È una soluzione a breve termine per controllare il numero di compilazioni Jack parallele. Il server evita di sovraccaricare il computer (problema di memoria o disco) perché limita il numero di compilazioni parallele.
Il server Jack si arresta dopo un periodo di inattività senza alcuna compilazione.
Utilizza due porte TCP sull'interfaccia localhost e non è disponibile esternamente. Tutti i parametri (numero di compilazioni parallele, timeout, numero di porte e così via) possono essere modificati modificando il file $HOME/.jack
.
file $HOME/.jack
Il file $HOME/.jack
contiene le seguenti impostazioni per le variabili
del server Jack con una sintassi bash completa:
SERVER=true
attiva la funzionalità del server di Jack.SERVER_PORT_SERVICE=8072
imposta il numero di porta TCP del server per la compilazione.SERVER_PORT_ADMIN=8073
imposta il numero di porta TCP del server per finalità amministrative.SERVER_COUNT=1
non è utilizzato.SERVER_NB_COMPILE=4
imposta il numero massimo di compilazioni parallele consentite.SERVER_TIMEOUT=60
imposta il numero di secondi di inattività che il server deve attendere senza alcuna compilazione prima di arrestarsi.SERVER_LOG=${SERVER_LOG:=$SERVER_DIR/jack-$SERVER_PORT_SERVICE.log}
imposta il file in cui vengono scritti i log del server. Per impostazione predefinita, questa variabile può essere sovraccaricata da una variabile di ambiente.JACK_VM_COMMAND=${JACK_VM_COMMAND:=java}
imposta il comando predefinito utilizzato per avviare una JVM sull'host. Per impostazione predefinita, questa variabile può essere sovraccaricata da una variabile di ambiente.
Risolvere i problemi di compilazione di Jack
Problema | Azione |
---|---|
Il computer non risponde durante la compilazione oppure riscontri errori di compilazione con Jack con Errore di memoria insufficiente | Riduci il numero di compilazioni di Jack contemporaneamente modificando $HOME/.jack e impostando SERVER_NB_COMPILE su un valore inferiore. |
Le compilazioni non riescono a eseguire l'operazione Impossibile avviare il server in background | La causa più probabile è che le porte TCP siano già utilizzate sul tuo computer. Modifica
le esportazioni modificando $HOME/.jack (variabili SERVER_PORT_SERVICE e
SERVER_PORT_ADMIN ). Per sbloccare la situazione, disattiva il
server di compilazione Jack modificando $HOME/.jack e impostando
SERVER su false . Purtroppo, questo rallenta notevolmente la compilazione e potrebbe costringerti ad avviare make -j con il controllo del carico (opzione -l di make ). |
La compilazione si blocca senza alcun progresso | Per sbloccare la situazione, termina il server in background di Jack utilizzando jack-admin kill-server ), quindi rimuovi le directory temporanee contenute in jack-$USER della directory temporanea (/tmp o $TMPDIR ). |
Trovare il log di Jack
Se hai eseguito un comando make
con una destinazione dist, il log di Jack si trova in $ANDROID_BUILD_TOP/out/dist/logs/jack-server.log
.
In caso contrario, puoi trovare il log eseguendo jack-admin server-log
.
In caso di errori Jack riproducibili, puoi ottenere un log più dettagliato impostando la seguente variabile:
export ANDROID_JACK_EXTRA_ARGS="--verbose debug --sanity-checks on -D sched.runner=single-threaded"
Usa i comandi makefile standard per compilare la struttura ad albero (o il tuo progetto) e collegare output ed errore standard. Per rimuovere i log di compilazione dettagliati, esegui:
unset ANDROID_JACK_EXTRA_ARGS
Limitazioni di Jack
Per impostazione predefinita, il server Jack può essere utilizzato da un solo utente su un computer. Per supportare utenti aggiuntivi, seleziona numeri di porta diversi per ciascun
utente e modifica SERVER_NB_COMPILE
di conseguenza. Puoi anche disabilitare il server Jack impostando SERVER=false
in $HOME/.jack
.
La compilazione CTS è lenta a causa dell'attuale integrazione di vm-tests-tf
.
Gli strumenti di manipolazione del bytecode (ad esempio JaCoCo) non sono supportati.
Usare Jack
Jack supporta il linguaggio di programmazione Java 1.7 e integra le funzionalità aggiuntive descritte di seguito.
Pre-dex
Quando generi un file della libreria Jack, il .dex
della libreria viene
generato e archiviato all'interno del file della libreria .jack
come pre-dex.
Durante la compilazione, Jack riutilizza il pre-dex di ogni raccolta. Tutte le librerie vengono
predefinite.
Figura 4. Librerie jack con pre-dex.
Jack non riutilizza la libreria pre-dex se nella compilazione vengono utilizzati il rimpicciolimento, l'offuscamento o il riepacchiamento.
Compilazione incrementale
La compilazione incrementale prevede che solo i componenti interessati dall'ultima compilazione (e le relative dipendenze) vengono ricompilati. La compilazione incrementale può essere molto più rapida di una compilazione completa se le modifiche sono limitate a un insieme di componenti.
La compilazione incrementale è disabilitata per impostazione predefinita (e viene disattivata automaticamente quando sono abilitati le operazioni di riduzione, offuscamento, ripacchettizzazione o multi-dex di legacy). Per attivare le build incrementali, aggiungi la seguente riga al
Android.mk
file del progetto di cui vuoi eseguire la compilazione incrementale:
LOCAL_JACK_ENABLED := incremental
Riduzione e offuscamento
Jack utilizza i file di configurazione ProGuard per consentire la riduzione e l'offuscamento.
Le opzioni più comuni sono:
@
-include
-basedirectory
-injars
-outjars
(solo 1 jar di output supportato)-libraryjars
-keep
-keepclassmembers
-keepclasseswithmembers
-keepnames
-keepclassmembernames
-keepclasseswithmembernames
-printseeds
Le opzioni di riduzione sono le seguenti:
-dontshrink
Le opzioni di offuscamento sono le seguenti:
-dontobfuscate
-printmapping
-applymapping
-obfuscationdictionary
-classobfuscationdictionary
-packageobfuscationdictionary
-useuniqueclassmembernames
-dontusemixedcaseclassnames
-keeppackagenames
-flattenpackagehierarchy
-repackageclasses
-keepattributes
-adaptclassstrings
Le opzioni ignorate includono:
-dontoptimize
(Jack non ottimizza)-dontpreverify
(Jack non esegue la preverifica)-skipnonpubliclibraryclasses
-dontskipnonpubliclibraryclasses
-dontskipnonpubliclibraryclassmembers
-keepdirectories
-target
-forceprocessing
-printusage
-whyareyoukeeping
-optimizations
-optimizationpasses
-assumenosideeffects
-allowaccessmodification
-mergeinterfacesaggressively
-overloadaggressively
-microedition
-verbose
-dontnote
-dontwarn
-ignorewarnings
-printconfiguration
-dump
Riconfezionamento
Per la ripacchettizzazione, Jack usa i file di configurazione jar. Sebbene Jack sia compatibile con i tipi di regole "rule", non è compatibile con i tipi di regole "zap" o "keep".
Supporto multidex
Jack offre il supporto multidex integrato e legacy. Poiché i file dex sono limitati a 65.000 metodi, le app con più di 65.000 metodi devono essere suddivise in più file dex. Per maggiori dettagli, consulta Abilitare multidex per le app con più di 64.000 metodi