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:
- Nell'indice del repository, vai a com.android.tools.build > aapt2.
- Copia il nome dell'ultima versione di AAPT2.
- 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 
- Apri l'URL in un browser. Il download di AAPT2 inizierà a breve. 
- Decomprimi il file JAR che hai appena scaricato. - Il file JAR deve contenere un eseguibile - aapt2e 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.flatcome estensione. | 
| Tutti gli altri file di risorse. | 
    Tutti i file diversi da quelli nella directory  
    Inoltre, tutti i file PNG vengono compressi per impostazione predefinita e adottano le estensioni  | 
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-XAeen-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 resda scansionare per
     le risorse. | 
| -output-text-symbols file | Genera un file di testo contenente i simboli delle risorse nel | 
| -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 systracenella | 
| -source-path path | Imposta il percorso del file di origine del file di risorse compilato su | 
| -h | Visualizza la guida degli strumenti. | 
| -v | Attiva il logging dettagliato. | 
Link
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.
Sintassi dei link
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
Opzioni di collegamento
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  androidnei 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 .flatalink, utilizzando la semanticaoverlaysenza 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 | 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
         Questa opzione deve essere utilizzata solo per i pacchetti con versione  | 
| --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.xmlse non è presente. | 
| --version-name version-name | Specifica il nome della versione da inserire in AndroidManifest.xmlse non è presente. | 
| --revision-code revision-code | Specifica il codice di revisione da inserire nel file AndroidManifest.xmlse non è presente. | 
| --replace-version | Se vengono specificati --version-code,--version-nameo--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.xmlse non è presente. | 
| 
        --compile-sdk-version-name compile-sdk-version-name
       | Specifica il nome della versione da inserire nel file AndroidManifest.xmlse non è presente. | 
| --proto-format | Genera risorse compilate in formato Protobuf. Adatto come input per
        
         | 
| --non-final-ids | Genera R.javacon ID risorsa non definitivi. I riferimenti agli
      ID del codice dell'app non vengono incorporati durante la compilazione dikotlincojavac. | 
| --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-idscontenente 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 Rnel 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
       | 
| -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.xmle dai binari XML inres/*. | 
| --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.javaper 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 -Rsostituiscano 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 systracenel 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
| Sottocomando | Descrizione | 
|---|---|
| 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
| Opzione | Descrizione | 
|---|---|
| --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
| 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. | 
| -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  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_collapsein
     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
| 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. | 
| --output-format [proto|binary] | Formato dell'output. I valori accettati sono protoebinary. 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.
