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 l'app.
Play Feature Delivery utilizza funzionalità avanzate degli app bundle, consentendo la distribuzione di determinate funzionalità della tua app in modo condizionale o il download on demand. Per farlo, devi prima separare queste funzionalità dall'app di base in moduli delle funzionalità.
Configurazione di compilazione del modulo della funzionalità
Quando crei un nuovo modulo della 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 della funzionalità. Le sezioni seguenti descrivono le proprietà che devi e non devi includere nella configurazione di compilazione del modulo della funzionalità.
Elementi da escludere dalla configurazione di compilazione del modulo della funzionalità
Poiché ogni modulo della funzionalità dipende dal modulo di base, eredita anche alcune configurazioni. Pertanto, devi omettere quanto segue nel file build.gradle del modulo della funzionalità:
- Configurazioni di firma: gli app bundle vengono firmati utilizzando le configurazioni di firma specificate nel modulo di base.
- La proprietà
minifyEnabled: puoi attivare la riduzione del codice per l'intero progetto dell'app solo dalla configurazione di compilazione del modulo di base. Pertanto, devi omettere questa proprietà dai moduli delle funzionalità. Tuttavia, puoi specificare regole ProGuard aggiuntive per ogni modulo della funzionalità. versionCodeeversionName: quando crei l'app bundle, Gradle utilizza le informazioni sulla versione dell'app fornite dal modulo di base. Devi omettere queste proprietà dal filebuild.gradledel modulo della funzionalità.
Stabilisci una relazione con il modulo di base
Quando Android Studio crea il modulo della funzionalità, lo rende visibile
al modulo di base aggiungendo la proprietà android.dynamicFeatures al
file build.gradle del modulo di 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 di base come dipendenza del modulo della 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')
}
Specifica regole ProGuard aggiuntive
Anche se solo la configurazione di compilazione del modulo di base può attivare la riduzione del codice per il progetto dell'app, puoi fornire regole ProGuard personalizzate con ogni modulo della 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 di base) in fase di build. Pertanto, anche se ogni modulo della 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
Durante lo sviluppo dell'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 progetto dell'app include uno o più moduli delle funzionalità, puoi scegliere quali funzionalità 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 dell'app per Android che preferisci.
- Nella sezione Funzionalità dinamiche da implementare della scheda Generali, seleziona la casella accanto a ogni modulo della funzionalità che vuoi includere durante l'implementazione dell'app.
- Fai clic su OK.
Per impostazione predefinita, Android Studio non esegue il deployment della tua app utilizzando gli app bundle. L'IDE crea e installa sul tuo dispositivo APK ottimizzati per la velocità di deployment, anziché per le dimensioni dell'APK. Per configurare Android Studio in modo che crei ed esegua il deployment di APK ed esperienze istantanee da un app bundle, modifica la configurazione di esecuzione/debug.
Utilizza i moduli delle funzionalità per la distribuzione personalizzata
Un vantaggio unico dei moduli delle funzionalità è la possibilità di personalizzare come e quando le diverse funzionalità della tua app vengono scaricate sui dispositivi con Android 5.0 (livello API 21) o versioni successive. Ad esempio, per ridurre le dimensioni del download iniziale della tua app, puoi configurare determinate funzionalità in modo che vengano scaricate on demand in base alle esigenze o solo dai dispositivi che supportano determinate funzionalità, come la possibilità di scattare foto o il supporto delle funzionalità di realtà aumentata.
Anche se per impostazione predefinita i download sono 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à. In altre parole, i moduli delle funzionalità forniscono i componenti di base per creare funzionalità modulari che puoi configurare in modo che vengano scaricate in base alle esigenze.
Prendi in considerazione un'app che consente agli utenti di acquistare e vendere prodotti in un marketplace online. Puoi modularizzare ragionevolmente ciascuna delle seguenti funzionalità dell'app in moduli delle funzionalità separati:
- Accesso e creazione dell'account
- Navigazione nel Marketplace
- Mettere in vendita un articolo
- 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 di esempio del marketplace.
| Opzione 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 distribuzione descritte sopra vengono scaricati per impostazione predefinita al momento dell'installazione dell'app. Questo è 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 distribuzione on demand solo dopo aver implementato completamente i download on demand utilizzando la libreria Play Feature Delivery.
Inoltre, la tua app può richiedere la disinstallazione delle funzionalità in un secondo momento. Pertanto, se hai bisogno di determinate funzionalità al momento dell'installazione dell'app, ma non in un secondo momento, puoi ridurre le dimensioni di installazione richiedendo la rimozione della funzionalità dal dispositivo. |
Se l'app prevede determinate attività di formazione, ad esempio una guida interattiva
su come acquistare e vendere articoli nel marketplace, puoi includere questa
funzionalità al momento dell'installazione dell'app, per impostazione predefinita.
Tuttavia, per ridurre le dimensioni di installazione dell'app, quest'ultima può richiedere di eliminare la funzionalità dopo che l'utente ha completato l'addestramento. |
Modularizza la tua app utilizzando moduli delle funzionalità che non configurano opzioni di distribuzione avanzate.
Per scoprire come ridurre le dimensioni di installazione della tua app rimuovendo determinati moduli delle funzionalità che l'utente potrebbe non utilizzare più, leggi Gestisci i moduli installati. |
| Consegna on demand | Consente alla tua app di richiedere e scaricare i moduli delle funzionalità in base alle esigenze. | Se solo il 20% degli utenti che utilizzano l'app del 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, includere una descrizione dell'articolo e mettere in vendita un articolo. In altre parole, 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 di installazione richiedendo la disinstallazione della funzionalità. |
Crea un modulo della funzionalità e configura la pubblicazione on demand. L'app può quindi utilizzare la libreria Play Feature Delivery per richiedere il download del modulo on demand. |
| Pubblicazione condizionale | Consente di specificare determinati requisiti del dispositivo dell'utente, come le funzionalità hardware, le impostazioni internazionali e il livello API minimo per determinare se una funzionalità modularizzata 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 di download iniziali dell'app, puoi creare moduli delle funzionalità separati per l'elaborazione di determinati tipi di metodi di pagamento e installarli in modo condizionale sul dispositivo di un utente in base alle impostazioni internazionali registrate. | Crea un modulo della funzionalità e configura la distribuzione 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 forma di pubblicazione dei contenuti ti consente di aumentare più facilmente il coinvolgimento con la tua app.
Con la distribuzione istantanea, puoi utilizzare Google Play Instant per consentire agli utenti di provare immediatamente alcune funzionalità della tua app senza installarla. |
Prendi in considerazione un gioco che include i primi livelli in un modulo della funzionalità leggero. Puoi attivare questo modulo ad attivazione istantanea in modo che gli utenti possano provare immediatamente 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. L'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 passaggio. Per supportare Google Play Instant, le dimensioni di download del modulo di base della tua app e di una determinata funzionalità ad attivazione istantanea devono rispettare rigorose limitazioni di dimensioni. Per scoprire di più, consulta Attiva 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 della funzionalità utilizzando un URI, ecco come generare un URI della risorsa del modulo della 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 della risorsa viene creata in fase di runtime, garantendo che venga generato lo spazio dei nomi corretto dopo il caricamento degli APK divisi.
Ecco un esempio di come viene generato l'URI. Supponiamo che tu abbia un'app e dei moduli delle funzionalità con questi nomi:
- Nome del pacchetto applicativo:
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 riportato sopra fa riferimento a una risorsa file non elaborato denominata "my_video" nel modulo della funzionalità, il codice Uri.Builder() riportato sopra genererà il seguente output:
android.resource://com.example.my_app_package/raw/com.example.my_app_package.my_dynamic_feature:my_video
Questo URI può quindi essere utilizzato dalla tua app per accedere alla risorsa del modulo della funzionalità.
Per convalidare i percorsi nell'URI, puoi utilizzare lo Strumento di analisi APK per ispezionare l'APK del modulo della funzionalità e determinare il nome del pacchetto:
Considerazioni sui moduli delle funzionalità
Con i moduli delle funzionalità, puoi migliorare la velocità di creazione e di progettazione e personalizzare ampiamente la distribuzione delle funzionalità della tua app per ridurne le dimensioni. Tuttavia, esistono alcuni vincoli e casi limite da tenere presenti quando si utilizzano i moduli delle funzionalità:
- L'installazione di 50 o più moduli delle funzionalità su un singolo dispositivo, tramite 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 della funzionalità su ogni dispositivo.
- Limita il numero di moduli che configuri come rimovibili per la pubblicazione 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 l'opzione Fusing quando crei un modulo della funzionalità.
- Attiva SplitCompat, in modo che la tua app abbia accesso ai moduli delle funzionalità scaricati che vengono forniti on demand.
- I moduli delle funzionalità non devono specificare attività nel manifest con
android:exportedimpostato sutrue. Questo perché non è garantito che il dispositivo abbia scaricato il modulo della 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 Gestisci i moduli installati. - Poiché Play Feature Delivery richiede la pubblicazione dell'app utilizzando un app bundle, assicurati di conoscere i problemi noti degli app bundle.
Riferimento del manifest del modulo della funzionalità
Quando crei un nuovo modulo della funzionalità utilizzando Android Studio, l'IDE include la maggior parte degli attributi del manifest richiesti dal modulo per comportarsi come un modulo della funzionalità. Inoltre, alcuni attributi vengono inseriti dal sistema di compilazione 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 | Questo è 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 l'app bundle, include questo attributo per te. Pertanto, non devi includere o modificare questo attributo autonomamente.
Definisce il nome del modulo, che viene specificato dalla tua app quando richiede un modulo on demand utilizzando la libreria Play Feature Delivery. In che modo Gradle determina il valore di questo attributo: Per impostazione predefinita, quando crei un modulo della funzionalità utilizzando Android Studio, l'IDE utilizza il nome del modulo specificato per identificare il modulo come sottoprogetto Gradle nel file di impostazioni Gradle.
Quando crei l'app bundle, Gradle utilizza l'ultimo elemento del percorso del sottoprogetto per inserire questo attributo manifest nel manifest del modulo. Ad esempio, se crei un nuovo modulo della funzionalità nella directory |
| android:isFeatureSplit="true | false"> |
Quando Android Studio crea l'app bundle, include questo attributo per te. Pertanto, non devi includere o modificare questo attributo manualmente.
Specifica che questo modulo è un modulo della funzionalità.
I manifest nel modulo di base e negli APK di configurazione omettono questo attributo o lo impostano 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à ad attivazione istantanea, devi attivare istantaneamente anche il modulo di base. Se utilizzi Android Studio 3.5 o versioni successive, l'IDE esegue questa operazione per te quando crei un modulo della funzionalità ad attivazione istantanea. Non puoi impostare questo elemento XML su |
| dist:title="@string/feature_name"> |
Specifica un titolo rivolto agli utenti per il modulo. Ad esempio, il dispositivo potrebbe visualizzare 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 in più APK che hanno come target dispositivi con Android 4.4 (livello API 20) e versioni precedenti.
Inoltre, quando
utilizzi |
| <dist:delivery> | Incapsula le opzioni che personalizzano la distribuzione del modulo, come mostrato di seguito. Tieni presente che ogni modulo della funzionalità deve configurare un solo tipo di queste opzioni di distribuzione personalizzata. |
| <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 al momento dell'installazione, leggi Configura la distribuzione al momento dell'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 Configura il recapito condizionale. |
| <dist:removable dist:value="true | false" /> |
Se non viene impostato o se viene impostato su Quando Il valore predefinito è Nota:questa funzionalità è disponibile solo se utilizzi il plug-in Android per 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. In altre parole, il modulo non è disponibile al momento dell'installazione, ma la tua app potrebbe richiederne il download in un secondo momento.
Per scoprire di più sui download on demand, leggi Configura 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 poi compilato nel formato file DEX, devi procedere come segue (altrimenti potresti ricevere errori di runtime):
|
| … </manifest> |
Risorse aggiuntive
Per scoprire di più sull'utilizzo dei moduli delle funzionalità, consulta le seguenti risorse.
Blog post
- Nuove funzionalità per aiutarti a sviluppare, lanciare e far crescere la tua attività su Google Play
- Gli ultimi aggiornamenti di Android App Bundle, inclusa l'API per le lingue aggiuntive
- Patchwork Plaid — A modularization story
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 software development kit della libreria di base Play. Leggi e comprendi tutti i termini e le norme applicabili prima di accedere alla raccolta.
Sicurezza dei dati
Le librerie di base Play sono l'interfaccia di runtime della tua app con il Google Play Store. Pertanto, quando utilizzi la libreria di base Play nella tua app, il Play Store esegue i propri processi, che includono la gestione dei dati come stabilito dai Termini di servizio di Google Play. Le informazioni riportate di seguito descrivono in che modo le librerie di base Play gestiscono i dati per elaborare richieste specifiche della 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 vengono 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 fornire il modulo corretto al dispositivo e per conservare i moduli installati dopo un aggiornamento, un backup e un ripristino. |
| Crittografia dei dati | I dati vengono 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. |
Anche se cerchiamo di essere il più trasparenti possibile, sei l'unico responsabile delle risposte che fornisci nel modulo della sezione Sicurezza dei dati di Google Play per quanto riguarda le modalità di raccolta dei dati, condivisione e sicurezza dei dati utente dell'app.