迁移您的即时应用以支持 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. 将功能模块添加到新的应用模块的 build.gradle 文件中,您已将 installed_feature 添加到功能模块列表中。

    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 Console,并分别为即时和已安装轨道推出。此外,使用应用包,您可以获得为每个用户的设备配置提供优化的 APK 的好处,因此他们只需下载运行您的应用所需的代码和资源。也就是说,您不再需要构建、签名和管理多个 APK 来支持不同的设备,用户可以获得更小、更优化的下载。

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