AS添加对动态传递的支持

Google Play的应用服务模型称为动态传送,它使用 Android应用套件为每个用户的设备配置生成并提供优化的APK,因此用户只需下载运行应用所需的代码和资源。您不再需要构建,签署和管理多个APK以支持不同的设备,并且用户可以获得更小,更优化的下载。

大多数应用项目都不需要花费太多精力来构建支持使用动态传递服务优化的APK的应用包。例如,如果您已 根据既定惯例组织应用程序的代码和资源,则可以 使用Android Studio 构建已签名的Android应用程序包并将其 上载到Google Play。然后,动态交付成为自动获益。

Dynamic Delivery的优势还允许您通过向 应用程序项目添加动态功能模块并将其包含在应用程序包中来模块化安装时不需要的应用程序功能 。通过动态交付,您的用户可以按需下载和安装应用的动态功能。但是,创建按需模块需要更多的努力和可能的重构您的应用程序。因此,请仔细考虑您的应用程序的哪些功能最受益于按需提供给用户。

此页面可帮助您配置应用程序以支持动态交付,并为您的应用项目添加动态功能模块。在开始之前,请确保您使用的是Android Studio 3.2或更高版本以及Android Gradle Plugin 3.2.0或更高版本。

基础模块

大多数应用项目都不需要太多努力来支持动态交付。这是因为包含应用程序基础APK的代码和资源的模块是标准应用程序模块,默认情况下,在Android Studio中创建新的应用程序项目时会获得该模块 。也就是说,将以下app插件应用于其build.gradle文件的模块为应用程序的基本功能提供了代码和资源。

// The standard application plugin creates your app’s base module.
apply plugin: ‘com.android.application’

如果您担心减少应用的初始下载大小,请务必记住,此模块中包含的所有代码和资源都包含在您应用的基本APK中。

除了为您的应用程序提供核心功能外,基本模块还提供了许多影响整个应用程序项目的构建配置和清单条目。例如,对您的应用包进行签名取决于您为基本模块提供的信息,并且所有应用的APK的版本控制都versionCode在基本模块清单中的属性上指定。基本模块的其他重要方面如下所述。

基本模块清单

应用程序基本模块的清单类似于任何其他应用程序模块的清单。请注意,当Google Play生成应用的基本APK时,它会将所有模块的清单合并到基本APK的清单中。因此,如果您正在考虑将动态功能模块添加到您的应用项目中,那么您应该记住基本APK清单的某些方面:

  • 由于基本APK始终是首先安装的,因此它应该为您的应用提供主要入口点。也就是说,它应该使用以下intent过滤器声明一个活动:

    <intent-filter>
         <action android:name="android.intent.action.MAIN" />
         <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
    
  • 按需下载动态功能模块时,运行Android 6.0(API级别23)及更低版本的设备需要在完成新模块的安装之前重新启动应用程序。但是,如果您希望能够在下载后立即访问下载模块的代码和资源,则应在清单中包含对SplitCompat库的支持。要了解更多信息,请阅读下载模块中的访问代码和资源。

同样,在运行Android 6.0(API级别23)及更低版本的设备上,应用程序需要在平台应用新清单条目之前重新启动。因此,如果在下载动态功能模块后需要某些权限或服务,请考虑将它们包含在基本模块的清单中。

基本模块构建配置

对于大多数现有的应用程序项目,您无需更改基本模块的构建配置中的任何内容。但是,如果您正在考虑向应用程序项目添加动态功能模块,则应该记住基本模块的构建配置的一些方面:

  • 应用程序签名:除非您要从命令行构建应用程序包,否则无需在构建配置文件中包含签名信息 。但是,如果确实包含签名信息,则应仅将其包含在基本模块的构建配置文件中。有关详细信息,请参阅 配置Gradle以对您的应用进行签名。
  • 代码缩小:如果要为整个应用程序项目(包括其动态功能模块)启用代码收缩,则必须从基本模块的build.gradle文件执行此操作。也就是说,您可以在动态要素模块中包含自定义ProGuard规则,但minifyEnabled会忽略动态要素模块构建配置中的属性。
  • 该splits块被忽略:构建应用程序包时,Gradle会忽略android.splits块中的属性。如果要控制哪些类型的配置的APK您的应用程序软件包支持,而是使用android.bundle以 禁用类型的配置APK中。
  • 应用版本控制:基本模块确定整个应用项目的版本代码和版本名称。有关更多信息,请转至有关如何管理应用更新的部分。

禁用配置APK的类型

默认情况下,在构建应用程序包时,它支持为每组语言资源,屏幕密度资源和ABI库生成配置APK。使用android.bundle基本模块build.gradle文件中的块 ,如下所示,您可以禁用对一种或多种配置APK的支持:

android {
    // When building Android App Bundles, the splits block is ignored.
    splits {...}
    // Instead, use the bundle block to control which types of configuration APKs
    // you want your app bundle to support.
    bundle {
        language {
            // Specifies that the app bundle should not support
            // configuration APKs for language resources. These
            // resources are instead packaged with each base and
            // dynamic feature APK.
            enableSplit = false
        }
        density {
            // This property is set to true by default.
            enableSplit = true
        }
        abi {
            // This property is set to true by default.
            enableSplit = true
        }
    }
}

管理应用更新

借助Android应用套件和动态投放,您无需再管理上传到Google Play的多个APK的版本代码。相反,您只在应用程序的基本模块中管理一个版本代码,如下所示:

// In your base module build.gradle file
android {
    defaultConfig {
        …
        // You specify your app’s version code only in the base module.
        versionCode 5
        versionName "1.0"
    }
}

上传您的应用包后,Google Play会使用基本模块中的版本代码为其从该捆绑包生成的所有APK分配相同的版本代码。也就是说,当设备下载并安装您的应用时,该应用的所有拆分APK都共享相同的版本代码。

如果要使用新代码或资源更新应用程序,则必须更新应用程序基本模块中的版本代码,并构建新的完整应用程序包。当您将该应用包上传到Google Play时,它会根据基本模块指定的版本代码生成一组新的APK。随后,当用户更新您的应用时,Google Play会向他们提供当前安装在设备上的所有APK的更新版本。也就是说,所有已安装的APK都会更新为新版本代码。

注意:由于您不再需要管理所有应用APK的版本代码,因此您不再需要包含逻辑来 根据设备配置动态修改版本代码。
下载其他配置APK
上述更新流程的一个例外是安装的应用程序需要其他配置APK。考虑在已下载应用程序后更改其默认系统语言的用户。如果您的应用支持该语言,则设备会从Google Play请求并下载其他配置APK以获取这些语言资源。但是,对您的应用程序的此类更新不会更改其版本代码,因此设备仅下载并安装所需的配置APK。

动态功能模块

动态功能模块允许您将某些功能和资源与应用程序的基本模块分开,并将其包含在应用程序包中。通过动态交付,用户可以在安装了应用程序的基本APK后,按需下载和安装这些组件。

例如,考虑一个文本消息应用程序,其中包括捕获和发送图片消息的功能,但只有一小部分用户发送图片消息。将图片消息传递包括为可下载的动态特征模块可能是有意义的。这样,初始应用程序下载对所有用户来说都较小,只有那些发送图片消息的用户才需要下载该附加组件。

请记住,这种类型的模块化需要更多的努力,并且可能会重构您应用的现有代码,因此请仔细考虑哪些应用的功能可以从按需用户中获益最多。Android应用套件提供了一些其他选项,可帮助您将应用转换为支持完全按需功能。这些选项将在本节后面介绍。

注意:如果您的应用包含动态功能模块,则可以通过Play控制台的内部测试轨道上传和 测试您的应用。但是,要将您的应用程序发布到生产环境,您必须申请动态功能测试计划。要了解更多信息,请转到有关Beta程序的Play Console帮助主题, 以便使用动态功能模块发布应用程序。
通常,动态功能模块的组织方式与常规应用程序模块类似。它们在您期望的目录中提供自己的代码,资源和资产。但是,清单文件中的一些其他属性和构建配置中的属性允许动态功能模块按需下载它们。

本节介绍了这些差异以及如何使用Android Studio创建动态功能模块。

创建动态功能模块

创建新动态功能模块的最简单方法是使用 Android Studio 3.2或更高版本。由于动态要素模块对基础应用程序模块具有内在依赖性,因此您只能将它们添加到现有应用程序项目中。

要使用Android Studio向您的应用项目添加动态功能模块,请执行以下操作:

  1. 如果您还没有这样做,请在IDE中打开您的应用程序项目。

  2. 从菜单栏中选择File> New> New Module

  3. 在Create New Module对话框中,选择 Dynamic Feature Module,然后单击Next。

  4. 在“配置新模块”部分中,完成以下操作:
    从下拉菜单中选择应用程序项目的Base应用程序模块
    指定模块名称。IDE使用此名称将模块标识为Gradle设置文件中的Gradle子项目 。构建应用程序包时,Gradle使用子项目名称的最后一个元素将属性 注入动态要素模块的清单中。
    指定模块的包名称。默认情况下,Android Studio会建议一个包名称,该名称包含基本模块的根包名称和您在上一步中指定的模块名称。
    选择希望模块支持的最低API级别。该值应与基本模块的值匹配。

  5. 单击下一步。

  6. 在“ 配置按需选项”部分中,执行如下操作:
    使用最多50个字符指定模块标题。平台使用该标题来向用户标识模块,例如,确认用户是否要下载模块。因此,您的应用程序的基本模块必须包含模块标题作为 字符串资源,您可以将其翻译。使用Android Studio创建模块时,IDE会为您将字符串资源添加到基本模块,并在动态要素模块的清单中注入以下条目:

    <dist:module

    dist:title="@string/title_dynamic_feature">
    </dist:module>

注意:如果启用资源收缩(例如,对于发布版本),如果基本模块中的代码未引用它,则收缩程序可能会删除模块标题字符串资源。要确保字符串资源保留在构建输出中,请将资源包含在 自定义资源保留文件中。

如果希望模块可用于按需下载,请选中“ 按需启用 ”旁边的框。如果您未启用此选项,则当用户首次下载并安装您的应用时,可以使用动态功能。Android Studio会在模块的清单中注入以下内容以反映您的选择。

<dist:module

dist:onDemand=“true”>
</dist:module>

如果您希望此模块可用于运行Android 4.4(API级别20)及更低版本的设备,请选中“ 融合 ”旁边的框,并将其包含在多个APK中。仅当您选中上一步中的按需启用旁边的框时,此选项才可用。这意味着您可以为此模块启用按需行为,并禁用融合以从不支持下载和安装拆分APK的设备中省略它。Android Studio会在模块的清单中注入以下内容以反映您的选择。

<dist:module

<dist:fusing dist:include=“true” />
</dist:module>

单击完成。

在Android Studio完成模块创建后,请从“ 项目”窗格中自行检查其内容( 从菜单栏中选择“ 视图”>“工具窗口”>“项目 ”)。您应该快速注意到默认代码,资源和组织与标准应用程序模块的默认代码,资源和组织类似。

动态功能模块构建配置

使用Android Studio创建新的动态要素模块时,IDE会将以下Gradle插件应用于模块的build.gradle文件。

// The following applies the dynamic-feature plugin to your dynamic feature module.
// The plugin includes the Gradle tasks and properties required to configure and build
// an app bundle that includes your dynamic feature module.

apply plugin: 'com.android.dynamic-feature'

标准应用程序插件可用的许多属性 也可用于动态功能模块。以下部分描述了您应该和不应该在动态要素模块的构建配置中包含的属性。

什么不包括在动态功能模块构建配置中
由于每个动态功能模块都依赖于基本模块,因此它还会继承某些配置。因此,您应该在动态要素模块的build.gradle文件中省略以下内容:

  • 签名配置:使用您在基本模块中指定的签名配置对应用程序包进行签名。
  • 该minifyEnabled属性:您可以 使代码萎缩仅从基本模块的构建配置为您的整个应用项目。因此,您应该从动态要素模块中省略此属性。但是,您可以为每个动态要素模块指定其他ProGuard规则。
  • versionCode和versionName:构建应用程序包时,Gradle使用基本模块提供的应用程序版本信息。您应该从动态模块的build.gradle文件中省略这些属性 。

建立与基础模块的关系
当Android Studio创建动态要素模块时,通过将android.dynamicFeatures属性添加到基础模块的build.gradle文件,它使基本模块可见,如下所示:

// In the base module’s build.gradle file.
android {
    ...
    // Specifies dynamic feature modules that have a dependency on
    // this base module.
    dynamicFeatures = [":dynamic_feature", ":dynamic_feature2"]
}

此外,Android Studio将基本模块作为动态功能模块的依赖项,如下所示:

// In the dynamic feature module’s build.gradle file:
...
dependencies {
    ...
    // Declares a dependency on the base module, ':app'.
    implementation project(':app')
}

指定其他ProGuard规则
虽然只有基本模块的构建配置可以为您的应用项目启用代码缩减,但您可以使用该proguardFiles 属性为每个动态功能模块提供自定义ProGuard规则 ,如下所示。

android.buildTypes {
     release {
         // You must use the following property to specify additional ProGuard
         // rules for dynamic feature modules.
         proguardFiles 'proguard-rules-dynamic-features.pro'
     }
}

请注意,这些ProGuard规则在构建时与其他模块(包括基本模块)的规则合并。因此,虽然每个动态要素模块可以指定一组新规则,但这些规则适用于应用项目中的所有模块。

动态功能模块清单
使用Android Studio创建新的动态要素模块时,IDE包含模块所需的大多数清单属性,就像动态要素一样。此外,构建系统在编译时会注入一些属性,因此您无需自己指定或修改它们。下表描述了对动态要素模块很重要的清单属性。

注意:动态要素模块不应在其清单中指定 android:exported设置为的活动 true。这是因为当另一个应用程序尝试启动活动时,无法保证设备已下载动态功能模块。此外,您的应用应确认在尝试访问其代码和资源之前已下载动态功能。要了解更多信息,请阅读 管理安装的模块。
部署您的应用
在您开发支持动态交付的应用程序时,您可以像往常一样通过从菜单栏选择“运行”>“运行”(或单击工具栏中的“运行 ”)将应用程序部署到连接的设备 。

如果您的应用项目包含一个或多个动态功能模块,则可以通过修改现有的运行/调试配置来选择部署应用时要包含的动态功能,如下所示:

从菜单栏中选择“运行”>“编辑配置 ”。
从“ 运行/调试配置”对话框的左侧面板中,选择所需的Android App配置。
在“ 常规”选项卡中要部署的“ 动态要素”下,选中要在部署应用时要包括的每个动态要素模块旁边的框。
单击确定。
默认情况下,Android Studio不使用应用程序包来部署您的应用程序 - 它构建并将APK推送到您的设备,这些设备针对部署速度而不是APK大小进行了优化。要将Android Studio配置为从应用程序包中构建和部署APK,请 修改运行/调试配置, 并选择从应用程序包部署APK的选项。

其他资源
要了解有关使用支持动态传递的更多信息,请尝试以下资源。

样品
PlayCore API示例,一个示例应用程序,演示如何使用PlayCore API来请求和下载动态功能。
博客文章
拼布格子 - 一个模块化的故事
影片
通过动态功能按需提供功能

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值