AAPT2

AAPT2 (Android Asset Packaging Tool) è uno strumento di compilazione che Android Studio e Android Gradle Plugin utilizzano per compilare e pacchettizzare le risorse della tua app. AAPT2 analizza, indicizza e compila le risorse in un formato binario ottimizzato per la piattaforma Android.

Il plug-in Android per Gradle 3.0.0 e versioni successive attiva AAPT2 per impostazione predefinita. In genere non è necessario richiamare aapt2 manualmente. Tuttavia, se preferisci utilizzare il terminale e il tuo sistema di build anziché Android Studio, puoi utilizzare AAPT2 dalla riga di comando. Puoi anche eseguire il debug degli errori di build correlati ad AAPT2 dalla riga di comando. Per farlo, trova AAPT2 come strumento autonomo in Android SDK Build Tools 26.0.2 e versioni successive.

Per scaricare Android SDK Build Tools dalla riga di comando, utilizza sdkmanager ed esegui il seguente comando:

sdkmanager "build-tools;build-tools-version"

Dopo aver scaricato gli strumenti di compilazione dell'SDK, trova AAPT2 in android_sdk/build-tools/version/.

Poiché le revisioni degli strumenti di compilazione dell'SDK Android non vengono rilasciate spesso, la versione di AAPT2 inclusa negli strumenti di compilazione dell'SDK potrebbe non essere l'ultima. Per ottenere l'ultima versione di AAPT2, scarica AAPT2 da Google Maven.

Per utilizzare AAPT2 dalla riga di comando su Linux o Mac, esegui il comando aapt2. In Windows, esegui il comando aapt2.exe.

AAPT2 supporta una compilazione più rapida delle risorse consentendo la compilazione incrementale. Per eseguire la compilazione incrementale, l'elaborazione delle risorse è divisa in due passaggi:

  • Compila: compila i file di risorse in formati binari.
  • Link: unisce tutti i file compilati e li raggruppa in un unico pacchetto.

Questa separazione contribuisce a migliorare il rendimento delle build incrementali. Ad esempio, se vengono apportate modifiche a un singolo file, devi ricompilare solo quel file.

Scaricare AAPT2 da Google Maven

Per ottenere la versione più recente di AAPT2 non inclusa negli strumenti di compilazione, scarica AAPT2 dal repository Maven di Google nel seguente modo:

  1. Nell'indice del repository, vai a com.android.tools.build > aapt2.
  2. Copia il nome dell'ultima versione di AAPT2.
  3. Inserisci il nome della versione che hai copiato nel seguente URL e specifica il sistema operativo di destinazione: https://dl.google.com/dl/android/maven2/com/android/tools/build/aapt2/ aapt2-version/aapt2-aapt2-version- [windows | linux | osx].jar

    Ad esempio, per scaricare la versione 3.2.0-alpha18-4804415 per Windows, utilizza: https://dl.google.com/dl/android/maven2/com/android/tools/build/aapt2/ 3.2.0-alpha18-4804415/aapt2-3.2.0-alpha18-4804415-windows.jar

  4. Apri l'URL in un browser. Il download di AAPT2 inizierà a breve.

  5. Decomprimi il file JAR che hai appena scaricato.

    Il file JAR deve contenere un eseguibile aapt2 e alcune librerie da cui dipende l'eseguibile.

Compila

AAPT2 supporta la compilazione di tutti i tipi di risorse Android, come file XML e disegnabili. Quando richiami AAPT2 per la compilazione, passa un singolo file di risorse come input per ogni chiamata. AAPT2 analizza il file e genera un file binario intermedio con estensione .flat.

Quando vengono passate intere directory, AAPT2 ricompila tutti i file della directory anche quando è stata modificata una sola risorsa. Sebbene tu possa trasmettere a AAPT2 directory di risorse contenenti più di un file di risorse utilizzando il flag --dir, in questo modo non ottieni i vantaggi della compilazione incrementale delle risorse.

I tipi di file di output possono variare in base all'input fornito per la compilazione, come mostrato nella tabella seguente:

Tabella 1. I tipi di file di input e output per la compilazione

Input Output
File di risorse XML, ad esempio String e Style, che si trovano nella directory res/values/ Tabella delle risorse con *.arsc.flat come estensione.
Tutti gli altri file di risorse.

Tutti i file diversi da quelli nella directory res/values/ vengono convertiti in file XML binari con estensioni *.flat.

Inoltre, tutti i file PNG vengono compressi per impostazione predefinita e adottano le estensioni *.png.flat . Se scegli di non comprimere i PNG, puoi utilizzare l'opzione --no-crunch durante la compilazione.

I file di output di AAPT2 non sono eseguibili e devi includerli in un secondo momento come input nella fase di collegamento per generare un APK. Tuttavia, il file APK generato non è un eseguibile che puoi distribuire immediatamente su un dispositivo Android, perché non contiene file DEX e non è firmato.

Sintassi di compilazione

La sintassi generale per l'utilizzo di compile è la seguente:

aapt2 compile path-to-input-files [options] -o output-directory/

Nell'esempio seguente, AAPT2 compila i file di risorse denominati values.xml e myImage.png singolarmente:

aapt2 compile project_root/module_root/src/main/res/values-en/strings.xml -o compiled/
aapt2 compile project_root/module_root/src/main/res/drawable/myImage.png -o compiled/

Come mostrato nella tabella 1, il nome del file di output dipende dal nome del file di input e dal nome della directory principale.

Per l'esempio precedente con il file strings.xml come input, aapt2 assegna automaticamente al file di output il nome values-en_strings.arsc.flat. Tuttavia, il file drawable compilato archiviato nella directory drawable è denominato drawable_img.png.flat.

Opzioni di compilazione

Esistono diverse opzioni che puoi utilizzare con il comando compile, come mostrato nella Tabella 2:

Tabella 2. Opzioni del comando di compilazione

Opzione Descrizione
-o path

Specifica il percorso di output per le risorse compilate.

Questo è un flag obbligatorio, perché devi specificare un percorso a una directory in cui AAPT2 può generare e archiviare le risorse compilate.

--dir directory

Specifica la directory in cui cercare le risorse.

Sebbene tu possa utilizzare questo flag per compilare più file di risorse con un solo comando, disattiva i vantaggi della compilazione incrementale. Pertanto, questo flag non deve essere utilizzato per progetti di grandi dimensioni.

--pseudo-localize Genera versioni pseudolocalizzate di stringhe predefinite, come en-XA e en-XB.
--no-crunch Disattiva l'elaborazione PNG.

Utilizza questa opzione se hai già elaborato i file PNG o se stai creando build di debug che non richiedono la riduzione delle dimensioni dei file. L'abilitazione di questa opzione comporta un'esecuzione più rapida, ma aumenta le dimensioni del file di output.

--legacy Considera gli errori consentiti quando si utilizzano versioni precedenti di AAPT come avvisi.

Questo flag deve essere utilizzato per errori di compilazione imprevisti. Per risolvere le modifiche al comportamento note che potrebbero verificarsi durante l'utilizzo di AAPT2, leggi Modifiche al comportamento durante l'utilizzo di AAPT2.

-zip file file è un file ZIP contenente la directory res da scansionare per le risorse.
-output-text-symbols file Genera un file di testo contenente i simboli delle risorse nel file specificato.
-preserve-visibility-of-styleables Se specificato, applica le stesse regole di visibilità per gli elementi di stile utilizzati per tutte le altre risorse. In caso contrario, tutti gli elementi con stile vengono resi pubblici.
-visibility [public|private|default|] Imposta la visibilità delle risorse compilate sul livello specificato.
-trace-folder folder Genera un frammento di traccia JSON systrace nella cartella specificata.
-source-path path Imposta il percorso del file di origine del file di risorse compilato su path.
-h Visualizza la guida degli strumenti.
-v Attiva il logging dettagliato.

Nella fase di collegamento, AAPT2 unisce tutti i file intermedi generati dalla fase di compilazione, come tabelle di risorse, file XML binari e file PNG elaborati, quindi li raggruppa in un unico APK. Inoltre, in questa fase possono essere generati altri file ausiliari, come i file di regole R.java e ProGuard. Tuttavia, l'APK generato non contiene bytecode DEX e non è firmato. Non puoi eseguire il deployment di questo APK su un dispositivo.

Se non utilizzi il plug-in Android Gradle per creare la tua app dalla riga di comando, puoi utilizzare altri strumenti a riga di comando, come d8 per compilare il bytecode Java in bytecode DEX e apksigner per firmare il tuo APK.

La sintassi generale per l'utilizzo di link è la seguente:

aapt2 link path-to-input-files [options] -o
outputdirectory/outputfilename.apk --manifest AndroidManifest.xml

Nell'esempio seguente, AAPT2 unisce due file intermedi, drawable_Image.flat e values_values.arsc.flat, e il file AndroidManifest.xml. AAPT2 collega il risultato al file android.jar, che contiene le risorse definite nel pacchetto android:

 aapt2 link -o output.apk
 -I android_sdk/platforms/android_version/android.jar
    compiled/res/values_values.arsc.flat
    compiled/res/drawable_Image.flat --manifest /path/to/AndroidManifest.xml -v

Puoi utilizzare le seguenti opzioni con il comando link:

Tabella 3. Opzioni del comando Link

Opzione Descrizione
-o path

Specifica il percorso di output per l'APK della risorsa collegata.

Si tratta di un flag obbligatorio, perché devi specificare il percorso dell'APK di output che può contenere le risorse collegate.

--manifest file

Specifica il percorso del file manifest Android da compilare.

Si tratta di un flag obbligatorio, perché il file manifest contiene informazioni essenziali sulla tua app, come il nome del pacchetto e l'ID applicazione.

-I

Fornisce il percorso del android.jar della piattaforma o di altri APK, ad esempio framework-res.apk, che potrebbero essere utili durante la creazione di funzionalità.

Questo flag è obbligatorio se utilizzi attributi con lo spazio dei nomi android nei file di risorse.
-A directory Specifica una directory degli asset da includere nell'APK.

Puoi utilizzare questa directory per archiviare i file originali non elaborati. Per scoprire di più, leggi Accesso ai file originali.

-R file Trasferisce un singolo file .flat a link, utilizzando la semantica overlay senza utilizzare il tag <add-resource>.

Quando fornisci un file di risorse che si sovrappone a un file esistente, viene utilizzata l'ultima risorsa in conflitto fornita.

--package-id package-id Specifica l'ID pacchetto da utilizzare per la tua app.

L'ID pacchetto specificato deve essere maggiore o uguale a 0x7f se non utilizzato in combinazione con --allow-reserved-package-id.

--allow-reserved-package-id

Consente l'utilizzo di un ID pacchetto riservato.

Gli ID pacchetto riservati sono ID normalmente assegnati a librerie condivise e compresi nell'intervallo da 0x02 a 0x7e, inclusi. Utilizzando --allow-reserved-package-id, puoi assegnare ID che rientrano nell'intervallo degli ID pacchetto riservati.

Questa opzione deve essere utilizzata solo per i pacchetti con versione min-sdk 26 o inferiore.

--java directory Specifica la directory in cui generare R.java.
--proguard proguard_options Genera il file di output per le regole ProGuard.
--proguard-conditional-keep-rules Genera il file di output per le regole ProGuard per il DEX principale.
--no-auto-version Disattiva il controllo automatico delle versioni dell'SDK di stile e layout.
--no-version-vectors Disattiva il controllo automatico delle versioni dei drawables vettoriali. Utilizza questo flag solo quando crei l'APK con la libreria Vector Drawable.
--no-version-transitions Disattiva il controllo automatico delle versioni delle risorse di transizione. Utilizza questo flag solo quando crei l'APK con la libreria di supporto per la transizione.
--no-resource-deduping Disattiva la deduplicazione automatica delle risorse con valori identici nelle configurazioni compatibili.
--enable-sparse-encoding Consente la codifica sparsa delle voci di risorse. Ciò comporta una riduzione delle dimensioni dell'APK, dell'utilizzo della memoria e della latenza di avvio, nonché un leggero aumento del tempo di ricerca delle singole risorse dopo l'avvio.
-z Richiede la localizzazione delle stringhe contrassegnate come "suggerite".
-c config Fornisce un elenco di configurazioni separate da virgole.

Ad esempio, se hai dipendenze dalla libreria di supporto, che contiene traduzioni per più lingue, puoi filtrare le risorse solo per la configurazione della lingua specificata, ad esempio inglese o spagnolo.

Devi definire la configurazione della lingua con un codice lingua ISO 639-1 di due lettere, facoltativamente seguito da un codice regione ISO 3166-1 alpha-2 di due lettere preceduto dalla lettera "r" minuscola. Ad esempio, en-rUS.

--preferred-density density Consente ad AAPT2 di selezionare la densità e la striscia più corrispondenti ed eliminare tutte le altre.

Nella tua app sono disponibili diversi qualificatori di densità di pixel, come ldpi, hdpi e xhdpi. Quando specifichi una densità preferita, AAPT2 seleziona e memorizza la densità corrispondente più vicina nella tabella delle risorse e rimuove tutte le altre.

--output-to-dir Restituisce i contenuti dell'APK a una directory specificata da -o.

Se si verificano errori durante l'utilizzo di questo flag, puoi risolverli eseguendo l'upgrade ad Android SDK Build Tools 28.0.0 o versioni successive.

--min-sdk-version min-sdk-version Imposta la versione SDK minima predefinita da utilizzare per AndroidManifest.xml.
--target-sdk-version target-sdk-version Imposta la versione dell'SDK target predefinita da utilizzare per AndroidManifest.xml.
--version-code version-code Specifica il codice di versione da inserire in AndroidManifest.xml se non è presente.
--version-name version-name Specifica il nome della versione da inserire in AndroidManifest.xml se non è presente.
--revision-code revision-code Specifica il codice di revisione da inserire nel file AndroidManifest.xml se non è presente.
--replace-version Se vengono specificati --version-code, --version-name o --revision-code, questi valori sostituiscono qualsiasi valore già presente nel manifest. Per impostazione predefinita, non cambia nulla se il manifest definisce già questi attributi.
--compile-sdk-version-nacodeme compile-sdk-version-name Specifica il codice di versione da inserire nel file AndroidManifest.xml se non è presente.
--compile-sdk-version-name compile-sdk-version-name Specifica il nome della versione da inserire nel file AndroidManifest.xml se non è presente.
--proto-format Genera risorse compilate in formato Protobuf.

Adatto come input per bundletool per generare un Android App Bundle.

--non-final-ids Genera R.java con ID risorsa non definitivi. I riferimenti agli ID del codice dell'app non vengono incorporati durante la compilazione di kotlinc o javac.
--emit-ids path Emette un file nel percorso specificato con un elenco di nomi di tipi di risorse e le relative mappature degli ID. È adatto all'uso con --stable-ids.
--stable-ids outputfilename.ext Utilizza il file generato con --emit-ids contenente l'elenco dei nomi dei tipi di risorse e i relativi ID assegnati.

Questa opzione consente agli ID assegnati di rimanere stabili anche quando elimini o aggiungi nuove risorse durante il collegamento.

--custom-package package_name Specifica il pacchetto Java personalizzato in cui generare R.java.
--extra-packages package_name Genera lo stesso file R.java, ma con nomi dei pacchetti diversi.
--add-javadoc-annotation annotation Aggiunge un'annotazione JavaDoc a tutte le classi Java generate.
--output-text-symbols path Genera un file di testo contenente i simboli delle risorse della classe R nel file specificato.

Devi specificare il percorso del file di output.

--auto-add-overlay Consente l'aggiunta di nuove risorse nelle sovrapposizioni senza utilizzare il tag <add-resource>.
--rename-manifest-package manifest-package Rinomina il pacchetto nel file AndroidManifest.xml.
--rename-instrumentation-target-package instrumentation- target-package Modifica il nome del pacchetto di destinazione per instrumentation.

Questa opzione deve essere utilizzata insieme a --rename-manifest-package.

-0 extension

Specifica le estensioni dei file che non vuoi comprimere.

--split path:config[,config[..]] Divide le risorse in base a un insieme di configurazioni per generare una versione diversa dell'APK.

Devi specificare il percorso dell'APK di output insieme al set di configurazioni.

--proguard-main-dex file File di output per le regole ProGuard generate per il DEX principale.
--proguard-minimal-keep-rules Genera un insieme minimo di regole di conservazione di ProGuard.
--no-resource-removal Disattiva la rimozione automatica delle risorse senza valori predefiniti. Utilizza questa opzione solo quando crei pacchetti di overlay delle risorse di runtime.
-x Flag legacy che specifica l'utilizzo dell'identificatore del pacchetto 0x01.
--product products-list Specifica un elenco separato da virgole di nomi di prodotti da conservare.
--no-xml-namespaces Rimuove il prefisso dello spazio dei nomi XML e le informazioni sull'URI dal file AndroidManifest.xml e dai binari XML in res/*.
--shared-lib Genera una libreria di runtime Android condivisa.
--static-lib Genera una libreria statica Android.
--no-static-lib-packages Unisce tutte le risorse della libreria nel pacchetto dell'app.
--no-proguard-location-reference Impedisce ai file delle regole ProGuard di avere un riferimento al file di origine.
--private-symbols package-name package-name specifica il nome del pacchetto da utilizzare durante la generazione di R.java per i simboli privati. Se non specificati, i simboli pubblici e privati utilizzano il nome del pacchetto dell'app.
--override-styles-instead-of-overlaying Fa sì che gli stili definiti nelle risorse -R sostituiscano le definizioni precedenti anziché unirle.
--rename-resources-package package-name Rinomina il pacchetto nella tabella delle risorse in package-name.
--no-compress Non comprime alcuna risorsa.
--keep-raw-values Conserva i valori degli attributi non elaborati nei file XML.
--no-compress-regex regular-expression Non comprime le estensioni corrispondenti a regular-expression. Utilizza il simbolo $ per la fine della riga. Utilizza una grammatica di espressioni regolari ECMAScript sensibile alle maiuscole.
--warn-manifest-validation Considera gli errori di convalida del manifest come avvisi.
--exclude-configs qualifier[,qualifier[..]] Esclude i valori delle risorse le cui configurazioni contengono i qualificatori specificati.
--debug-mode Inserisce android:debuggable="true" nel nodo dell'applicazione del manifest, rendendo l'applicazione eseguibile in modalità di debug anche sui dispositivi di produzione.
--strict-visibility Non consente sovrapposizioni con diversi livelli di visibilità.
--exclude-sources Non serializza le informazioni sui file di origine durante la generazione di risorse in formato Protobuf.
--trace-folder folder Genera il frammento di traccia JSON systrace nel folder specificato.
--merge-only Unisce solo le risorse senza verificare i riferimenti alle risorse. Questo flag deve essere utilizzato solo con il flag --static-lib.
-h Visualizza il menu Guida.
-v Consente di aumentare la verbosità dell'output.

Dump

dump viene utilizzato per stampare informazioni sull'APK che hai generato utilizzando il comando link.

Sintassi di dump

La sintassi generale per l'utilizzo di dump è la seguente:

aapt2 dump sub-command filename.apk [options]

Il seguente esempio stampa i contenuti della tabella delle risorse dell'APK specificato:

aapt2 dump resources output.apk

Comandi secondari di dump

Specifica uno dei seguenti sottocomandi con il comando dump:

Tabella 4. Comandi secondari di dump

SottocomandoDescrizione
apc Stampa i contenuti del container AAPT2 (APC) generato durante la compilazione.
badging Stampa le informazioni estratte dal manifest dell'APK.
configurations Stampa ogni configurazione utilizzata da una risorsa nell'APK.
overlayable Stampa le risorse sovrapponibili dell'APK.
packagename Stampa il nome del pacchetto dell'APK.
permissions Stampa le autorizzazioni estratte dal file manifest dell'APK.
strings Stampa i contenuti del pool di stringhe della tabella delle risorse dell'APK.
styleparents Stampa gli elementi principali degli stili utilizzati nell'APK.
resources Stampa i contenuti della tabella delle risorse dell'APK.
xmlstrings Stampa le stringhe dal codice XML compilato dell'APK.
xmltree Stampa una struttura del codice XML compilato dell'APK.

Opzioni di dump

Utilizza le seguenti opzioni con dump:

Tabella 5. Opzioni di dump

OpzioneDescrizione
--no-values Elimina l'output dei valori durante la visualizzazione della risorsa.
--file file Specifica un file come argomento da estrarre dall'APK.
-v Aumenta la verbosità dell'output.

Diff

Utilizza diff per confrontare due APK e identificare eventuali differenze tra loro.

Sintassi diff

La sintassi generale per l'utilizzo di diff è la seguente:

aapt2 diff first.apk second.apk

Non sono disponibili opzioni per il comando diff.

Ottimizzazione

optimize viene utilizzato per eseguire ottimizzazioni sulle risorse unite e resources.arsc prima che vengano inserite nel pacchetto APK. Questa ottimizzazione può ridurre le dimensioni dell'APK di circa l'1-3%, a seconda delle dimensioni e del numero di risorse utilizzate.

Ottimizzare la sintassi

La sintassi generale per l'utilizzo di optimize è la seguente:

aapt2 optimize options file[,file[..]]

L'esempio seguente ottimizza le risorse in input.apk e crea un nuovo APK ottimizzato in output.apk. Sostituisce la consueta rappresentazione tabellare piatta con una rappresentazione più compatta, con conseguente riduzione delle dimensioni dell'APK, dell'utilizzo della memoria e della latenza di avvio, nonché un leggero aumento del tempo di ricerca delle singole risorse dopo l'avvio.

aapt2 optimize -o output.apk --enable-sparse-encoding input.apk

Opzioni di ottimizzazione

Puoi utilizzare le seguenti opzioni con optimize:

Tabella 6. Opzioni di ottimizzazione

OpzioneDescrizione
-o path Specifica il percorso di output per l'APK della risorsa collegata.

Si tratta di un flag obbligatorio, perché devi specificare il percorso dell'APK di output che può contenere le risorse collegate.

-d directory Specifica il percorso della directory di output per le suddivisioni.
-x path Specifica il percorso del file di configurazione XML.
-p Stampa gli artefatti multi-APK ed esce.
--target-densities density[,density[..]] Specifica un elenco separato da virgole delle densità dello schermo per cui l'APK è ottimizzato. Tutte le risorse che non verrebbero utilizzate sui dispositivi con le densità specificate vengono rimosse dall'APK.
--resources-config-path path

Specifica il percorso del file resources.cfg contenente l'elenco di risorse e direttive per ogni risorsa.

Formato: type/resource_name#[directive][,directive]

-c config[,config[..]] Specifica un elenco separato da virgole di configurazioni da includere. Il valore predefinito è tutte le configurazioni.
--split path:config[,config[..]] Divide le risorse in base a un insieme di configurazioni per generare una versione diversa dell'APK.

Devi specificare il percorso dell'APK di output insieme al set di configurazioni.

--keep-artifacts artifact[,artifact[..]] Specifica un elenco separato da virgole di artefatti da conservare. Se non ne viene specificato nessuno, vengono conservati tutti gli artefatti.
--enable-sparse-encoding Consente la codifica sparsa delle voci di risorse. Ciò comporta una riduzione delle dimensioni dell'APK, dell'utilizzo della memoria e della latenza di avvio, nonché un leggero aumento del tempo di ricerca delle singole risorse dopo l'avvio.
--collapse-resource-names Comprime i nomi delle risorse in un unico valore nel pool di stringhe chiave. Le risorse vengono esentate utilizzando l'istruzione no_collapse in un file specificato da --resources-config-path.
--shorten-resource-paths Abbrevia i percorsi delle risorse all'interno dell'APK.
--resource-path-shortening-map path Specifica il percorso in cui eseguire l'output della mappatura dei vecchi percorsi delle risorse ai percorsi abbreviati.
-v Aumenta la verbosità dell'output.
-h Visualizza la guida dello strumento.

Converti

Per impostazione predefinita, il comando AAPT compile compila le risorse in un formato binario adatto agli APK. È possibile specificare anche il formato protobuf adatto agli AAB specificando --proto-format. Il comando convert converte gli APK tra i due formati.

Convertire la sintassi

La sintassi generale per convert è la seguente:

aapt2 convert -o output-file options file[,file[..]]

L'esempio seguente converte le risorse in input.apk e crea un nuovo APK in output.apk contenente risorse in formato protobuf. Sostituisce la consueta rappresentazione tabellare piatta con una rappresentazione più compatta, con conseguente riduzione delle dimensioni dell'APK, dell'utilizzo della memoria e della latenza di avvio, nonché un leggero aumento

aapt2 convert -o output.apk --output-format proto --enable-sparse-encoding input.apk

Opzioni di conversione

Utilizza le seguenti opzioni con convert:

Tabella 7. Opzioni di conversione

OpzioneDescrizione
-o path

Specifica il percorso di output per l'APK della risorsa collegata.

Si tratta di un flag obbligatorio, perché devi specificare il percorso dell'APK di output che può contenere le risorse collegate.

--output-format [proto|binary] Formato dell'output. I valori accettati sono proto e binary. Se non viene impostato, il valore predefinito è binary.
--enable-sparse-encoding Consente la codifica sparsa delle voci di risorse. Ciò comporta una riduzione delle dimensioni dell'APK, dell'utilizzo della memoria e della latenza di avvio, nonché un leggero aumento del tempo di ricerca delle singole risorse dopo l'avvio.
--keep-raw-values Conserva i valori degli attributi non elaborati nei file XML.
-v Aumenta la verbosità dell'output.
-h Visualizza la guida dello strumento.

Modalità daemon

La versione 2.19 di AAPT ha introdotto la modalità daemon per l'invio di comandi. La modalità daemon ti consente di inserire più comandi in una singola sessione AAPT.

Sintassi del daemon

Avvia la modalità daemon con il seguente comando:

aapt2 daemon

Una volta eseguita la modalità demone, puoi inserire i comandi. Ogni argomento del comando deve essere su una riga separata, con una riga vuota alla fine del comando. Esci dalla modalità demone digitando Control+D.

Considera i seguenti comandi compile individuali:

aapt2 compile project_root/module_root/src/main/res/values-en/strings.xml -o compiled/
aapt2 compile project_root/module_root/src/main/res/drawable/myImage.png -o compiled/

Questi comandi possono essere inseriti in modalità demone come:

aapt2 daemon
Ready
compile
project_root/module_root/src/main/res/values-en/strings.xml
-o
compiled/

Done
compile
project_root/module_root/src/main/res/drawable/myImage.png
-o
compiled/

Done
^D
Exiting daemon

Opzioni modalità daemon

L'unica opzione per la modalità demone è --trace-folder folder, che genera un frammento di traccia JSON systrace nel folder specificato.

Versione

Determina la versione di AAPT2 che stai utilizzando con il comando version:

aapt2 version
Android Asset Packaging Tool (aapt) 2.19-8678579

Modifiche al comportamento durante l'utilizzo di AAPT2

Prima di AAPT2, AAPT era la versione predefinita di Android Asset Packaging Tool, ora ritirata. Sebbene AAPT2 debba funzionare immediatamente con i progetti precedenti, questa sezione descrive alcune modifiche del comportamento di cui devi essere a conoscenza.

Gerarchie degli elementi nel manifest Android

Nelle versioni precedenti di AAPT, gli elementi nidificati in nodi errati nel file AndroidManifest.xml venivano ignorati o generavano un avviso. Ad esempio, considera questo esempio:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   package="com.example.myname.myapplication">
   <application
       ...
       <activity android:name=".MainActivity">
           <intent-filter>
               <action android:name="android.intent.action.MAIN" />
               <category android:name="android.intent.category.LAUNCHER" />
           </intent-filter>
           <action android:name="android.intent.action.CUSTOM" />
       </activity>
   </application>
</manifest>

Le versioni precedenti di AAPT ignoravano semplicemente il tag <action> posizionato in modo errato.

Con AAPT2, viene visualizzato il seguente errore:

AndroidManifest.xml:15: error: unknown element <action> found.

Per risolvere il problema, assicurati che gli elementi del manifest siano nidificati correttamente. Per saperne di più, consulta la panoramica del file manifest dell'app.

Dichiarazione delle risorse

Non puoi più indicare il tipo di risorsa dall'attributo name. L'esempio seguente dichiara in modo errato un elemento risorsa attr:

<style name="childStyle" parent="parentStyle">
    <item name="attr/my_attr">@color/pink</item>
</style>

La dichiarazione di un tipo di risorsa in questo modo genera il seguente errore di compilazione:

Error: style attribute 'attr/attr/my_attr (aka my.package:attr/attr/my_attr)'
not found.

Per risolvere questo errore, dichiara esplicitamente il tipo utilizzando type="attr":

<style name="childStyle" parent="parentStyle">
  <item type="attr" name="my_attr">@color/pink</item>
</style>

Inoltre, quando dichiari un elemento <style>, il relativo elemento padre deve essere anche un tipo di risorsa di stile. In caso contrario, riceverai un errore simile al seguente:

Error: (...) invalid resource type 'attr' for parent of style

Utilizzo errato dei simboli di riferimento delle risorse @

AAPT2 genera errori di compilazione quando ometti o posizioni in modo errato i simboli di riferimento delle risorse (@). Ad esempio, se ometti il simbolo quando specifichi un attributo di stile:

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
  ...
  <!-- Note the missing '@' symbol when specifying the resource type. -->
  <item name="colorPrimary">color/colorPrimary</item>
</style>

Durante la creazione del modulo, AAPT2 genera il seguente errore di build:

ERROR: expected color but got (raw string) color/colorPrimary

Inoltre, se includi erroneamente il simbolo quando accedi a una risorsa dallo spazio dei nomi android:

...
<!-- When referencing resources from the 'android' namespace, omit the '@' symbol. -->
<item name="@android:windowEnterAnimation"/>

Durante la creazione del modulo, AAPT2 genera il seguente errore di build:

Error: style attribute '@android:attr/windowEnterAnimation' not found

Configurazione errata delle librerie

Se la tua app ha una dipendenza da una libreria di terze parti creata utilizzando versioni precedenti di Android SDK Build Tools, la tua app potrebbe arrestarsi in modo anomalo in fase di runtime senza visualizzare errori o avvisi. Questo arresto anomalo potrebbe verificarsi perché durante la creazione della libreria, i campi R.java sono dichiarati final. Di conseguenza, tutti gli ID risorsa sono incorporati nelle classi della libreria.

AAPT2 si basa sulla possibilità di riassegnare gli ID alle risorse della libreria durante la creazione dell'app. Se la libreria presuppone che gli ID siano final e li incorpora nel DEX della libreria, si verifica una mancata corrispondenza del runtime.

Per risolvere questo errore, contatta l'autore della libreria per ricompilarla utilizzando l'ultima versione degli strumenti di compilazione dell'SDK Android e ripubblicala.