Il modello di pubblicazione delle app di Google Play utilizza gli Android App Bundle per generare e pubblicare APK ottimizzati per la configurazione del dispositivo di ogni utente, in modo che gli utenti scarichino solo il codice e le risorse necessari per eseguire la tua app.
Play Feature Delivery utilizza le funzionalità avanzate degli app bundle, consentendo di distribuire determinate funzionalità della tua app in base a condizioni specifiche o di scaricarle on demand. Per farlo, devi prima separare queste funzionalità dall'app di base in moduli delle funzionalità.
Configurazione della build del modulo delle funzionalità
Quando crei un nuovo modulo delle funzionalità utilizzando Android Studio, l'IDE
applica il seguente plug-in Gradle al file build.gradle
del modulo.
// The following applies the dynamic-feature plugin to your feature module.
// The plugin includes the Gradle tasks and properties required to configure and build
// an app bundle that includes your feature module.
plugins {
id 'com.android.dynamic-feature'
}
Molte delle proprietà disponibili per il plug-in dell'applicazione standard sono disponibili anche per il modulo delle funzionalità. Le sezioni seguenti descrivono le proprietà che devi e non devi includere nella configurazione di build del modulo delle funzionalità.
Elementi da escludere dalla configurazione di build del modulo delle funzionalità
Poiché ogni modulo delle funzionalità dipende dal modulo di base, eredita anche determinate configurazioni. Pertanto, devi omettere quanto segue nel file build.gradle
del modulo delle funzionalità:
- Configurazioni della firma:gli app bundle vengono firmati utilizzando le configurazioni della firma che specifichi nel modulo base.
- La proprietà
minifyEnabled
:puoi attivare la riduzione del codice per l'intero progetto dell'app solo dalla configurazione di build del modulo base. Pertanto, devi omettere questa proprietà dai moduli delle funzionalità. Tuttavia, puoi specificare regole ProGuard aggiuntive per ogni modulo delle funzionalità. versionCode
eversionName
: quando crei il tuo app bundle, Gradle utilizza le informazioni sulla versione dell'app fornite dal modulo base. Devi omettere queste proprietà dal filebuild.gradle
del modulo delle funzionalità.
Stabilire una relazione con il modulo base
Quando Android Studio crea il modulo della funzionalità, lo rende visibile
al modulo base aggiungendo la proprietà android.dynamicFeatures
al
file build.gradle
del modulo base, come mostrato di seguito:
// In the base module’s build.gradle file.
android {
...
// Specifies feature modules that have a dependency on
// this base module.
dynamicFeatures = [":dynamic_feature", ":dynamic_feature2"]
}
Inoltre, Android Studio include il modulo base come dipendenza del modulo delle funzionalità, come mostrato di seguito:
// In the feature module’s build.gradle file:
...
dependencies {
...
// Declares a dependency on the base module, ':app'.
implementation project(':app')
}
Specificare regole ProGuard aggiuntive
Sebbene solo la configurazione della build del modulo base possa attivare la riduzione del codice
per il progetto dell'app, puoi fornire regole ProGuard personalizzate con ogni
modulo delle funzionalità utilizzando la proprietà
proguardFiles
, come mostrato di seguito.
android.buildTypes {
release {
// You must use the following property to specify additional ProGuard
// rules for feature modules.
proguardFiles 'proguard-rules-dynamic-features.pro'
}
}
Tieni presente che queste regole ProGuard vengono unite a quelle di altri moduli (incluso il modulo base) al momento della compilazione. Pertanto, mentre ogni modulo delle funzionalità può specificare un nuovo insieme di regole, queste regole si applicano a tutti i moduli del progetto dell'app.
Esegui il deployment dell'app
Mentre sviluppi l'app con il supporto dei moduli delle funzionalità, puoi
eseguire il deployment dell'app su un dispositivo connesso come faresti normalmente selezionando
Esegui > Esegui dalla barra dei menu (o facendo clic su Esegui nella
barra degli strumenti).
Se il tuo progetto di app include uno o più moduli delle funzionalità, puoi scegliere le funzionalità da includere durante il deployment dell'app modificando la configurazione di esecuzione/debug esistente come segue:
- Seleziona Esegui > Modifica configurazioni dalla barra dei menu.
- Nel riquadro a sinistra della finestra di dialogo Configurazioni di esecuzione/debug, seleziona la configurazione App Android che preferisci.
- Nella sezione Funzionalità dinamiche da implementare della scheda Generale, seleziona la casella accanto a ogni modulo delle funzionalità da includere durante l'implementazione dell'app.
- Fai clic su OK.
Per impostazione predefinita, Android Studio non esegue il deployment dell'app utilizzando gli app bundle. Al contrario, l'IDE crea e installa APK sul dispositivo ottimizzati per la velocità di deployment, anziché per le dimensioni dell'APK. Per configurare Android Studio in modo da creare ed eseguire il deployment di APK e app istantanee da un app bundle, modifica la configurazione di esecuzione/debug.
Utilizzare i moduli delle funzionalità per la pubblicazione personalizzata
Un vantaggio unico dei moduli delle funzionalità è la possibilità di personalizzare come e quando le diverse funzionalità dell'app vengono scaricate sui dispositivi con Android 5.0 (livello API 21) o versioni successive. Ad esempio, per ridurre le dimensioni di download iniziali dell'app, puoi configurare alcune funzionalità in modo che vengano scaricate on demand in base alle necessità oppure soltanto su dispositivi che le supportano, ad esempio la possibilità di scattare foto o il supporto delle funzionalità di realtà aumentata.
Anche se per impostazione predefinita ottieni download altamente ottimizzati quando carichi l'app come app bundle, le opzioni di distribuzione delle funzionalità più avanzate e personalizzabili richiedono una configurazione e una modularizzazione aggiuntive delle funzionalità dell'app utilizzando i moduli delle funzionalità. ovvero, i moduli delle funzionalità forniscono i componenti di base per la creazione di funzionalità modulari che puoi configurare in modo che vengano scaricate singolarmente in base alle necessità.
Prendi in considerazione un'app che consenta ai tuoi utenti di acquistare e vendere beni in un marketplace online. Puoi modularizzare in modo ragionevole ciascuna delle seguenti funzionalità dell'app in moduli di funzionalità separati:
- Accesso e creazione dell'account
- Navigazione nel marketplace
- Inserimento di un articolo in vendita
- Elaborazione dei pagamenti
La tabella seguente descrive le diverse opzioni di pubblicazione supportate dai moduli delle funzionalità e come possono essere utilizzate per ottimizzare le dimensioni del download iniziale dell'app marketplace di esempio.
Opzione di consegna | Comportamento | Caso d'uso di esempio | Per iniziare |
---|---|---|---|
Pubblicazione al momento dell'installazione | I moduli delle funzionalità che non configurano nessuna delle opzioni di pubblicazione
descritte sopra vengono scaricati durante l'installazione dell'app, per impostazione predefinita. Si tratta di un
comportamento importante perché significa che puoi adottare gradualmente le opzioni di pubblicazione avanzate. Ad esempio, puoi trarre vantaggio dalla modularizzazione delle funzionalità della tua app e attivare la pubblicazione on demand solo dopo aver implementato completamente i download on demand utilizzando la libreria Play Feature Delivery.
Inoltre, la tua app può richiedere di disinstallare le funzionalità in un secondo momento. Pertanto, se hai bisogno di determinate funzionalità al momento dell'installazione dell'app, ma non in seguito, puoi ridurre le dimensioni dell'installazione richiedendo la rimozione della funzionalità dal dispositivo. |
Se l'app ha determinate attività di formazione, ad esempio una guida interattiva
su come acquistare e vendere articoli nel marketplace, puoi includere questa
funzionalità per impostazione predefinita durante l'installazione dell'app.
Tuttavia, per ridurre le dimensioni installate dell'app, quest'ultima può richiedere di eliminare la funzionalità dopo che l'utente ha completato l'addestramento. |
Rendi modulare la tua app utilizzando moduli delle funzionalità che non configurano opzioni di pubblicazione avanzate.
Per scoprire come ridurre le dimensioni installate della tua app rimuovendo determinati moduli di funzionalità che l'utente potrebbe non aver più bisogno, leggi Gestire i moduli installati. |
Consegna on demand | Consente all'app di richiedere e scaricare i moduli delle funzionalità in base alle necessità. | Se solo il 20% degli utenti dell'app marketplace pubblica articoli in vendita, una
buona strategia per ridurre le dimensioni del download iniziale per la maggior parte degli utenti
è rendere disponibile come download on demand la funzionalità per scattare foto, inclusa una
descrizione dell'articolo, e mettere in vendita un articolo. ovvero puoi configurare il modulo della funzionalità per
la funzionalità di vendita dell'app in modo che venga scaricato solo quando un utente mostra
interesse a mettere in vendita articoli sul marketplace.
Inoltre, se l'utente non vende più articoli dopo un determinato periodo di tempo, l'app può ridurre le dimensioni installate richiedendo la disinstallazione della funzionalità. |
Crea un modulo delle funzionalità e configura la pubblicazione on demand. La tua app può quindi utilizzare la libreria Play Feature Delivery per richiedere il download del modulo on demand. |
Distribuzione condizionata | Consente di specificare determinati requisiti del dispositivo utente, ad esempio funzionalità hardware, impostazioni internazionali e livello API minimo, per determinare se una funzionalità modulare viene scaricata al momento dell'installazione dell'app. | Se l'app del marketplace ha una portata globale, potresti dover supportare metodi di pagamento popolari solo in determinate regioni o località. Per ridurre le dimensioni del download iniziale dell'app, puoi creare moduli delle funzionalità separati per l'elaborazione di determinati tipi di metodi di pagamento e farli installare in modo condizionale sul dispositivo di un utente in base alle impostazioni internazionali registrate. | Crea un modulo delle funzionalità e configura la pubblicazione condizionale. |
Consegna istantanea | Google Play Instant
consente agli utenti di interagire con la tua app senza doverla installare
sul proprio dispositivo. Invece, possono provare la tua app tramite il pulsante "Prova
ora" sul Google Play Store o un URL che crei. Questa modalità di
pubblicazione dei contenuti ti consente di aumentare più facilmente il coinvolgimento con la tua
app.
Con la pubblicazione istantanea, puoi utilizzare Google Play Instant per consentire ai tuoi utenti di provare immediatamente alcune funzionalità della tua app senza installarla. |
Prendi in considerazione un gioco che includa i primi livelli in un modulo delle funzionalità leggero. Puoi attivare istantaneamente questo modulo in modo che gli utenti possano provare subito il gioco tramite un link URL o il pulsante "Prova ora", senza installare l'app. | Crea un modulo della funzionalità e
configura
la pubblicazione istantanea. La tua app può quindi utilizzare la
libreria Play Feature Delivery per richiedere il
download del modulo on demand.
Tieni presente che la modularizzazione delle funzionalità dell'app utilizzando i moduli delle funzionalità è solo il primo passo. Per supportare Google Play Instant, le dimensioni del download del modulo di base della tua app e di una determinata funzionalità abilitata per l'app istantanea devono soddisfare rigide limitazioni di dimensioni. Per saperne di più, leggi Attivare le esperienze istantanee riducendo le dimensioni dell'app o del gioco. |
Creazione di un URI per una risorsa
Se vuoi accedere a una risorsa archiviata in un modulo delle funzionalità utilizzando un URI, ecco come generare un URI risorsa del modulo delle funzionalità utilizzando Uri.Builder()
:
Kotlin
val uri = Uri.Builder() .scheme(ContentResolver.SCHEME_ANDROID_RESOURCE) .authority(context.getPackageName()) // Look up the resources in the application with its splits loaded .appendPath(resources.getResourceTypeName(resId)) .appendPath(String.format("%s:%s", resources.getResourcePackageName(resId), // Look up the dynamic resource in the split namespace. resources.getResourceEntryName(resId) )) .build()
Java
String uri = Uri.Builder() .scheme(ContentResolver.SCHEME_ANDROID_RESOURCE) .authority(context.getPackageName()) // Look up the resources in the application with its splits loaded .appendPath(resources.getResourceTypeName(resId)) .appendPath(String.format("%s:%s", resources.getResourcePackageName(resId), // Look up the dynamic resource in the split namespace. resources.getResourceEntryName(resId) )) .build().toString();
Ogni parte del percorso alla risorsa viene creata in fase di runtime, garantendo che lo spazio dei nomi corretto venga generato dopo il caricamento degli APK suddivisi.
Come esempio di come viene generato l'URI, supponiamo di avere un'app e moduli delle funzionalità con questi nomi:
- Nome pacchetto app:
com.example.my_app_package
- Nome del pacchetto di risorse della funzionalità:
com.example.my_app_package.my_dynamic_feature
Se resId
nello snippet di codice precedente si riferisce a una risorsa di file non elaborato denominata
"my_video" nel modulo della funzionalità, il codice Uri.Builder()
precedente
produrrà il seguente output:
android.resource://com.example.my_app_package/raw/com.example.my_app_package.my_dynamic_feature:my_video
Questo URI può essere utilizzato dalla tua app per accedere alla risorsa del modulo delle funzionalità.
Per convalidare i percorsi nell'URI, puoi utilizzare APK Analyzer per esaminare l'APK del modulo delle funzionalità e determinare il nome del pacchetto:

Considerazioni per i moduli delle funzionalità
Con i moduli delle funzionalità, puoi migliorare la velocità di build e di ingegneria e personalizzare in modo approfondito la distribuzione delle funzionalità della tua app per ridurne le dimensioni. Tuttavia, quando utilizzi i moduli delle funzionalità, devi tenere presente alcuni vincoli e casi limite:
- L'installazione di 50 o più moduli delle funzionalità su un singolo dispositivo, tramite la pubblicazione condizionale o on demand, potrebbe causare problemi di prestazioni. I moduli al momento dell'installazione, che non sono configurati come rimovibili, vengono inclusi automaticamente nel modulo di base e vengono conteggiati come un solo modulo delle funzionalità su ogni dispositivo.
- Limita il numero di moduli che configuri come rimovibili per la distribuzione al momento dell'installazione a un massimo di 10. In caso contrario, il tempo di download e installazione dell'app potrebbe aumentare.
- Solo i dispositivi con Android 5.0 (livello API 21) e versioni successive supportano il download e l'installazione di funzionalità on demand. Per rendere disponibile la funzionalità per le versioni precedenti di Android, attiva Fusing quando crei un modulo delle funzionalità.
- Attiva SplitCompat, in modo che la tua app abbia accesso ai moduli delle funzionalità scaricati e forniti su richiesta.
- I moduli delle funzionalità non devono specificare attività nel file manifest con
android:exported
impostato sutrue
. Questo perché non è garantito che il dispositivo abbia scaricato il modulo delle funzionalità quando un'altra app tenta di avviare l'attività. Inoltre, l'app deve confermare che una funzionalità è stata scaricata prima di tentare di accedere al relativo codice e alle relative risorse. Per scoprire di più, leggi Gestire i moduli installati. - Poiché Play Feature Delivery richiede la pubblicazione dell'app utilizzando un app bundle, assicurati di essere a conoscenza dei problemi noti relativi agli app bundle.
Riferimento al manifest del modulo delle funzionalità
Quando crei un nuovo modulo delle funzionalità utilizzando Android Studio, l'IDE include la maggior parte degli attributi manifest necessari al modulo per comportarsi come un modulo delle funzionalità. Inoltre, alcuni attributi vengono inseriti dal sistema di build in fase di compilazione, quindi non è necessario specificarli o modificarli manualmente. La tabella seguente descrive gli attributi del manifest importanti per i moduli delle funzionalità.
Attributo | Descrizione |
---|---|
<manifest | Si tratta di un tipico blocco
<manifest> . |
xmlns:dist="http://schemas.android.com/apk/distribution" | Specifica un nuovo spazio dei nomi XML dist:
descritto più avanti. |
split="split_name" |
Quando Android Studio crea il tuo app bundle, include questo
attributo. Pertanto, non devi includere o modificare
questo attributo personalmente.
Definisce il nome del modulo, che la tua app specifica quando richiede un modulo on demand utilizzando la libreria Play Feature Delivery. Come Gradle determina il valore di questo attributo: Per impostazione predefinita, quando crei un modulo delle funzionalità utilizzando Android Studio, l'IDE utilizza ciò che specifichi come Nome modulo per identificare il modulo come un progetto secondario Gradle nel tuo file di impostazioni Gradle.
Quando crei l'app bundle, Gradle utilizza l'ultimo elemento del percorso del progetto secondario per inserire questo attributo manifest nel manifest del modulo. Ad esempio, se crei un nuovo modulo delle funzionalità nella
directory |
android:isFeatureSplit="true | false"> |
Quando Android Studio crea il tuo app bundle, include
questo attributo. Pertanto, non devi includere
o modificare manualmente questo attributo.
Specifica che questo modulo è un modulo delle funzionalità.
I manifest nel modulo di base e negli APK di configurazione
omettano questo attributo o lo impostino su |
<dist:module | Definisce gli attributi che determinano il modo in cui il modulo viene pacchettizzato e distribuito come APK. |
dist:instant="true | false" |
Specifica se il modulo deve essere disponibile tramite
Google Play Instant come
esperienza istantanea.
Se la tua app include uno o più moduli delle funzionalità abilitati per le app istantanee, devi abilitare per le app istantanee anche il modulo di base. Quando utilizzi Android Studio 3.5 o versioni successive, l'IDE esegue questa operazione quando crei un modulo delle funzionalità abilitato per le app istantanee. Non puoi impostare questo elemento XML su |
dist:title="@string/feature_name"> |
Specifica un titolo visibile all'utente per il modulo. Ad esempio,
il dispositivo potrebbe mostrare questo titolo quando richiede la conferma
del download.
Devi includere la risorsa stringa per questo titolo
nel file |
<dist:fusing dist:include="true | false" /> |
Specifica se includere il modulo negli APK multipli
destinati a dispositivi con sistema operativo Android 4.4 (livello API 20) e versioni precedenti.
Inoltre, quando
utilizzi |
<dist:delivery> | Contiene le opzioni che personalizzano la pubblicazione dei moduli, come mostrato di seguito. Tieni presente che ogni modulo delle funzionalità deve configurare un solo tipo di queste opzioni di consegna personalizzate. |
<dist:install-time> |
Specifica che il modulo deve essere disponibile al momento dell'installazione. Questo è il
comportamento predefinito per i moduli delle funzionalità che non specificano un altro
tipo di opzione di distribuzione personalizzata.
Per scoprire di più sui download durante l'installazione, leggi Configurare la distribuzione durante l'installazione. Questo nodo può anche specificare condizioni che limitano il modulo ai dispositivi che soddisfano determinati requisiti, come le funzionalità del dispositivo, il paese dell'utente o il livello API minimo. Per saperne di più, leggi Configurare la consegna condizionata. |
<dist:removable dist:value="true | false" /> |
Se non è impostato o è impostato su Quando Il valore predefinito è Nota: questa funzionalità è disponibile solo quando utilizzi il plug-in Android Gradle 4.2 o bundletool v1.0 dalla riga di comando. |
</dist:install-time> | |
<dist:on-demand /> |
Specifica che il modulo deve essere disponibile come download on demand. ovvero il modulo non è disponibile al momento dell'installazione, ma la tua
app potrebbe richiedere di scaricarlo in un secondo momento.
Per scoprire di più sui download on demand, leggi Configurare la distribuzione on demand. |
</dist:delivery> | |
</dist:module> | |
<application
android:hasCode="true | false"> ... </application> |
Se il modulo della funzionalità non genera file DEX, ovvero non contiene
codice che viene compilato in un secondo momento nel formato di file DEX, devi
eseguire le seguenti operazioni (altrimenti potresti ricevere errori di runtime):
|
... </manifest> |
Risorse aggiuntive
Per scoprire di più sull'utilizzo dei moduli delle funzionalità, consulta le seguenti risorse.
Post del blog
- Nuove funzionalità per aiutarti a sviluppare, rilasciare e far crescere la tua attività su Google Play
- Gli ultimi aggiornamenti di Android App Bundle, inclusa l'API delle lingue aggiuntive
- Patchwork Plaid: una storia di modularizzazione
Video
- Pubblicazione personalizzabile con l'app bundle e facilità di condivisione dei build di test
- Nuovi strumenti per ottimizzare le dimensioni dell'app e aumentare le installazioni su Google Play
Termini di servizio e sicurezza dei dati
Se accedi alla libreria Play Feature Delivery o la utilizzi, accetti i Termini di servizio del kit di sviluppo software Play Core. Leggi e comprendi tutti i termini e le norme vigenti prima di accedere alla libreria.
Sicurezza dei dati
Le librerie Play Core sono l'interfaccia di runtime della tua app con il Google Play Store. Pertanto, quando utilizzi Play Core nella tua app, il Play Store esegue i propri processi, che includono la gestione dei dati regolata dai Termini di servizio di Google Play. Le informazioni riportate di seguito descrivono come le librerie Play Core gestiscono i dati per elaborare richieste specifiche dalla tua app.
API per lingue aggiuntive
Dati raccolti sull'utilizzo | Elenco delle lingue installate |
Scopo della raccolta dei dati | I dati raccolti vengono utilizzati per fornire versioni dell'app in lingue diverse e per conservare le lingue installate dopo un aggiornamento dell'app. |
Crittografia dei dati | I dati sono criptati. |
Condivisione dei dati | I dati non vengono trasferiti a terze parti. |
Eliminazione dei dati | I dati vengono eliminati dopo un periodo di conservazione fisso. |
Play Feature Delivery
Dati raccolti sull'utilizzo |
Metadati del dispositivo Versione dell'applicazione |
Scopo della raccolta dei dati | I dati raccolti vengono utilizzati per pubblicare il modulo corretto sul dispositivo e per conservare i moduli installati dopo un aggiornamento e un backup e ripristino. |
Crittografia dei dati | I dati sono criptati. |
Condivisione dei dati | I dati non vengono trasferiti a terze parti. |
Eliminazione dei dati | I dati vengono eliminati dopo un periodo di conservazione fisso. |
Sebbene il nostro obiettivo sia la massima trasparenza, sei l'unico responsabile della decisione su come rispondere al modulo della sezione Sicurezza dei dati di Google Play in merito alle pratiche di raccolta, condivisione e sicurezza dei dati utente della tua app.