Panoramica di Play Feature Delivery

Il modello di pubblicazione di app di Google Play utilizza Android App Bundle per generare e pubblicare APK ottimizzati per la configurazione del dispositivo di ciascun utente, in modo che gli utenti scarichino solo il codice e le risorse necessarie per eseguire l'app.

Play Feature Delivery usa funzionalità avanzate degli app bundle, consentendo a determinate funzionalità della tua app di essere fornite in modo condizionale o scaricate on demand. Per farlo, devi prima separare queste funzionalità dall'app di base in moduli delle funzionalità.

Configurazione build modulo 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 seguenti sezioni descrivono le proprietà che dovresti e non dovresti includere nella configurazione della build del tuo modulo delle funzionalità.

Cosa non includere nella configurazione di compilazione del modulo delle funzionalità

Poiché ogni modulo di funzionalità dipende dal modulo di base, eredita anche determinate configurazioni. Devi quindi omettere quanto segue nel file build.gradle del modulo delle funzionalità:

  • Configurazioni di firma: gli app bundle vengono firmati utilizzando le configurazioni di firma specificate nel modulo di base.
  • La proprietà minifyEnabled: puoi abilitare la riduzione del codice per l'intero progetto dell'app solo dalla configurazione di build del modulo di base. Dovresti quindi omettere questa proprietà dai moduli delle caratteristiche. Tuttavia, è possibile specificare regole ProGuard aggiuntive per ogni modulo della funzionalità.
  • versionCode e versionName: quando crei l'app bundle, Gradle utilizza le informazioni sulla versione dell'app fornite dal modulo di base. Dovresti omettere queste proprietà dal file build.gradle del modulo delle funzionalità.

Stabilire una relazione con il modulo di base

Quando Android Studio crea il modulo delle 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 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

Anche se solo la configurazione di build del modulo di base può consentire la riduzione del codice per il progetto dell'app, puoi fornire regole ProGuard personalizzate con ogni modulo di 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) al momento della creazione. Pertanto, sebbene ogni modulo di funzionalità possa specificare un nuovo insieme di regole, queste si applicano a tutti i moduli nel progetto di app.

Esegui il deployment dell'app

Durante lo sviluppo della tua app con il supporto di 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 della tua app include uno o più moduli di funzionalità, puoi scegliere quali funzionalità includere quando esegui il deployment dell'app modificando la configurazione di esecuzione/debug esistente nel seguente modo:

  1. Seleziona Esegui > Modifica configurazioni dalla barra dei menu.
  2. Nel riquadro a sinistra della finestra di dialogo Esegui/configura configurazioni di debug, seleziona la configurazione app per Android che preferisci.
  3. In Funzionalità dinamiche da implementare nella scheda Generale, seleziona la casella accanto a ogni modulo delle funzionalità che vuoi includere quando esegui il deployment dell'app.
  4. Fai clic su Ok.

Per impostazione predefinita, Android Studio non esegue il deployment della tua app tramite app bundle per implementare l'app. Al contrario, l'IDE crea e installa sul tuo dispositivo APK ottimizzati per la velocità di deployment, anziché le dimensioni degli APK. Per configurare Android Studio in modo da creare ed eseguire il deployment di APK ed esperienze istantanee da un app bundle, modifica la configurazione di esecuzione/debug.

Utilizzare i moduli delle caratteristiche per la pubblicazione 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 di download iniziali dell'app, puoi configurare determinate funzionalità in modo che vengano scaricate on demand in base alle tue esigenze oppure solo da dispositivi che supportano determinate funzionalità, ad esempio la possibilità di scattare foto o supportare le funzionalità di realtà aumentata.

Anche se ricevi download altamente ottimizzati per impostazione predefinita quando carichi l'app come app bundle, le opzioni di distribuzione delle funzionalità più avanzate e personalizzabili richiedono una configurazione aggiuntiva e la modularizzazione delle funzionalità dell'app tramite i moduli delle funzionalità. In altre parole, i moduli delle funzionalità forniscono gli elementi di base per creare funzionalità modulari che puoi configurare per essere scaricate in base alle esigenze.

Prendi in considerazione un'app che consenta agli utenti di acquistare e vendere prodotti in un marketplace online. Puoi ragionevolmente modularizzare ciascuna delle seguenti funzionalità dell'app in moduli di funzionalità separati:

  • Accesso e creazione dell'account
  • Esplorare il Marketplace
  • Mettere un articolo in vendita
  • Elaborazione dei pagamenti

La tabella riportata di seguito descrive le diverse opzioni di pubblicazione supportate dai moduli di funzionalità e come potrebbero essere utilizzate per ottimizzare le dimensioni di download iniziali dell'app del Marketplace di esempio.

Opzione di consegna Comportamento Caso d'uso di esempio Per iniziare
Consegna al momento dell'installazione Per impostazione predefinita, i moduli delle funzionalità che non configurano nessuna delle opzioni di distribuzione descritte in precedenza vengono scaricati al momento dell'installazione dell'app. Questo è un comportamento importante perché significa che puoi adottare le opzioni di pubblicazione avanzate gradualmente. 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 di distribuzione delle funzionalità di Google Play.

Inoltre, la tua app può chiedere di disinstallare le funzionalità in un secondo momento. Quindi, se richiedi determinate funzionalità al momento dell'installazione dell'app, ma non in seguito, puoi ridurre le dimensioni di installazione richiedendo di rimuovere la 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, l'app può richiedere l'eliminazione della funzionalità dopo che l'utente ha completato l'addestramento.

Modula la tua app utilizzando moduli di funzionalità che non configurano opzioni di distribuzione avanzate.

Per scoprire come ridurre le dimensioni installate dell'app rimuovendo determinati moduli di funzionalità che potrebbero non essere più necessari all'utente, consulta Gestire i moduli installati.

Pubblicazione on demand Consente all'app di richiedere e scaricare moduli delle funzionalità in base alle esigenze. Se solo il 20% di chi utilizza l'app del Marketplace pubblica articoli in vendita, una buona strategia per ridurre le dimensioni di download iniziali per la maggior parte degli utenti consiste nel rendere disponibile la funzionalità per scattare foto, inclusa la descrizione dell'articolo, e mettere un articolo in vendita come download on demand. In altre parole, puoi configurare il modulo delle funzionalità per il download della funzionalità di vendita dell'app solo quando un utente è interessato a mettere articoli in vendita sul marketplace.

Inoltre, se l'utente non vende più articoli dopo un determinato periodo di tempo, l'app può ridurne le dimensioni di installazione richiedendo la disinstallazione della funzionalità.

Crea un modulo di funzionalità e configura la distribuzione on demand. La tua app può quindi utilizzare la libreria di importazione delle caratteristiche di Google Play per richiedere il download del modulo on demand.
Consegna condizionale Consente di specificare determinati requisiti dei dispositivi degli utenti, tra cui funzionalità hardware, impostazioni internazionali e livello API minimo, per determinare se una funzionalità modularizzata viene scaricata al momento dell'installazione dell'app. Se l'app del Marketplace ha una copertura globale, potresti dover supportare i metodi di pagamento più diffusi solo in alcune regioni o locali. Al fine di ridurre le dimensioni di download iniziali dell'app, puoi creare moduli di 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 di funzionalità e configura la consegna condizionale.
Consegna istantanea Google Play Instant consente agli utenti di interagire con la tua app senza dover installare l'app sul proprio dispositivo. Possono invece utilizzare la tua app tramite il pulsante "Prova ora" sul Google Play Store o tramite un URL creato da te. Questa forma di caricamento di contenuti ti consente di aumentare il coinvolgimento con la tua app.

Con la consegna istantanea puoi utilizzare Google Play Instant per consentire agli utenti di provare immediatamente determinate funzionalità della tua app senza installarla.

Prendi in considerazione un gioco che includa i primi livelli in un modulo di funzionalità leggero. Puoi attivare istantaneamente il modulo in modo che gli utenti possano provare subito il gioco tramite un link URL o un pulsante "Prova ora", senza installare l'app. Crea un modulo delle funzionalità e configura la consegna istantanea. La tua app può quindi utilizzare la libreria di importazione delle caratteristiche di Google Play per richiedere il download del modulo on demand.

Tieni presente che la modularizzazione delle funzionalità dell'app mediante moduli di funzionalità è solo il primo passo. Per supportare Google Play Instant, le dimensioni di download del modulo di base dell'app e di una determinata funzionalità ad attivazione istantanea devono soddisfare rigide restrizioni relative alle dimensioni. Per scoprire di più, leggi l'articolo su come abilitare le esperienze istantanee riducendo le dimensioni dell'app o del gioco.

crea un URI per una risorsa

Se vuoi accedere a una risorsa archiviata in un modulo di funzionalità utilizzando un URI, ecco come generare un URI della 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 della risorsa viene creata in fase di esecuzione, garantendo che venga generato lo spazio dei nomi corretto dopo il caricamento degli APK divisi.

Come esempio di come viene generato l'URI, supponi di avere moduli di app e funzionalità con i seguenti nomi:

  • Nome pacchetto app: com.example.my_app_package
  • Nome pacchetto di risorse della funzionalità: com.example.my_app_package.my_dynamic_feature

Se resId nello snippet di codice riportato sopra si riferisce a una risorsa file non elaborata denominata "my_video" nel modulo delle funzionalità, il codice Uri.Builder() riportato sopra restituirà quanto segue:

android.resource://com.example.my_app_package/raw/com.example.my_app_package.my_dynamic_feature:my_video

Questo URI può quindi essere utilizzato dall'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 delle funzionalità e determinare il nome del pacchetto:

Uno screenshot dell'APK Analyzer che esamina i contenuti di un file di risorse compilato.

Figura 2. Utilizza lo strumento di analisi APK per esaminare il nome del pacchetto in un file di risorse compilato.

Considerazioni sui moduli delle funzionalità

Con i moduli delle funzionalità, puoi migliorare la velocità di build e quella di progettazione e personalizzare ampiamente la distribuzione delle funzionalità della tua app per ridurne le dimensioni. Tuttavia, quando si utilizzano i moduli delle funzionalità, occorre tenere presenti alcuni vincoli e casi limite:

  • L'installazione di 50 o più moduli delle funzionalità su un singolo dispositivo, tramite la distribuzione condizionale o on demand, potrebbe causare problemi di prestazioni. I moduli tempo di installazione, che non sono configurati come rimovibili, vengono inclusi automaticamente nel modulo di base e contano come un solo modulo di funzionalità su ogni dispositivo.
  • Limita a 10 il numero di moduli configurati come rimovibili per la consegna al momento dell'installazione. In caso contrario, i tempi di download e installazione dell'app potrebbero aumentare.
  • Solo i dispositivi con Android 5.0 (livello API 21) e versioni successive supportano il download e l'installazione delle funzionalità on demand. Per rendere la tua funzionalità disponibile nelle versioni precedenti di Android, abilita Fusing quando crei un modulo delle funzionalità.
  • Abilita SplitCompat per consentire alla tua app di accedere ai moduli delle funzionalità scaricati che vengono distribuiti on demand.
  • I moduli delle funzionalità non devono specificare attività nel file manifest con android:exported impostato su true. Il motivo è che non vi è alcuna garanzia 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à sia stata scaricata prima di provare ad accedere al relativo codice e alle relative risorse. Per scoprire di più, consulta Gestire i moduli installati.
  • Poiché Play Feature Delivery richiede di pubblicare la tua app utilizzando un app bundle, assicurati di essere a conoscenza dei problemi noti dell'app bundle.

Riferimento al manifest del modulo della funzionalità

Quando crei un nuovo modulo delle funzionalità utilizzando Android Studio, l'IDE include la maggior parte degli attributi del manifest che il modulo richiede per comportarsi come un modulo delle funzionalità. Inoltre, alcuni attributi vengono inseriti dal sistema di compilazione al momento della compilazione, quindi non devi specificarli o modificarli personalmente. La seguente tabella descrive gli attributi del file manifest importanti per i moduli delle caratteristiche.

Attributo Descrizione
<manifest
...
Questo è il tuo blocco <manifest> tipico.
xmlns:dist="http://schemas.android.com/apk/distribution" Specifica un nuovo spazio dei nomi XML dist: descritto più dettagliatamente di seguito.
split="split_name" Quando Android Studio crea l'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 viene richiesto un modulo on demand utilizzando la libreria di distribuzione delle funzionalità di Play.

In che modo Gradle determina il valore per questo attributo:

Per impostazione predefinita, quando crei un modulo delle funzionalità utilizzando Android Studio, l'IDE utilizza quello che hai specificato come Nome modulo per identificare il modulo come un 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 delle funzionalità nella directory MyAppProject/features/ e specifichi "dynamic_feature1" come Nome modulo, l'IDE aggiunge ':features:dynamic_feature1' come sottoprogetto nel file settings.gradle. Durante la creazione dell'app bundle, Gradle inserisce <manifest split="dynamic_feature1"> nel manifest del modulo.

android:isFeatureSplit="true | false"> Quando Android Studio crea l'app bundle, include questo attributo per te. Pertanto, non devi includere o modificare manualmente questo attributo.

Specifica che questo modulo è un modulo delle funzionalità. I manifest negli APK del modulo di base e di configurazione omettono questo attributo o lo impostano su false.

<dist:module Questo nuovo elemento XML definisce gli attributi che determinano in che modo il modulo viene pacchettizzato e distribuito come APK.
dist:instant="true | false" Consente di specificare se il modulo deve essere disponibile tramite Google Play Instant come esperienza istantanea.

Se l'app include uno o più moduli di funzionalità ad attivazione istantanea, devi attivare anche il modulo di base. Quando utilizzi Android Studio 3.5 o versioni successive, l'IDE lo fa per te quando crei un modulo di funzionalità ad attivazione istantanea.

Non puoi impostare questo elemento XML su true e al contempo impostare <dist:on-demand/>. Tuttavia, puoi comunque richiedere download on demand dei moduli delle funzionalità ad attivazione istantanea come esperienze istantanee utilizzando la libreria di distribuzione delle caratteristiche di Google Play. Quando un utente scarica e installa la tua app, il dispositivo scarica e installa i moduli delle funzionalità ad attivazione istantanea dell'app, insieme all'APK di base, per impostazione predefinita.

dist:title="@string/feature_name" Specifica un titolo del modulo rivolto agli utenti. Ad esempio, il dispositivo potrebbe visualizzare questo titolo quando richiede la conferma del download.

Devi includere la risorsa stringa per questo titolo nel file module_root/src/source_set/res/values/strings.xml del modulo di base.

<dist:fusing dist:include="true | false" />
</dist:module>
Consente di specificare se includere il modulo in APK multipli destinati a dispositivi con Android 4.4 (livello API 20) e versioni precedenti.

Inoltre, quando utilizzi bundletool per generare APK da un app bundle, vengono inclusi solo i moduli delle funzionalità che impostano questa proprietà su true nell'APK universale, che è un APK monolitico che include codice e risorse per tutte le configurazioni dispositivo supportate dalla tua app.

<dist:delivery> Incapsula le opzioni che personalizzano la pubblicazione dei moduli, come illustrato di seguito. Tieni presente che ogni modulo di funzionalità deve configurare un solo tipo di queste opzioni di pubblicazione personalizzate.
<dist:install-time> Specifica che il modulo deve essere disponibile al momento dell'installazione. Questo è il comportamento predefinito per i moduli delle caratteristiche che non specificano un altro tipo di opzione di distribuzione personalizzata.

Per scoprire di più sui download al momento dell'installazione, leggi Configurare 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 scoprire di più, consulta Configurare la consegna condizionale.

<dist:removable dist:value="true | false" />

Se il criterio non viene configurato o se viene impostato su false, bundletool fonderà i moduli tempo di installazione nel modulo di base durante la generazione di APK divisi dal bundle. Poiché ci saranno meno APK divisi a causa dell'unione, questa impostazione potrebbe migliorare il rendimento della tua app.

Quando removable è impostato su true: i moduli al momento dell'installazione non verranno fusi nel modulo di base. Imposta su true se vuoi disinstallare i moduli in futuro. Tuttavia, la configurazione di troppi moduli da rimuovere potrebbe aumentare i tempi di installazione dell'app.

Il valore predefinito è false. È necessario impostare questo valore nel manifest solo se vuoi disabilitare il fusione per un modulo delle funzionalità.

Nota: questa funzionalità è disponibile solo quando si utilizza 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. Ciò significa che 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>
<application
android:hasCode="true | false">
...
</application>
Se il modulo delle funzionalità non genera file DEX, ovvero non contiene codice che viene successivamente compilato nel formato file DEX, devi procedere come segue (altrimenti potresti ricevere errori di runtime):
  1. Imposta android:hasCode su "false" nel manifest del modulo delle funzionalità.
  2. Aggiungi quanto segue al manifest del tuo modulo base:
    <application
      android:hasCode="true"
      tools:replace="android:hasCode">
      ...
    </application>
    

Risorse aggiuntive

Per scoprire di più sull'utilizzo dei moduli delle funzionalità, prova le seguenti risorse.

Post sui blog

Video

Termini di servizio e Sicurezza dei dati

Se accedi alla libreria di distribuzione delle funzionalità di Google Play o la utilizzi, accetti i Termini di servizio del kit di sviluppo software principale di Play. Leggi e comprendi tutti i termini e le norme applicabili 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 le proprie procedure, che includono la gestione dei dati ai sensi dei Termini di servizio di Google Play. Le informazioni che seguono descrivono il modo in cui le librerie Play Core gestiscono i dati per elaborare richieste specifiche dalla tua app.

API Altre lingue

Dati raccolti sull'utilizzo Elenco delle lingue installate
Scopo della raccolta dei dati I dati raccolti vengono utilizzati per pubblicare versioni dell'app in lingue diverse e per preservare 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 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 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.

Il nostro obiettivo è essere il più trasparenti possibile, ma sei l'unico responsabile di decidere come rispondere al modulo della sezione Sicurezza dei dati di Google Play in merito alle misure di raccolta, condivisione e sicurezza dei dati utente della tua app.