Jack è la toolchain di build Android predefinita per Android 6.0 - 8.1
Jack è una toolchain Android che compila il codice sorgente Java in bytecode dex Android. Per utilizzare Jack non devi fare nulla di diverso: ti basta usare i comandi makefile standard per compilare l'albero o il progetto. Android 8.1 è l'ultima release che utilizza Jack.
Informazioni su Jack
Il jack funziona come mostrato nella Figura 1.
Figura 1. Panoramica del jack.
Formato della libreria Jack
Jack ha un proprio formato di file .jack
che contiene il codice dex precompilato
per la libreria, consentendo una compilazione più rapida (pre-dex).
Figura 2. Contenuti del file della libreria Jack.
Jill
Come mostrato nella figura seguente, lo strumento Jill converte le librerie .jar
esistenti nel nuovo formato.
Figura 3. Flusso di lavoro per importare una libreria .jar
esistente.
Server di compilazione Jack
La prima volta che viene utilizzato Jack, viene avviato un server di compilazione Jack locale sul tuo computer. Questo server:
- Offre un'accelerazione intrinseca perché evita di avviare una nuova JVM JRE host, di caricare il codice Jack, di inizializzare Jack e di riscaldare il JIT a ogni compilazione. Inoltre, offre tempi di compilazione molto buoni durante le piccole compilazioni (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 spegne 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 in una sintassi bash completa:
SERVER=true
attiva la funzionalità server di Jack.SERVER_PORT_SERVICE=8072
imposta il numero di porta TCP del server a scopo di compilazione.SERVER_PORT_ADMIN=8073
imposta il numero di porta TCP del server per scopi amministrativi.SERVER_COUNT=1
non viene 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 spegnersi.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 sovrascritta 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 sovrascritta dalla variabile di ambiente.
Risolvere i problemi relativi alle compilation di Jack
Problema | Azione |
---|---|
Il computer non risponde durante la compilazione o si verificano errori di compilazione Jack a causa di un errore di memoria insufficiente | Riduci il numero di compilazioni simultanee di Jack modificando $HOME/.jack e impostando SERVER_NB_COMPILE su un valore inferiore. |
Le compilazioni non riescono a causa di Impossibile avviare il server in background | La causa più probabile è che le porte TCP siano già in uso sul computer. Modifica
le porte 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 avanzamento | Per sbloccare la situazione, termina il server in background 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 di distribuzione, il log 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"
Utilizza i comandi makefile standard per compilare l'albero (o il tuo progetto) e collega l'output e l'errore standard. Per rimuovere i log di build dettagliati, esegui:
unset ANDROID_JACK_EXTRA_ARGS
Limitazioni del jack
Per impostazione predefinita, il server Jack può essere utilizzato da un solo utente su
un computer. Per supportare altri utenti, seleziona numeri di porta diversi per ciascun utente e regola SERVER_NB_COMPILE
di conseguenza. Puoi anche disattivare
il server Jack impostando SERVER=false
in $HOME/.jack
.
La compilazione di CTS è lenta a causa dell'integrazione vm-tests-tf
corrente.
Gli strumenti di manipolazione del bytecode (come JaCoCo) non sono supportati.
Usa Jack
Jack supporta il linguaggio di programmazione Java 1.7 e integra le funzionalità aggiuntive descritte di seguito.
Pre-dex
Quando viene generato un file della libreria Jack, l'.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 libreria. Tutte le librerie sono
pre-dexate.
Figura 4. Librerie Jack con pre-dex.
Jack non riutilizza la pre-dex della libreria se nella compilazione vengono utilizzati riduzione, offuscamento o ricompilazione.
Compilazione incrementale
La compilazione incrementale significa che vengono ricompilati solo i componenti modificati dall'ultima compilazione (e le relative dipendenze). La compilazione incrementale può essere molto più veloce di una compilazione completa quando le modifiche sono limitate a un insieme di componenti.
La compilazione incrementale è disattivata per impostazione predefinita (e viene disattivata automaticamente quando sono attive le opzioni di riduzione, offuscamento, ricompilazione o multi-dex legacy). Per attivare le build incrementali, aggiungi la seguente riga al file
Android.mk
del progetto che vuoi compilare in modo incrementale:
LOCAL_JACK_ENABLED := incremental
Riduzione e offuscamento
Jack utilizza i file di configurazione ProGuard per attivare la riduzione e l'offuscamento.
Le opzioni comuni includono:
@
-include
-basedirectory
-injars
-outjars
(è supportato un solo file JAR di output)-libraryjars
-keep
-keepclassmembers
-keepclasseswithmembers
-keepnames
-keepclassmembernames
-keepclasseswithmembernames
-printseeds
Le opzioni di riduzione includono:
-dontshrink
Le opzioni di offuscamento includono:
-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 pre-verifica)-skipnonpubliclibraryclasses
-dontskipnonpubliclibraryclasses
-dontskipnonpubliclibraryclassmembers
-keepdirectories
-target
-forceprocessing
-printusage
-whyareyoukeeping
-optimizations
-optimizationpasses
-assumenosideeffects
-allowaccessmodification
-mergeinterfacesaggressively
-overloadaggressively
-microedition
-verbose
-dontnote
-dontwarn
-ignorewarnings
-printconfiguration
-dump
Ripacchettizzazione
Jack utilizza i file di configurazione jarjar per eseguire il reimpacchettamento. Jack è compatibile con i tipi di regole "regola", ma non con i tipi di regole "zap" o "mantieni".
Supporto multidex
Jack offre 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 Attivare multidex per app con oltre 64.000 metodi