迁移您的即时应用以支持 Android 应用包

如果您仍在为您的 Android 即时应用模块使用已弃用的 Feature Android Gradle 插件(com.android.feature),则需要迁移到使用基本应用插件(com.android.application)和动态功能插件(com.android.dynamic-feature)。

在 Android Gradle 插件 3.3.0 及更高版本中,基本应用插件包括对即时体验的支持。也就是说,如果基本应用模块满足成为即时体验的要求,则您将自动获得此益处。然后,您可以包含用户可以按需下载的其他功能作为使用动态功能插件的即时体验。此设置使从单个项目支持已安装和即时应用体验变得更容易,并允许您受益于使用 Android 应用包 发布。

下表更好地描述了您将迁移到的插件

模块描述 旧插件 当前插件
包含已安装或即时应用体验的基本代码、资源和功能的模块。 com.android.feature(带 baseFeature = true com.android.application

注意:此模块包含构建和打包应用为 Android 应用包或 APK 所需的所有清单和签名信息。

用户可以按需下载的其他模块化功能 com.android.feature com.android.dynamic-feature(在模块的清单中使用 dist:instant="true"dist:onDemand="false"
仅对已安装版本的应用可用的功能的代码和资源。 com.android.application com.android.dynamic-feature(在模块的清单中使用 dist:instant="false"dist:onDemand="false"

此页面将向您展示如何迁移现有的即时应用项目以构建支持即时体验的 Android 应用包。它还描述了如何构建、测试和发布支持即时体验的 Android 应用包。

如果您正在为您的应用创建新的即时体验,请改为阅读创建启用即时功能的功能模块

了解更改

当您迁移项目以改为使用动态功能插件时,Android 应用包提供了一种构建和发布应用的新方法,从而大大简化了向用户分发优化的 APK。

应用包通过打包所有应用的已编译代码和资源以供上传来简化分发,但将 APK 生成和签名推迟到 Google Play。然后,Google Play 的新应用服务模型使用您的应用包为每个用户的设备配置生成和提供优化的 APK,因此他们只需下载运行您的应用所需的代码和资源。您不再需要构建、签名和管理多个 APK 来支持不同的设备,并且用户可以获得更小、更优化的下载。

在使用现已弃用的功能插件时,构建即时应用需要创建一个基础功能模块,其中包含所有模块(包括即时应用模块)的共享代码和资源。其余代码包含在多个非基础功能模块中,这些模块包含即时体验的入口点。对于已安装版本的应用,您的项目可能包含一个单独的应用模块,其中包含仅安装版应用所需的代码和活动。

当您迁移应用以支持 Android 应用包时,您的应用模块将恢复基础模块的作用,并且您可以将其他已安装或即时体验组织为功能模块。也就是说,您的项目现在更类似于标准应用项目,具有启用即时的基础模块,并且能够包含其他模块化的即时体验。

要迁移现有的即时应用项目并采用 Android 应用包更优化的分发模型,请按照以下各节中描述的步骤操作。

将基础功能模块转换为应用模块

首先,您需要在将基础功能模块转换为主应用模块之前,按如下所示编辑其build.gradle文件。

  1. 删除baseFeature true行。
  2. 删除使用featureapplication依赖项配置的任何依赖项。

    Groovy

    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. applicationId以及您期望在基础应用模块中使用的任何其他构建脚本配置,从当前的com.android.application模块移动到com.android.feature模块。下面显示了一些示例。对于此步骤,根据您的特定build.gradle设置,将之前应用模块的build.gradle文件的android块复制粘贴到新应用模块的build.gradle文件中可能会更容易。但是,您在执行此操作时应谨慎。

    Groovy

    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. 通过向清单添加适当的捆绑包分发标签,将功能模块标记为启用即时,如下所示。

    <manifest ... xmlns:dist="http://schemas.android.com/apk/distribution">
        <dist:module dist:instant="true" />
        ...
    </manifest>
    
  5. 通过将其插件类型更改为com.android.application,将功能模块转换为基础应用模块。

    Groovy

    // 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")
    }
    

将旧的应用模块转换为安装时功能模块

如果您在旧的应用模块中没有代码或资源,则可以简单地将其删除,因为您在上一步中执行的步骤已将您的功能模块转换为应用的基础应用模块。

但是,如果您在旧的应用模块中包含代表您希望用户在安装应用时可用的功能的代码和资源,请按照本节中的步骤将应用模块转换为功能模块。

创建功能模块涉及将插件类型从com.android.application更改为com.android.dynamic-feature,以及其他一些build.gradle更改,如下所示。

  1. 将插件类型从com.android.application更改为com.android.dynamic-feature

    Groovy

    // 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. 如上一节所述,确保已将com.android.application插件所需的构建配置(如applicationIdproguardFiles规则)移动到基础应用模块。

  3. 将模块重命名为“installed_feature”等,如下所示。

    1. 通过从菜单栏中选择**查看 > 工具窗口 > 项目**,打开**项目**窗格。
    2. 右键点击功能模块,然后选择**重构 > 重命名**。
    3. 在出现的对话框中,选择**重命名模块**,然后点击**确定**。
    4. 输入模块的新名称,然后点击**确定**。
  4. 与步骤 3 类似,将您在上一步中创建的新应用模块重命名为“app”等。

  5. 在功能模块的build.gradle文件中添加对“app”模块的实现依赖项,如下所示。

    Groovy

    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. 将功能添加到新应用模块的build.gradle文件中。

    Groovy

    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. 在功能模块的清单中,通过向清单添加适当的捆绑包分发标签,将功能模块标记为可安装模块。

    <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>
    

将其他功能模块转换为启用即时的功能模块

如果您已将应用的其他功能模块化为多个功能模块,则需要按照本节中的步骤将这些模块转换为启用即时的功能模块。

对于项目中每个剩余的功能模块,请按照以下步骤将其转换为启用即时的功能。

  1. build.gradle文件中将插件类型更改为com.android.dynamic-feature,如下所示。

    Groovy

    // 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. 通过将以下内容添加到清单中,将每个功能模块标记为启用即时。

    <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. 在您将installed_feature添加到功能模块列表的新应用模块的build.gradle文件中添加功能模块。

    Groovy

    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
    }
    

构建、测试和发布新的启用即时的应用包

完成此页面上的步骤后,您的项目能够生成单个工件(Android 应用包),您可以使用它将已安装和即时版本的应用都发布到 Google Play 控制台,并分别推出即时和已安装轨道。此外,使用应用包,您可以获得为每个用户的设备配置提供优化 APK 的好处,因此他们只需下载运行您的应用所需的代码和资源。也就是说,您不再需要构建、签名和管理多个 APK 来支持不同的设备,并且用户可以获得更小、更优化的下载。

要开始构建和测试启用即时的应用包,请转到构建应用包