Il formato Android App Bundle

Un Android App Bundle è un file (con estensione .aab) che carichi su Google Play.

Gli app bundle sono programmi binari firmati che organizzano il codice e le risorse della tua app in moduli, come illustrato nella Figura 1. Il codice e le risorse per ogni modulo sono organizzati in modo simile a ciò che si trova in un APK, e questo ha senso perché ciascuno di questi moduli può essere generato come APK separato. Google Play utilizza quindi l'app bundle per generare i vari APK pubblicati per gli utenti, ad esempio APK di base, APK delle funzionalità, APK di configurazione e APK multipli (per i dispositivi che non supportano APK divisi). Le directory colorate in blu, come le directory drawable/, values/ e lib/, rappresentano il codice e le risorse che Google Play utilizza per creare APK di configurazione per ogni modulo.

Gli app bundle organizzano la tua app in directory che rappresentano ciascuna un modulo. All'interno della directory di ogni modulo, il codice e le risorse sono organizzati in modo simile a quello di un tipico APK.

Figura 1. I contenuti di un Android App Bundle con un modulo base, due moduli delle funzionalità e due pacchetti di asset.

Il seguente elenco descrive in modo più dettagliato alcuni file e directory dell'app bundle:

  • base/, feature1/ e feature2/: ciascuna di queste directory di primo livello rappresenta un modulo diverso dell'app. Il modulo di base per l'app è sempre contenuto in una directory base dell'app bundle. Tuttavia, alla directory di ogni modulo delle funzionalità viene assegnato il nome specificato dall'attributo split nel file manifest del modulo. Per saperne di più, consulta la sezione sul manifest del modulo delle funzionalità.
  • asset_pack_1/ e asset_pack_2/: per app o giochi di grandi dimensioni che richiedono una grafica grafica, puoi modularizzare gli asset in pacchetti. I pacchetti di asset sono ideali per i giochi a causa dei limiti di dimensioni elevati. Puoi personalizzare le modalità e i tempi di download di ogni pacchetto di asset su un dispositivo in base a tre modalità di pubblicazione: tempo di installazione, implementazione rapida e on demand. Tutti i pacchetti di asset sono ospitati e pubblicati da Google Play. Per scoprire di più su come aggiungere pacchetti di asset al tuo app bundle, consulta la panoramica di Play Asset Delivery.
  • METADATI-BUNDLE/: questa directory include file di metadati contenenti informazioni utili per strumenti o app store. Questi file di metadati possono includere mappature ProGuard e l'elenco completo dei file DEX della tua app. I file in questa directory non sono pacchettizzati negli APK dell'app.
  • File Module Protocol Buffer (*.pb): questi file forniscono metadati che aiutano a descrivere i contenuti di ciascun modulo dell'app agli store, ad esempio Google Play. Ad esempio, BundleConfig.pb fornisce informazioni sul bundle stesso, come la versione degli strumenti di creazione utilizzata per creare l'app bundle, mentre native.pb e resources.pb descrivono il codice e le risorse in ogni modulo, che sono utili quando Google Play ottimizza gli APK per le diverse configurazioni dispositivo.
  • manifest/: a differenza degli APK, gli app bundle archiviano il file AndroidManifest.xml di ogni modulo in questa directory separata.
  • dex/: a differenza degli APK, gli app bundle archiviano i file DEX per ogni modulo in questa directory separata.
  • res/, lib/ e assets/: queste directory sono identiche a quelle di un tipico APK. Quando carichi l'app bundle, Google Play controlla queste directory e pacchettizza solo i file che soddisfano la configurazione del dispositivo di destinazione, mantenendo i percorsi dei file.
  • root/: questa directory archivia i file che vengono successivamente spostati nella directory principale di qualsiasi APK che include il modulo in cui si trova questa directory. Ad esempio, la directory base/root/ di un app bundle potrebbe includere risorse basate su Java caricate dalla tua app utilizzando Class.getResource(). Questi file vengono successivamente spostati nella directory principale dell'APK di base dell'app e in ogni APK multiplo generato da Google Play. Vengono conservati anche i percorsi all'interno di questa directory. In altre parole, anche le directory (e le relative sottodirectory) vengono spostate nella directory principale dell'APK.

Panoramica degli APK divisi

Un componente fondamentale per la pubblicazione di applicazioni ottimizzate è il meccanismo degli APK split, disponibile su Android 5.0 (livello API 21) e versioni successive. Gli APK Split sono molto simili agli APK normali: includono bytecode DEX compilato, risorse e un file manifest Android. Tuttavia, la piattaforma Android è in grado di gestire più APK divisi installati come un'unica app, vale a dire che puoi installare più APK suddivisi che hanno accesso a codice e risorse comuni e che vengono visualizzati come un'unica app installata sul dispositivo.

Il vantaggio degli APK divisi è la possibilità di suddividere un APK monolitico, ovvero un APK che include codice e risorse per tutte le funzionalità e le configurazioni dei dispositivi supportate dalla tua app, in pacchetti discreti più piccoli che vengono installati sul dispositivo di un utente secondo necessità.

Ad esempio, un APK diviso potrebbe includere il codice e le risorse per una funzionalità aggiuntiva di cui solo alcuni utenti hanno bisogno, mentre un altro APK diviso include risorse solo per una lingua o una densità dello schermo specifica. Ciascuno di questi APK divisi viene scaricato e installato quando l'utente lo richiede o quando è richiesto dal dispositivo.

Di seguito vengono descritti i diversi tipi di APK che possono essere installati su un dispositivo per creare un'esperienza completa con l'app. Nelle sezioni successive di questa pagina imparerai a configurare il progetto dell'app per il supporto di questi APK.

  • APK di base: questo APK contiene codice e risorse a cui possono accedere tutti gli altri APK divisi e fornisce le funzionalità di base della tua app. Quando un utente richiede di scaricare la tua app, questo APK viene scaricato e installato per primo. Questo accade perché solo il file manifest dell'APK di base contiene una dichiarazione completa dei servizi, dei fornitori di contenuti, delle autorizzazioni, dei requisiti di versione della piattaforma e delle dipendenze dalle funzionalità di sistema della tua app. Google Play genera l'APK di base per l'app dal modulo dell'app (o di base) del tuo progetto. Se vuoi ridurre le dimensioni di download iniziali dell'app, è importante tenere presente che tutto il codice e le risorse inclusi in questo modulo sono inclusi nell'APK di base della tua app.
  • APK di configurazione: ognuno di questi APK include librerie e risorse native per densità dello schermo, architettura della CPU o linguaggio specifici. Quando un utente scarica la tua app, il dispositivo scarica e installa solo gli APK di configurazione che hanno come target il suo dispositivo. Ogni APK di configurazione è una dipendenza di un APK di base o di un APK di moduli delle funzionalità. In altre parole, vengono scaricati e installati insieme all'APK per cui forniscono codice e risorse. A differenza dei moduli di base e delle funzionalità, non devi creare un modulo separato per gli APK di configurazione. Se adotti procedure standard per organizzare risorse alternative specifiche per la configurazione per i moduli di base e delle funzionalità, Google Play genera automaticamente APK di configurazione per te.
  • APK dei moduli delle funzionalità: ognuno di questi APK contiene codice e risorse per una funzionalità della tua app che modularizza usando i moduli delle funzionalità. Puoi quindi personalizzare le modalità e i tempi di download della funzionalità su un dispositivo. Ad esempio, utilizzando la libreria di base Play, le funzionalità possono essere installate on demand dopo l'installazione dell'APK di base sul dispositivo per fornire funzionalità aggiuntive all'utente. Prendiamo in considerazione un'app di chat che scarica e installa la possibilità di acquisire e inviare foto solo quando l'utente richiede di utilizzare questa funzionalità. Poiché i moduli delle funzionalità potrebbero non essere disponibili al momento dell'installazione, devi includere codice e risorse comuni nell'APK di base. In altre parole, il modulo delle funzionalità deve presupporre che il codice e le risorse dell'APK di base siano disponibili al momento dell'installazione. Google Play genera APK dei moduli delle funzionalità per la tua app dai moduli delle funzionalità del tuo progetto.

Prendiamo in considerazione un'app con tre moduli di funzionalità e il supporto di più configurazioni del dispositivo. La Figura 1 riportata di seguito illustra l'aspetto dell'albero delle dipendenze per i vari APK dell'app. Tieni presente che l'APK di base è l'intestazione dell'albero, mentre tutti gli altri APK dipendono dall'APK di base. Se vuoi conoscere il modo in cui i moduli per questi APK sono rappresentati in un Android App Bundle, consulta la sezione Formato Android App Bundle.

L'APK di base si trova in cima alla struttura, con gli APK dei moduli funzionalità che hanno una dipendenza. Gli APK di configurazione, che includono codice e risorse specifici della configurazione del dispositivo per la base e ogni APK del modulo delle funzionalità, formano i nodi foglia dell'albero delle dipendenze.

Figura 1. Albero delle dipendenze per un'app pubblicata utilizzando APK divisi

Tieni presente che non è necessario creare questi APK autonomamente perché Google Play lo fa per te utilizzando un singolo app bundle firmato che crei con Android Studio. Per scoprire di più sul formato dell'app bundle e su come crearne uno, consulta Creare, eseguire il deployment e caricare Android App Bundle.

Dispositivi con Android 4.4 (livello API 19) e versioni precedenti

Poiché i dispositivi con Android 4.4 (livello API 19) e versioni precedenti non supportano il download e l'installazione di APK divisi, Google Play pubblica per questi dispositivi un unico APK, chiamato APK multiplo, ottimizzato per la configurazione del dispositivo. In altre parole, gli APK multipli rappresentano l'esperienza completa dell'app, ma non includono codice e risorse non necessarie, come quelli per altre densità dello schermo e architetture CPU.

Tuttavia, includono risorse per tutte le lingue supportate dalla tua app. Ciò consente, ad esempio, agli utenti di modificare l'impostazione della lingua preferita dell'app senza dover scaricare un APK multiplo diverso.

Gli APK multipli non consentono di scaricare in un secondo momento i moduli delle funzionalità on demand. Per includere un modulo delle funzionalità in questo APK, devi disattivare l'opzione On demand o abilitare l'opzione Fusing durante la creazione del modulo delle funzionalità.

Tieni presente che, con gli app bundle, non è necessario creare, firmare, caricare e gestire APK per ogni configurazione dispositivo supportata dall'app. Devi comunque creare e caricare un solo app bundle per l'intera app e Google Play si occupa del resto al posto tuo. Quindi, che preveda di supportare o meno i dispositivi con Android 4.4 o versioni precedenti, Google Play offre un meccanismo di pubblicazione flessibile per te e per i tuoi utenti.

Modifiche alla lingua dell'utente

Con gli app bundle, i dispositivi scaricano solo il codice e le risorse necessarie per eseguire la tua app. Di conseguenza, per le risorse linguistiche, il dispositivo di un utente scarica solo le risorse linguistiche dell'app corrispondenti a una o più lingue attualmente selezionate nelle impostazioni del dispositivo.

Quando un utente cambia la lingua nelle impostazioni del dispositivo, Google Play potrebbe dover scaricare e installare alcuni APK divisi aggiuntivi prima che l'app possa essere visualizzata nella nuova lingua.

Google Play tenta di scaricare le lingue aggiuntive subito dopo il passaggio. Se il dispositivo dell'utente è offline, il download non riesce o le risorse sono troppo grandi, Google Play tenta di eseguire nuovamente il download in background quando le condizioni del dispositivo sono più favorevoli. Se l'app è in esecuzione su un dispositivo con Android 9.0 (livello API 28) o versioni precedenti, se la tua app è in primo piano durante l'installazione dei nuovi APK divisi per lingua, l'app viene interrotta.

Se la tua app richiede che tutte le lingue siano disponibili sul dispositivo in qualsiasi momento, puoi disabilitare la suddivisione della lingua nella configurazione della build.

Se la tua app richiede di scaricare altre lingue indipendentemente dalle lingue utente selezionate nelle impostazioni del dispositivo (ad esempio per implementare un selettore lingua in-app), puoi usare la libreria di base Play per scaricarle on demand.