Panoramica di Play Feature Delivery

Il modello di pubblicazione delle app di Google Play utilizza l'app per Android Pacchetti per generare e pubblicare APK ottimizzati per i del dispositivo, in modo che gli utenti scarichino solo il codice e le risorse di cui hanno bisogno la tua app.

Play Feature Delivery utilizza le funzionalità avanzate degli app bundle, consentendo l'erogazione di determinate funzionalità o il download on demand di alcune funzionalità. Per farlo, devi prima separare queste funzionalità dall'app di base in moduli delle funzionalità.

Configurazione della build di modulo delle funzionalità

Quando crei un nuovo modulo di funzionalità con Android Studio, 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à a disposizione il plug-in dell'applicazione standard sono disponibili anche per il modulo delle funzionalità. Le seguenti sezioni descrivere le proprietà che si dovrebbe e non si dovrebbe includere nel la configurazione della build di un modulo delle funzionalità.

Cosa non includere nella configurazione della build del modulo delle funzionalità

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

  • Configurazioni di firma:gli app bundle vengono firmati utilizzando la firma configurazioni specificate nel modulo di base.
  • La proprietà minifyEnabled: puoi: attiva la riduzione del codice per l'intero progetto dell'app solo dalla build del modulo di base configurazione. Pertanto, devi omettere questa proprietà dal moduli delle funzionalità. Tuttavia, puoi Specificare regole ProGuard aggiuntive per ogni modulo delle funzionalità.
  • versionCode e versionName: quando crei l'app bundle, Gradle utilizza le informazioni sulla versione dell'app fornite dal modulo di base. Devi omettere queste proprietà dall'elenco build.gradle.

Stabilisci 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 alla 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')
}

Specifica regole ProGuard aggiuntive

Sebbene solo la configurazione della build del modulo di base possa consentire la riduzione del codice per il progetto dell'app, puoi fornire regole ProGuard personalizzate a ogni delle funzionalità utilizzando 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 sono unite a quelle di altri moduli (incluso il modulo di base) al momento della creazione. Quindi, mentre ogni caratteristica specificare un nuovo insieme di regole, tali regole si applicano a tutti i moduli nel progetto dell'app.

Esegui il deployment dell'app

Durante lo sviluppo dell'app con il supporto dei moduli delle funzionalità, puoi: esegui il deployment dell'app su un dispositivo connesso come faresti normalmente selezionando Esegui > Esegui dalla barra dei menu (o facendo clic su Esegui in barra degli strumenti).

Se il progetto dell'app include uno o più moduli delle funzionalità, puoi: scegli le funzionalità da includere in fase di deployment dell'app modificando la configurazione di esecuzione/debug esistente come che segue:

  1. Seleziona Esegui > Modifica configurazioni dalla barra dei menu.
  2. Nel riquadro a sinistra della finestra di dialogo Configurazioni esecuzione/debug, seleziona la configurazione dell'app per Android che preferisci.
  3. In Funzionalità dinamiche di cui eseguire il deployment nella scheda Generale, controlla accanto a ogni modulo delle funzionalità da includere quando eseguendo il deployment della tua app.
  4. Fai clic su OK.

Per impostazione predefinita, Android Studio non esegue il deployment dell'app tramite app bundle. la tua app. Invece, l'IDE crea e installa sul tuo dispositivo APK ottimizzati per la velocità di deployment, anziché le dimensioni dell'APK. Per configurare Android Studio in modo da creare e distribuire APK e app istantanee da un app bundle; modifica l'esecuzione/il debug configurazione.

Utilizza i moduli delle funzionalità per una pubblicazione personalizzata

Un vantaggio unico dei moduli delle funzionalità è la possibilità di personalizzare come e quando vengono scaricate diverse funzionalità della tua app sui dispositivi con Android 5.0 (livello API 21) o superiore. Ad esempio, per ridurre le dimensioni di download iniziali dell'app, puoi configurare alcune funzionalità per il download in base alle tue esigenze on demand o solo da dispositivi che supportano determinate funzionalità, come possibilità di scattare foto o supportare funzionalità di realtà aumentata.

Anche se ottieni download altamente ottimizzati per impostazione predefinita quando carichi la tua app come app bundle, le opzioni di pubblicazione delle funzionalità più avanzate e personalizzabili richiedono una configurazione aggiuntiva e la modularizzazione delle funzionalità dell'app moduli delle funzionalità. In altre parole, i moduli delle caratteristiche forniscono lo sviluppo blocchi per creare caratteristiche modulari che puoi configurare per ogni scaricati in base alle esigenze.

Prendi in considerazione un'app che consenta agli utenti di acquistare e vendere prodotti in un marketplace. 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

Nella tabella che segue vengono descritte le diverse opzioni di pubblicazione disponibili dei moduli e come utilizzarli per ottimizzare il download iniziale dimensione dell'app del Marketplace di esempio.

Opzione di consegna Comportamento Esempio di caso d'uso Per iniziare
Consegna al momento dell'installazione Moduli delle funzionalità che non configurano nessuna opzione di pubblicazione descritti sopra vengono scaricati per impostazione predefinita al momento dell'installazione dell'app. Si tratta di un un comportamento importante perché implica l'adozione della pubblicazione avanzata gradualmente. Ad esempio, puoi trarre vantaggio dalla modularizzazione le funzionalità dell'app e abilitare la distribuzione on demand solo dopo aver completato implementati con download on demand usando la libreria Play Feature Delivery.

Inoltre, la tua app può chiedere di disinstallare le funzionalità in un secondo momento. Pertanto, se ti servono determinate funzionalità al momento dell'installazione dell'app, ma non dopo, 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 per impostazione predefinita al momento dell'installazione dell'app.

Tuttavia, per ridurre le dimensioni installate, l'app può richiedere di eliminare la caratteristica dopo che l'utente ha completato l'addestramento.

Modularizza la tua app utilizzando le funzionalità e moduli che non configurano opzioni di distribuzione avanzate.

Per scoprire come ridurre le dimensioni installate della tua app rimuovendo alcune i moduli di funzionalità che l'utente potrebbe non avere più bisogno, Gestisci moduli installati.

Distribuzione on demand Consente alla tua app di richiedere e scaricare moduli delle funzionalità in base alle esigenze. Se solo il 20% di coloro che utilizzano l'app del Marketplace pubblica articoli in vendita, è una buona strategia per ridurre le dimensioni di download iniziali per la maggior parte degli utenti è quella di rendere la funzionalità per scattare foto, incluso un elemento la descrizione e la messa in vendita on demand dell'articolo scaricare l'app. In altre parole, puoi configurare il modulo delle funzionalità per la funzionalità di vendita dell'app da scaricare soltanto quando un utente mostra interesse a collocare sul marketplace gli articoli in vendita.

Inoltre, se l'utente non vende più articoli dopo un certo periodo di tempo, L'app può ridurre le dimensioni di installazione chiedendo di disinstallare la funzionalità.

Creare un modulo delle funzionalità e Configura on demand dei carichi di lavoro. L'app può quindi usare Play Feature Delivery Library per richiedere a scaricare il modulo on demand.
Pubblicazione condizionale Consente di specificare determinati requisiti del dispositivo dell'utente, ad esempio l'hardware caratteristiche, impostazioni internazionali e livello API minimo per determinare se un modello viene scaricata al momento dell'installazione dell'app. Se l'app del Marketplace ha una copertura globale, potresti dover supportare metodi di pagamento molto usati solo in determinate regioni o locali. Nella per ridurre le dimensioni iniziali di download dell'app, puoi creare file di funzionalità per l'elaborazione di determinati tipi di metodi di pagamento e installarle in modo condizionale sul dispositivo di un utente in base alle impostazioni internazionali registrate. Creare un modulo delle funzionalità e configurare la consegna condizionale.
Consegna istantanea Google Play Instant Consente agli utenti di interagire con la tua app senza doverla installare sul loro dispositivo. Possono invece provare la tua app tramite il link "Prova Adesso". sul Google Play Store o su un URL creato da te. Questa forma di pubblicare contenuti ti aiuta ad aumentare il coinvolgimento con i tuoi dell'app.

Con la pubblicazione istantanea, puoi utilizzare Google Play Instant per consentire ai tuoi agli utenti di provare immediatamente determinate funzionalità della tua app senza dell'installazione.

Prendi in considerazione un gioco che includa i primi livelli del gioco in un modulo delle funzionalità leggero. Puoi abilitare immediatamente il modulo in modo che che gli utenti possano provare subito il gioco tramite un link URL o "Prova Adesso". senza installare l'app. Creare un modulo delle funzionalità e configura della distribuzione istantanea. L'app può quindi usare Play Feature Delivery Library per richiedere a scaricare il modulo on demand.

Ricorda di modularizzare le funzionalità dell'app utilizzando le funzionalità. è solo il primo passo. Per supportare Google Play Instant, dimensioni di download del modulo di base della tua app e una determinata dimensione ad attivazione istantanea deve soddisfare rigide restrizioni sulle dimensioni. Per saperne di più, leggi Abilita 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 di funzionalità utilizzando un Per generare l'URI di un modulo di funzionalità, procedi nel seguente modo: 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, assicurando che venga generato lo spazio dei nomi corretto dopo il caricamento degli APK divisi.

Per avere un esempio di come viene generato l'URI, supponiamo che tu abbia un'app moduli di 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 riportato sopra si riferisce a una risorsa di file non elaborato denominata "my_video" nel modulo delle funzionalità, il codice Uri.Builder() riportato sopra genera 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 dall'app per accedere alla risorsa del modulo delle funzionalità.

Per convalidare i percorsi nell'URI, puoi utilizzare lo Strumento di analisi APK per controllare l'APK del modulo di funzionalità e determinare il nome del pacchetto:

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

Figura 2. Usa 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à della build e di progettazione e personalizzare ampiamente la distribuzione delle funzionalità della tua app per ridurne le dimensioni. Tuttavia, ci sono alcuni vincoli e casi limite da tenere presenti quando si utilizzano i moduli delle caratteristiche:

  • Installazione di 50 o più moduli delle funzionalità su un singolo dispositivo, tramite condizionale o la distribuzione on demand, potrebbe portare a problemi di prestazioni. I moduli di tempo di installazione, non sono configurati come rimovibili, sono inclusi automaticamente nella e contano come un solo modulo delle funzionalità su ogni dispositivo.
  • Limita il numero di moduli che configuri come rimovibili per il tempo di installazione di caricamento a 10 o meno. 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 di funzionalità on demand. Per rendere disponibile la tua funzionalità alle versioni precedenti di Android, abilita Fonsione quando si crea un modulo di funzionalità.
  • Attiva SplitCompat. in modo che la tua app abbia accesso ai moduli delle funzionalità scaricati che vengono pubblicati domanda.
  • I moduli delle funzionalità non devono specificare le attività nel file manifest con android:exported impostato su true. Questo perché non possiamo garantire che il dispositivo ha scaricato il modulo della funzionalità quando un'altra app tenta di avviare attività. Inoltre, l'app deve confermare che una funzionalità sia scaricate prima di tentare di accedere al codice e alle risorse corrispondenti. Per saperne di più, leggi Gestisci i moduli installati.
  • Poiché Play Feature Delivery richiede la pubblicazione dell'app tramite un app bundle, assicurati di conoscere l'app bundle problemi noti.

Riferimento per il file manifest dei moduli delle funzionalità

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

Attributo Descrizione
<manifest
...
Questo è il tuo tipico Blocco <manifest>.
xmlns:dist="http://schemas.android.com/apk/distribution" Specifica un nuovo spazio dei nomi XML dist: descritti più avanti.
split="split_name" Quando Android Studio crea l'app bundle, include per te. Pertanto, non devi includere o modificare questo attributo autonomamente.

Definisce il nome del modulo specificato dalla tua app per richiedere un modulo on demand usando la libreria Play Feature Delivery.

In che modo Gradle determina il valore di questo attributo:

Per impostazione predefinita, quando crei un modulo di funzionalità utilizzando Android Studio, l'IDE utilizza quello che Nome modulo per identificare il modulo come sottoprogetto Gradle nel tuo File delle impostazioni di Gradle.

Quando crei l'app bundle, Gradle utilizza l'ultimo elemento il percorso del sottoprogetto per inserire questo attributo manifest nel del file manifest. Ad esempio, se crei un nuovo modulo di funzionalità in la directory MyAppProject/features/ e specificare "funzionalità_dinamica1" come Nome modulo, l'IDE aggiunge ':features:dynamic_feature1' come sottoprogetto in settings.gradle. Quando crei l'app bundle, Gradle inserisce quindi <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 oppure modificalo manualmente.

Specifica che questo modulo è un modulo delle funzionalità. I file manifest nel modulo di base e negli APK di configurazione ometti questo attributo o impostalo su false.

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

Se la tua app include una o più funzionalità ad attivazione istantanea devi abilitare immediatamente il modulo di base. Quando si utilizza Android Studio 3.5 o versioni successive, l'IDE lo fa per te quando per creare un modello istantaneo modulo delle funzionalità.

Non puoi impostare questo elemento XML su true mentre imposti <dist:on-demand/>. Tuttavia, puoi comunque richiedere download on demand dei moduli delle funzionalità ad attivazione istantanea come esperienze istantanee usando la libreria Play Feature Delivery. Quando un utente scarica e installa la tua app, il dispositivo scarica e installa i moduli delle funzionalità ad attivazione istantanea dell'app, e l'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 il download conferma.

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

<dist:fusing dist:include="true | false" />
</dist:module>
Specifica se includere il modulo in APK multipli che scegliere come target dispositivi con Android 4.4 (livello API 20) e versioni precedenti.

Inoltre, quando usa bundletool per generare APK da un app bundle, solo i moduli di funzionalità che impostano questa proprietà su true sono incluse nell'APK universale, ovvero un APK monolitico che include codice e risorse per tutte le configurazioni dei dispositivi supportate dalla tua app.

<dist:delivery> Incapsula opzioni che personalizzano la distribuzione 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 di funzionalità che non specificano un altro un tipo di opzione di consegna personalizzata.

Per scoprire di più sui download al momento dell'installazione, consulta Configura la consegna 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, paese o livello API minimo. Per saperne di più, leggi 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 di data e ora di installazione nel modulo di base durante la generazione di APK divisi dal bundle. Poiché la fusione comporta la riduzione del numero di APK divisi, potrebbe migliorare le prestazioni dell'app.

Se removable è impostato su true: data e ora di installazione non verranno fusi nel modulo di base. Imposta su true se vuoi disinstallare i moduli in futuro. Tuttavia, la configurazione di troppi moduli per essere rimovibili potrebbe aumentare il tempo di installazione dell'app.

Il valore predefinito è false. È necessario impostarlo solo nel file manifest se vuoi disattivare la fusione per un modulo delle funzionalità.

Nota: questa funzionalità è disponibile soltanto quando si utilizza Android Gradle. plug-in 4.2 o quando si usa bundletool v1.0 dalla riga di comando.

</dist:install-time>  
<dist:on-demand/> Specifica che il modulo deve essere disponibile on demand scaricare l'app. Ciò significa che il modulo non è disponibile al momento dell'installazione, ma l'app potrebbe richiedere il download in un secondo momento.

Per scoprire di più sui download on demand, leggi Configura la distribuzione on demand.

</dist:delivery>
<application
android:hasCode="true | false">
...
</application>
Se il modulo delle caratteristiche non genera file DEX, ovvero contiene codice che venga poi compilato nel formato file DEX: devi eseguire (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 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.

Blog post

Video

Termini di servizio e sicurezza dei dati

Accedendo a Google Play Feature Delivery Library o utilizzandolo, accetti il Termini di servizio del Core Software Development Kit di Play. Leggere e di comprendere tutti i termini e le norme applicabili prima di accedere alla libreria.

Sicurezza dei dati

Le librerie Play Core sono l'interfaccia di runtime dell'app con il Google Play Store. Di conseguenza, quando utilizzi Play Core nella tua app, il Play Store esegue il proprio processi, inclusa la gestione dei dati come regolata Termini di servizio di Google Play. Le informazioni che seguono descrivono il modo in cui le librerie Play Core gestiscono i dati per: per elaborare richieste specifiche provenienti dalla tua app.

API Additional Language

Dati raccolti sull'utilizzo Elenco di lingue installate
Scopo della raccolta dei dati I dati raccolti vengono usati per pubblicare versioni dell'app in diverse lingue 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 applicazione
Scopo della raccolta dei dati I dati raccolti vengono utilizzati per offrire il modulo giusto 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.

Nonostante il nostro impegno per essere il più trasparente possibile, l'utente è l'unico responsabile per decidere come rispondere al modulo relativo alla sezione Sicurezza dei dati di Google Play in merito alle prassi di raccolta, condivisione e sicurezza dei dati utente della tua app.