Esegui la migrazione dell'app istantanea per supportare Android App Bundle

Se utilizzi ancora il plug-in per Gradle con funzionalità Android (com.android.feature) deprecato per i moduli dell'app istantanea Android, devi eseguire la migrazione per utilizzare il plug-in dell'app di base (com.android.application) e il plug-in delle funzionalità dinamiche (com.android.dynamic-feature).

Sul plug-in Android per Gradle 3.3.0 e versioni successive, il plug-in dell'app di base include il supporto per app istantanee. In altre parole, se il modulo dell'app di base soddisfa i requisiti per essere un'app istantanea, il vantaggio sarà disponibile automaticamente. Puoi quindi includere funzionalità aggiuntive che gli utenti possono scaricare on demand come esperienze istantanee utilizzando il plug-in delle funzionalità dinamiche. Questa configurazione semplifica il supporto di app sia installate che istantanee da un singolo progetto e ti consente di trarre vantaggio dalla pubblicazione con Android App Bundle.

La tabella seguente descrive meglio i plug-in verso cui eseguirai la migrazione:

Descrizione del modulo Plug-in precedente Plug-in attuale
Il modulo che include codice, risorse e funzionalità di base per l'esperienza con l'app installata o istantanea. com.android.feature (con baseFeature = true) com.android.application

Nota: questo modulo include tutte le informazioni relative al file manifest e alla firma necessarie per creare e pacchettizzare la tua app come Android App Bundle o APK.

Funzionalità modulari aggiuntive che gli utenti possono scaricare on demand com.android.feature com.android.dynamic-feature (con dist:instant="true" e dist:onDemand="false" nel file manifest del modulo)
Codice e risorse per una funzionalità disponibili solo nella versione installata della tua app. com.android.application com.android.dynamic-feature (con dist:instant="false" e dist:onDemand="false" nel file manifest del modulo)

Questa pagina mostra come eseguire la migrazione del progetto di app istantanea esistente per creare un Android App Bundle abilitato per le app istantanee. Descrive inoltre come creare, testare e pubblicare un Android App Bundle abilitato per le app istantanee.

Se stai creando nuove esperienze istantanee per la tua app, leggi invece Creare un modulo delle funzionalità ad attivazione istantanea.

Informazioni sulle modifiche

Quando esegui la migrazione del progetto per utilizzare invece il plug-in delle funzionalità dinamiche, gli Android App Bundle offrono un nuovo modo per creare e pubblicare la tua app che semplifica notevolmente la distribuzione degli APK ottimizzati agli utenti.

Gli app bundle semplificano la distribuzione pacchettizzando tutto il codice compilato e le risorse dell'app da caricare, ma limitano la generazione degli APK e l'accesso a Google Play. Il nuovo modello di pubblicazione delle app di Google Play utilizza quindi l'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 di cui hanno bisogno per eseguire la tua app. Non devi più creare, firmare e gestire più APK per supportare dispositivi diversi e gli utenti ricevono download più ridotti e ottimizzati.

Quando utilizzavi il plug-in delle funzionalità ormai deprecato, la creazione di un'app istantanea richiedeva la creazione di un modulo della funzionalità di base, che conteneva il codice e le risorse condivisi per tutti i tuoi moduli, incluso il modulo dell'app istantanea. Il resto del codice è stato incluso in più moduli di funzionalità non di base, che contenevano punti di ingresso per le tue app istantanee. Per la versione installata dell'app, il progetto potrebbe aver incluso un modulo dell'app separato, che conteneva il codice e le attività richiesti solo per l'app installata.

Quando esegui la migrazione della tua app per supportare Android App Bundle, il modulo dell'app recupera il ruolo del modulo di base e organizzi le esperienze installate o istantanee aggiuntive come moduli di funzionalità. In altre parole, il tuo progetto ora è più simile a un progetto di app standard, con un modulo di base ad attivazione istantanea e la possibilità di includere ulteriori esperienze istantanee modulari.

Per eseguire la migrazione del progetto di app istantanea esistente e adottare il modello di distribuzione più ottimizzato di Android App Bundle, segui i passaggi descritti nelle sezioni riportate di seguito.

Converti il modulo delle funzionalità di base in un modulo dell'app

Devi prima modificare il file build.gradle del modulo della funzionalità di base prima di convertirlo nel modulo principale dell'app, come indicato di seguito:

  1. Elimina la riga baseFeature true.
  2. Rimuovi tutte le dipendenze che utilizzano le configurazioni delle dipendenze feature o application.

    Trendy

    dependencies {
        ...
        // delete any lines that look like
        // feature project(":foo")
        // feature project(":bar")
        // application project(":app")
    }
    

    Kotlin

    dependencies {
        ...
        // delete any lines that look like
        // feature(project(":foo"))
        // feature(project(":bar"))
        // application(project(":app"))
    }
    
  3. Sposta applicationId, insieme ad altre configurazioni di script di build che ti aspetti di trovare nel modulo dell'app di base, dall'attuale modulo com.android.application al modulo com.android.feature. Di seguito sono riportati alcuni esempi. Per questo passaggio, a seconda della tua configurazione build.gradle specifica, potrebbe essere più semplice copiare e incollare il blocco android di build.gradle dal modulo dell'app precedente nel file build.gradle del nuovo modulo dell'app. Tuttavia, presta attenzione quando procedi.

    Trendy

    android {
        ...
        defaultConfig {
            // You need to move the application ID from the app module
            // to your feature module.
            applicationId "com.example.myapp"
            ...
        }
        // Some additional build configurations you might want to
        // copy from your current ‘app’ module may include ProGuard
        // rules and code shrinking settings.
        buildTypes {
            release {
                minifyEnabled true
                proguardFiles getDefaultProguardFile(
                  'proguard-android-optimize.txt'),
                  'proguard-rules.pro'
            }
        }
    }
    

    Kotlin

    android {
        ...
        defaultConfig {
            // You need to move the application ID from the app module
            // to your feature module.
            applicationId = "com.example.myapp"
            ...
        }
        // Some additional build configurations you might want to
        // copy from your current ‘app’ module may include ProGuard
        // rules and code shrinking settings.
        buildTypes {
            getByName("release") {
                minifyEnabled = true
                proguardFiles(
                    getDefaultProguardFile("proguard-android-optimize.txt"),
                    "proguard-rules.pro"
                )
            }
        }
    }
    
  4. Contrassegna il modulo delle funzionalità come ad attivazione istantanea aggiungendo i tag di distribuzione dei pacchetti appropriati al file manifest, come mostrato di seguito.

    <manifest ... xmlns:dist="http://schemas.android.com/apk/distribution">
        <dist:module dist:instant="true" />
        ...
    </manifest>
    
  5. Converti il modulo delle funzionalità nel modulo dell'app di base modificando il tipo di plug-in in com.android.application:

    Trendy

    // Replace  "plugins { id 'com.android.feature' }"
    // with the following
    plugins {
      id 'com.android.application'
    }
    

    Kotlin

    // Replace  "plugins { id("com.android.feature") }"
    // with the following
    plugins {
        id("com.android.application")
    }
    

Converti il vecchio modulo dell'app in un modulo della funzionalità al momento dell'installazione

Se non disponi di codice o risorse nel vecchio modulo dell'app, puoi semplicemente eliminarlo perché i passaggi seguiti nella sezione precedente hanno convertito il tuo modulo delle funzionalità nel modulo dell'app di base dell'app.

Tuttavia, se nel modulo precedente dell'app sono presenti codice e risorse che rappresentano le funzionalità che vuoi rendere disponibili agli utenti quando installano l'app, segui i passaggi riportati in questa sezione per convertire il modulo dell'app in un modulo delle funzionalità.

La creazione di un modulo di funzionalità implica la modifica del tipo di plug-in da com.android.application a com.android.dynamic-feature, oltre ad altre modifiche a build.gradle, come indicato di seguito:

  1. Cambia il tipo di plug-in da com.android.application a com.android.dynamic-feature.

    Trendy

    // Replace "plugins { id 'com.android.feature' }"
    // with the following:
    plugins {
      id 'com.android.dynamic-feature'
    }
    

    Kotlin

    // Replace "plugins { id("com.android.application") }"
    // with the following:
    plugins {
        id("com.android.dynamic-feature")
    }
    
  2. Come descritto nella sezione precedente, assicurati di aver spostato le configurazioni di build richieste dal plug-in com.android.application nel modulo dell'app di base, ad esempio le regole applicationId o proguardFiles.

  3. Rinomina il modulo in modo simile a "installed_feature" nel seguente modo:

    1. Apri il riquadro Progetto selezionando Visualizza > Finestre degli strumenti > Progetto dalla barra dei menu.
    2. Fai clic con il tasto destro del mouse sul modulo della funzionalità e seleziona Refactoring > Rinomina.
    3. Nella finestra di dialogo visualizzata, seleziona Rinomina modulo e fai clic su OK.
    4. Inserisci il nuovo nome per il modulo e fai clic su OK.
  4. Come nel passaggio 3, rinomina il nuovo modulo dell'app creato nella sezione precedente con il nome "app".

  5. Aggiungi una dipendenza di implementazione al modulo "app" nel file build.gradle del modulo delle funzionalità, come mostrato di seguito.

    Trendy

    dependencies {
        ...
        // In the feature module, add an implementation dependency
        // on the base app module.
        implementation project(":app")
    }
    

    Kotlin

    dependencies {
        ...
        // In the feature module, add an implementation dependency
        // on the base app module.
        implementation(project(":app"))
    }
    
  6. Aggiungi la funzionalità al file build.gradle del nuovo modulo dell'app.

    Trendy

    android {
        ...
        // In the base app module, specify each feature module.
        dynamicFeatures = [":installed_feature"]
    }
    

    Kotlin

    android {
        ...
        // In the base app module, specify each feature module.
        dynamicFeatures.addAll(listOf(":installed_feature"))
    }
    
  7. Nel file manifest del modulo delle funzionalità, contrassegna quest'ultimo come modulo installabile aggiungendo al file manifest i tag di distribuzione dei pacchetti appropriati.

    <manifest ... xmlns:dist="http://schemas.android.com/apk/distribution">
        <dist:module dist:instant="false" dist:onDemand="false"
                dist:title="@string/title_dynamic_feature">
            <dist:fusing dist:include="true" />
        </dist:module>
        ...
    </manifest>
    

Converti altri moduli delle funzionalità in moduli delle funzionalità ad attivazione istantanea

Se hai modularizzato le funzionalità aggiuntive della tua app in più moduli delle caratteristiche, devi seguire i passaggi di questa sezione per convertirli in moduli delle funzionalità ad attivazione istantanea.

Per ogni modulo di funzionalità rimanente nel progetto, procedi come segue per convertirlo in funzionalità ad attivazione istantanea:

  1. Cambia il tipo di plug-in nel file build.gradle in com.android.dynamic-feature, come mostrato di seguito:

    Trendy

    // Replace 'com.android.feature' with 'com.android.dynamic-feature'
    plugins {
      id 'com.android.dynamic-feature'
    }
    

    Kotlin

    // Replace "com.android.feature" with "com.android.dynamic-feature"
    plugins {
        id("com.android.dynamic-feature")
    }
    
  2. Contrassegna ogni modulo delle funzionalità come ad attivazione istantanea aggiungendo quanto segue al manifest.

    <manifest ... xmlns:dist="http://schemas.android.com/apk/distribution">
        <dist:module dist:instant="true" dist:onDemand="false"
                dist:title="@string/title_dynamic_feature">
            <dist:fusing dist:include="true" />
        </dist:module>
        ...
    </manifest>
    
  3. Aggiungi il modulo delle funzionalità al file build.gradle del nuovo modulo dell'applicazione in cui hai aggiunto installed_feature all'elenco dei moduli delle funzionalità.

    Trendy

    android {
       ...
       dynamicFeatures = [":installed_feature", ":feature_1", ":feature_2"]
       // or whichever name exists for the instant enabled feature module
    }
    

    Kotlin

    android {
       ...
       dynamicFeatures.addAll(listOf(":installed_feature", ":feature_1", ":feature_2"))
       // or whichever name exists for the instant enabled feature module
    }
    

Crea, testa e pubblica un nuovo app bundle ad attivazione istantanea

Dopo aver completato i passaggi in questa pagina, il tuo progetto è in grado di produrre un singolo elemento, un Android App Bundle, che puoi utilizzare per pubblicare la versione installata e quella istantanea della tua app in Google Play Console e implementare separatamente i canali dell'app istantanea e di quelli installati. Inoltre, con gli app bundle, puoi pubblicare APK ottimizzati per la configurazione del dispositivo di ogni utente, in modo che gli utenti scarichino solo il codice e le risorse necessarie per eseguire la tua app. In altre parole, non devi più creare, firmare e gestire più APK per supportare dispositivi diversi e gli utenti ottengono download più piccoli e più ottimizzati.

Per iniziare a creare e testare il tuo app bundle ad attivazione istantanea, vai alla pagina Creare l'app bundle.