Compila con jack (AOSP 6.0-8.1)

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. Non devi fare nulla di diverso per utilizzare Jack: basta utilizzare i 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.

Panoramica di Jack.

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

Contenuti del file della raccolta Jack.

Figura 2. Contenuti del file della raccolta Jack.

Jill

Come mostrato nella figura seguente, lo strumento Jill traduce le librerie .jar esistenti nel nuovo formato.

Flusso di lavoro per importare una libreria "jar" esistente.

Figura 3. Flusso di lavoro per importare una libreria .jar esistente.

Server di compilazione Jack

La prima volta che viene utilizzato, Jack avvia un server di compilazione Jack locale sul tuo computer. Questo server:

  • Offre un aumento di velocità intrinseco perché evita di avviare una nuova JVM JRE host, caricare il codice Jack, inizializzare Jack e eseguire l'inizializzazione del JIT a 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 di 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 in 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 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 dalla variabile di ambiente.

Risolvere i problemi relativi alle compilazioni di Jack

Problema Azione
Il computer non risponde durante la compilazione o le compilazioni di Jack non vanno a buon fine a causa di un errore di esaurimento della memoria 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 causa di un errore di lancio del server in background La causa più probabile è che le porte TCP sono già in uso 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, uccidi il server in background di Jack utilizzando jack-admin kill-server) quindi rimuovi le directory temporanee contenute in jack-$USER della tua directory temporanea (/tmp o $TMPDIR).

Trovare il log di Jack

Se hai eseguito un comando make con un target 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"

Utilizza i comandi makefile standard per compilare l'albero (o il progetto) e allegare l'output e gli errori standard. Per rimuovere i log di compilazione dettagliati, esegui:

unset ANDROID_JACK_EXTRA_ARGS

Limitazioni del martinetto

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 ogni utente e modifica 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'attuale integrazione di vm-tests-tf. Gli strumenti di manipolazione del bytecode (come 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 viene generato 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 libreria. Tutte le librerie sono pre-indicizzate.

Librerie jack con pre-dex.

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 significa che vengono ricompilati solo i componenti interessati dall'ultima compilazione (e le relative dipendenze). La compilazione incrementale può essere molto più rapida di una compilazione completa quando le modifiche sono limitate a un insieme di componenti.

La compilazione incrementale è disabilitata per impostazione predefinita (e viene disattivata automaticamente se sono attivati la riduzione, l'offuscamento, il nuovo confezionamento o il multi-dex 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 di ProGuard per attivare la compressione e l'oscuramento.

Le opzioni più comuni sono:

  • @
  • -include
  • -basedirectory
  • -injars
  • -outjars (è supportato un solo file jar di output)
  • -libraryjars
  • -keep
  • -keepclassmembers
  • -keepclasseswithmembers
  • -keepnames
  • -keepclassmembernames
  • -keepclasseswithmembernames
  • -printseeds

Le opzioni di riduzione sono le seguenti:

  • -dontshrink

Le opzioni di offuscamento includono:

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

Le opzioni ignorate sono le seguenti:

  • -dontoptimize (Jack non esegue l'ottimizzazione)
  • -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

Ripacchettizzazione

Jack utilizza i file di configurazione jarjar per eseguire il riacpack. 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 ulteriori dettagli, consulta Attivare il multidex per le app con più di 64.000 metodi