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 ha compilato il codice sorgente Java in Android dex in bytecode. Non devi fare nulla di diverso per usare Jack: puoi usare i comandi makefile standard per compilare la struttura o il progetto. Android 8.1 è l'ultima release che usa Jack.

Informazioni su Jack

Jack funziona come mostrato nella Figura 1.

Panoramica di Jack.

Figura 1. Panoramica di Jack.

Formato libreria Jack

Jack ha il 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.

Giulia

Come mostrato nella figura seguente, lo strumento Jill traduce i valori .jar raccolte nel nuovo formato della raccolta.

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

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

Server di compilazione di Jack

La prima volta che viene usato Jack avvia un server di compilazione di Jack locale del tuo computer. Questo server:

  • Porta un'accelerazione intrinseca perché evita di lanciare una nuova JVM JRE host, caricare il codice Jack, inizializzare Jack e riscaldare JIT in ogni compilation. Offre inoltre tempi di compilazione molto buoni durante le compilation (ad esempio, in modalità incrementale).
  • È una soluzione a breve termine per controllare il numero di jack paralleli compilation. Il server evita il sovraccarico del computer (problemi di memoria o di disco). poiché limita il numero di compilazioni parallele.

Il server Jack si arresta dopo un tempo di inattività senza alcuna compilazione. Utilizza due porte TCP sull'interfaccia localhost e non è disponibile all'esterno. Tutti i parametri (numero di compilazioni parallele, timeout, porte numero e così via) possono essere modificate modificando il file $HOME/.jack.

file $HOME/.jack

Il file $HOME/.jack contiene le seguenti impostazioni per Jack variabili del server con una sintassi bash completa:

  • SERVER=true attiva la funzionalità 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 motivi amministrativi.
  • SERVER_COUNT=1 non è utilizzato.
  • SERVER_NB_COMPILE=4 imposta il numero massimo consentito di paralleli compilation. SERVER_TIMEOUT=60 imposta il numero di secondi di inattività del 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 sovraccaricato da una variabile di ambiente.
  • JACK_VM_COMMAND=${JACK_VM_COMMAND:=java} imposta il valore predefinito per avviare una JVM sull'host. Per impostazione predefinita, questa variabile può essere sovraccaricato dalla variabile di ambiente.

Risolvere i problemi delle compilazioni di Jack

Problema Azione
Il computer non risponde durante la compilazione o si verifica Raccolte di Jack che non superano il controllo Errore di memoria insufficiente Riduci il numero di jack simultanei compilation modificando $HOME/.jack e cambiando SERVER_NB_COMPILE a un valore più basso.
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. Cambia porte modificando $HOME/.jack (SERVER_PORT_SERVICE e SERVER_PORT_ADMIN). Per sbloccare la situazione, disattiva Server di compilazione Jack modificando $HOME/.jack e cambiando SERVER a false. Purtroppo questo rallenta in modo significativo la tua compilazione e potrebbe costringerti ad avviare make -j con il caricamento gruppo di controllo (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 contenuto in jack-$USER della directory temporanea (/tmp o $TMPDIR).

Trovare il tronco di Jack

Se hai eseguito un comando make con una destinazione dist, il log di Jack viene si trova presso $ANDROID_BUILD_TOP/out/dist/logs/jack-server.log. Altrimenti, puoi trovare il log eseguendo jack-admin server-log. In caso di errori di Jack riproducibili, puoi ottenere un log più dettagliato imposta 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 l'albero (o il tuo progetto) e per collegare output standard ed errore. Per rimuovere log di build dettagliati, esegui:

unset ANDROID_JACK_EXTRA_ARGS

Limitazioni di Jack

Per impostazione predefinita, il server Jack può essere utilizzato da un solo utente su su un computer. Per supportare utenti aggiuntivi, seleziona numeri di porta diversi per ciascuno e regola SERVER_NB_COMPILE di conseguenza. Puoi anche disattivare 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 dei bytecode (come JaCoCo) non sono supportati.

Usa Jack

Jack supporta il linguaggio di programmazione Java 1.7 e integra descritte di seguito.

Pre-dex

Quando generi un file della libreria Jack, il .dex della libreria viene generati e archiviati all'interno del file della libreria .jack come pre-dex. Durante la compilazione, Jack riutilizza il pre-dex di ogni raccolta. Tutte le librerie sono pre-decisa.

Librerie Jack con pre-dex.

Figura 4. Librerie Jack con pre-dex.

Jack non riutilizza il pre-dex della libreria in caso di riduzione, offuscamento o la ripacchettizzazione è utilizzata nella compilazione.

Compilazione incrementale

Nella compilazione incrementale si intende che solo i componenti toccati dall'ultima la compilazione automatica (e le loro dipendenze). La compilazione incrementale può essere significativamente più veloce di una compilazione completa quando le modifiche sono limitate a un un insieme di componenti.

La compilazione incrementale è disattivata per impostazione predefinita e viene vengono disattivati quando la versione legacy di restringimento, offuscamento, ripacchettizzazione o multi-dex viene attivata). Per abilitare le build incrementali, aggiungi la seguente riga alla Android.mk del progetto che vuoi creare in modo incrementale:

LOCAL_JACK_ENABLED := incremental

Restringimento e offuscamento

Jack usa i file di configurazione ProGuard per consentire il restringimento e dell'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
di Gemini Advanced.

Riconfezionamento

Per la ripacchettizzazione, Jack usa i file di configurazione jar. Mentre Jack sta compatibile con "rule" non è compatibile con "zap" o "tieni" tipi di regole.

Supporto Multidex

Jack offre il supporto multidex integrato e legacy. Perché i file dex sono limitati a 65.000 metodi, le app con più di 65.000 metodi devono essere suddivise in più metodi . Per ulteriori dettagli, consulta Attivare il multidex per le app con più di 64.000 metodi