AAPT2

AAPT2 (Android Asset Packaging Tool) è uno strumento di creazione utilizzato da Android Studio e dal plug-in Android per Gradle 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 abilita AAPT2 per impostazione predefinita. In genere non è necessario richiamare aapt2 autonomamente. Tuttavia, se preferisci utilizzare il tuo 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 relativi all'AAPT2 dalla riga di comando. A questo scopo, trova AAPT2 come strumento autonomo in Android SDK Build Tools 26.0.2 e versioni successive.

Per scaricare Strumenti di creazione dell'SDK Android dalla riga di comando, utilizza sdkmanager ed esegui questo comando:

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

Dopo aver scaricato l'SDK Build Tools, trova AAPT2 in android_sdk/build-tools/version/.

Poiché le revisioni di SDK Build Tools non vengono rilasciate spesso, la versione di AAPT2 inclusa in SDK Build Tools potrebbe non essere la più recente. Per ottenere la versione più recente di AAPT2, scarica AAPT2 da Google Maven.

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

AAPT2 supporta una compilazione più rapida delle risorse abilitando la compilazione incrementale. Per eseguire la compilazione incrementale, l'elaborazione delle risorse viene separata in due passaggi:

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

Questa separazione aiuta a migliorare le prestazioni per le build incrementali. Ad esempio, se sono presenti modifiche in un singolo file, dovrai ricompilare solo quel file.

Scarica AAPT2 da Google Maven

Per ottenere la versione più recente di AAPT2 non integrata negli strumenti di creazione, scarica AAPT2 dal Repository Maven di Google nel seguente modo:

  1. Nell'indice repository vai a com.android.tools.build > aapt2.
  2. Copia il nome dell'ultima versione di AAPT2.
  3. Inserisci il nome della versione 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, usa: https://dl.google.com/dl/android/maven2/com/android/tools/build/aapt2/ 3.2.0-alpha18-4804415/aapt2-3.2.0-alpha18-48

  4. Accedi all'URL in un browser. Il download di AAPT2 inizierà a breve.

  5. Apri il pacchetto del file JAR appena scaricato.

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

Compila

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

Quando passa intere directory, AAPT2 ricompila tutti i file al suo interno anche se è stata modificata una sola risorsa. Anche se puoi passare all'AAPT2 le directory delle risorse contenenti più di un file di risorse utilizzando il flag --dir, non puoi usufruire dei vantaggi della compilazione incrementale delle risorse in questo modo.

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

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

Ingresso Uscita
File di risorse XML, come 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 dai file nella directory res/values/ vengono convertiti in file XML binari con estensione *.flat.

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

I file generati da AAPT2 non sono eseguibili, pertanto devi includere questi file binari come input nella fase di collegamento per generare un APK in un secondo momento. Tuttavia, il file APK generato non è un eseguibile che puoi implementare subito su un dispositivo Android, perché non contiene file DEX e non è firmato.

Compila sintassi

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

Per l'esempio precedente, in cui il file strings.xml è l'input, aapt2 denomina automaticamente il file di output come values-en_strings.arsc.flat. Tuttavia, il file di disegno compilato e archiviato nella directory disegnabile è 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 required, perché devi specificare un percorso di una directory in cui AAPT2 può generare e archiviare le risorse compilate.

--dir directory

Specifica la directory in cui eseguire la scansione delle risorse.

Anche se puoi utilizzare questo flag per compilare più file di risorse con un solo comando, disattiva i vantaggi della compilazione incrementale. Di conseguenza, 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 Disabilita 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 del file. Se abiliti questa opzione, l'esecuzione sarà più rapida, ma le dimensioni del file di output aumentano.

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

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

-zip file file è un file ZIP contenente la directory res per la scansione delle 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 stilizzabili utilizzati per tutte le altre risorse. In caso contrario, tutti gli stili di stile verranno resi pubblici.
-visibility [public|private|default|] Imposta la visibilità delle risorse compilate al livello specificato.
-trace-folder folder Genera un frammento di traccia JSON systrace nella cartella specificata.
-source-path path Imposta su path il percorso del file di origine del file delle risorse compilate.
-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, ad esempio tabelle di risorse, file XML binari e file PNG elaborati, per poi pacchettizzare i file in un unico APK. Inoltre, durante questa fase è possibile generare 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 usi il plug-in Android per Gradle per creare la tua app dalla riga di comando, puoi usare altri strumenti a riga di comando, come d8 per compilare il bytecode Java nel bytecode DEX e apksigner per firmare l'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 di collegamento

Opzione Descrizione
-o path

Specifica il percorso di output dell'APK di risorsa collegato.

Questo è un flag required, 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 creare.

Questo è un flag obbligatorio, perché il file manifest include informazioni essenziali sulla tua app, come il nome del pacchetto e l'ID dell'applicazione.

-I

Fornisce il percorso dell'elemento android.jar o di altri APK della piattaforma, come framework-res.apk, che potrebbero essere utili durante la creazione delle funzionalità.

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

Puoi utilizzare questa directory per archiviare i file originali non elaborati. Per scoprire di più, consulta 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 risorsa che si sovrappone a un file esistente, viene utilizzata l'ultima risorsa in conflitto specificata.

--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, a meno che non venga 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 nell'intervallo da 0x02 a 0x7e inclusi. Utilizzando --allow-reserved-package-id, puoi assegnare ID che rientrano nell'intervallo di ID pacchetto riservati.

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

--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 file 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 trainable vettoriali. Utilizza questo flag solo quando crei l'APK con la Vector Drawable Library.
--no-version-transitions Disabilita il controllo automatico delle versioni delle risorse di transizione. Usa questo flag soltanto quando crei il tuo APK con la libreria di supporto per la transizione.
--no-resource-deduping Disabilita la deduplicazione automatica delle risorse con valori identici nelle configurazioni compatibili.
--enable-sparse-encoding Consente di attivare la codifica di voci sparse utilizzando una struttura di ricerca binaria. Questo è utile per ottimizzare le dimensioni degli APK, ma a scapito delle prestazioni di recupero delle risorse.
-z Richiede la localizzazione delle stringhe contrassegnate come "suggested".
-c config Fornisce un elenco di configurazioni separato da virgole.

Ad esempio, se la libreria di supporto contiene dipendenze, che contiene traduzioni in più lingue, puoi filtrare le risorse solo in base alla 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 da una "r" minuscola. Ad esempio, en-rUS.

--preferred-density density Consente all'AAPT2 di selezionare la densità più simile e di rimuovere tutte le altre.

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

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

Se si verificano errori con questo flag, puoi risolverli eseguendo l'upgrade a Android SDK Build Tools 28.0.0 o versioni successive.

--min-sdk-version min-sdk-version Imposta la versione minima predefinita dell'SDK da utilizzare per AndroidManifest.xml.
--target-sdk-version target-sdk-version Imposta la versione target predefinita dell'SDK 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 file 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 a bundletool per la generazione di un Android App Bundle.

--non-final-ids Genera R.java con ID risorsa non finali. I riferimenti agli ID nel codice dell'app non vengono incorporati durante la compilazione kotlinc o javac.
--emit-ids path Emette un file nel percorso specificato con un elenco di nomi dei tipi di risorse e dei relativi mapping 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 di pacchetto 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 negli overlay 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[..]] Suddividi le risorse in base a un insieme di configurazioni per generare una versione diversa dell'APK.

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

--proguard-main-dex file File di output per le regole ProGuard generate per il file DEX principale.
--proguard-minimal-keep-rules Genera un insieme minimo di regole di conservazione di ProGuard.
--no-resource-removal Disabilita la rimozione automatica di risorse senza impostazioni predefinite. Utilizza questa opzione solo quando crei pacchetti di overlay di risorse di runtime.
-x Flag precedente che specifica l'utilizzo dell'identificatore di pacchetto 0x01.
--product products-list Specifica un elenco di nomi di prodotti da mantenere separati da virgole.
--no-xml-namespaces Rimuove il prefisso dello spazio dei nomi XML e le informazioni sull'URI dal file AndroidManifest.xml e dai programmi binari XML in res/*.
--shared-lib Genera una libreria di runtime Android condivisa.
--static-lib Genera una libreria Android statica.
--no-static-lib-packages Unisce tutte le risorse della libreria sotto il pacchetto dell'app.
--no-proguard-location-reference Impedisce ai file delle regole di 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 specificato, 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é unirli.
--rename-resources-package package-name Rinomina il pacchetto nella tabella delle risorse in package-name.
--no-compress Non comprime le risorse.
--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. Usa il simbolo $ per la fine della riga. Utilizza una grammatica delle espressioni regolari ECMAScript sensibile alle maiuscole.
--warn-manifest-validation Tratta gli errori di convalida del file 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 di cui è possibile eseguire il debug anche sui dispositivi di produzione.
--strict-visibility Non sono consentiti overlay con diversi livelli di visibilità.
--exclude-sources Non serializza le informazioni del file di origine durante la generazione di risorse in formato Protobuf.
--trace-folder folder Genera il frammento di traccia JSON systrace nello specifico folder.
--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 le Preferenze di lettura dell'output.

Dump

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

Sintassi del dump

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

aapt2 dump sub-command filename.apk [options]

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

aapt2 dump resources output.apk

Esegui il dump dei comandi secondari

Specifica uno dei seguenti sottocomandi con il comando dump:

Tabella 4. Esegui il dump dei comandi secondari

SottocomandoDescrizione
apc Stampa i contenuti del container AAPT2 (APC) generato durante la compilazione.
badging Consente di stampare informazioni estratte dal file manifest dell'APK.
configurations Stampa ogni configurazione utilizzata da una risorsa nell'APK.
overlayable Consente di stampare le risorse dell'APK che è possibile sovrapporre.
packagename Consente di stampare 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 Consente di stampare gli stili 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 ad albero del file 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 eseguire il dump dall'APK.
-v Aumenta le Preferenze di lettura dell'output.

Differenza

Utilizza diff per confrontare due APK e identificare le eventuali differenze.

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 pacchettizzate nell'APK. Questa ottimizzazione può ridurre le dimensioni degli APK di circa l'1-3%, a seconda delle dimensioni e del numero di risorse utilizzate.

Sintassi di Optimize

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 solita rappresentazione di tabella piatta con una struttura ad albero di ricerca binaria più compatta, con il risultato di un APK più piccolo a scapito delle prestazioni di recupero:

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 dell'APK di risorsa collegato.

Questo è un flag required, perché devi specificare il percorso dell'APK di output che può contenere le risorse collegate.

-d directory Specifica il percorso alla directory di output per le suddivisioni.
-x path Specifica il percorso del file di configurazione XML.
-p Consente di stampare gli artefatti dell'APK multiplo e di uscire.
--target-densities density[,density[..]] Specifica un elenco separato da virgole delle densità dello schermo per cui è ottimizzato l'APK. 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 istruzioni per ogni risorsa.

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

-c config[,config[..]] Specifica un elenco separato da virgole di configurazioni da includere. L'impostazione predefinita è Tutte le configurazioni.
--split path:config[,config[..]] Suddividi le risorse in base a un insieme di configurazioni per generare una versione diversa dell'APK.

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

--keep-artifacts artifact[,artifact[..]] Specifica un elenco separato da virgole di artefatti da mantenere. Se non ne viene specificato nessuno, tutti gli artefatti vengono conservati.
--enable-sparse-encoding Consente di attivare la codifica di voci sparse utilizzando una struttura di ricerca binaria. Questa opzione è utile per ottimizzare le dimensioni degli APK, ma a scapito delle prestazioni di recupero delle risorse.
--collapse-resource-names Comprime i nomi delle risorse in un singolo valore nel pool di stringhe di chiavi. Le risorse vengono esenti 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 di output della mappa dei percorsi delle risorse precedenti su percorsi abbreviati.
-v Aumenta le Preferenze di lettura dell'output.
-h Visualizza la guida dello strumento.

Converti

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

Converti sintassi

La sintassi generale di 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 normale rappresentazione di tabella piatta con una struttura di ricerca binaria più compatta, generando un APK più piccolo a scapito delle prestazioni di recupero:

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 dell'APK di risorsa collegato.

Questo è un flag required, 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 configurato, il valore predefinito è binary.
--enable-sparse-encoding Consente di attivare la codifica di voci sparse utilizzando una struttura di ricerca binaria. Questa opzione è utile per ottimizzare le dimensioni degli APK, ma a scapito delle prestazioni di recupero delle risorse.
--keep-raw-values Conserva i valori degli attributi non elaborati nei file XML.
-v Aumenta le Preferenze di lettura dell'output.
-h Visualizza la guida dello strumento.

Modalità daemon

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

Sintassi del daemon

Avvia la modalità daemon con il comando seguente:

aapt2 daemon

Quando la modalità daemon è in esecuzione, 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à daemon premendo Ctrl+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à daemon 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 della modalità daemon

L'unica opzione per la modalità daemon è --trace-folder folder, che genera un frammento di traccia JSON systrace per il valore 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

Cambia il comportamento quando utilizzi AAPT2

Prima di AAPT2, AAPT era la versione predefinita dello strumento Android Asset Packaging Tool, che ora è deprecata. Anche se AAPT2 dovrebbe funzionare immediatamente con i progetti precedenti, questa sezione descrive alcune modifiche del comportamento di cui dovresti essere a conoscenza.

Gerarchie di elementi nel file manifest Android

Nelle versioni precedenti di AAPT, gli elementi nidificati in nodi errati nel file AndroidManifest.xml sono stati ignorati o hanno generato un avviso. Prendi in considerazione il seguente 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 semplicemente ignoravano il tag <action> in posizione errata.

Con AAPT2, ricevi il seguente errore:

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

Per risolvere il problema, assicurati che gli elementi del file manifest siano nidificati correttamente. Per ulteriori informazioni, 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 della risorsa attr:

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

Dichiarare un tipo di risorsa in questo modo genera l'errore di generazione riportato di seguito:

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>, anche il relativo padre deve essere 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 non corretto dei simboli di riferimento delle risorse @

AAPT2 genera errori di build 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 generazione:

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

Inoltre, se includi in modo errato 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 generazione:

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 degli Strumenti di build dell'SDK Android, l'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 stati 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 ricreare la libreria utilizzando la versione più recente di Android Build Tools, quindi ripubblica la libreria.