[!WARNING|labelVisibility:hidden|iconVisibility:hidden] 自 2021 年 8 月起,新应用需要使用 Android App Bundle 才能在 Google Play 中发布。现在,Play Feature Delivery 或 Play Asset Delivery 支持大小超过 200 MB 的新应用。
1. Android App Bundle
Android App Bundle (AAB)是一种发布格式,其中包含应用的所有经过编译的代码和资源,可将 APK 生成和签名工作交给 Google Play 来完成。Google Play 会使用上传的 app bundle 针对每种设备配置生成并提供经过优化的 APK,因此只会下载特定设备所需的代码和资源来运行您的应用。您不必再构建、签署和管理多个 APK 来优化对不同设备的支持,而用户也可以获得更小且更优化的下载文件包。
Google Play 建议尽可能减小和优化应用大小,以帮助改善安装指标。大多数开发者都应尽量将应用大小控制在相应的大小限制范围以内。App Bundle、功能模块和资源包需遵循以下大小限制:
| 应用组件 | 应用下载大小限制 |
|---|---|
| 基础模块 | 200 MB |
| 单个功能模块 | 200 MB |
| 单个资源包 | 1.5 GB |
| 所有模块和安装时资源包的累计总大小 | 4 GB |
| 按需分发或快速跟进分发的资源包的累计总大小 | 4 GB* |
除了上述大小限制外,请注意以下事项:
- 加入了 Google Play 游戏合作伙伴计划的开发者,按需分发和快速跟进式分发的资源累计总大小为 10 GB。
- 大于 1 GB 的应用必须以 Android Lollipop(API 级别 21)或更高版本为最低目标 SDK 版本。
- 对于以 Android Oreo(API 级别 26)或更高版本为最低目标 SDK 版本的应用,建议的功能模块数量上限为 100。如果应用的最低目标 SDK 版本还要更低,则功能模块的数量上限为 50。
- 单个 app bundle 中的资源包数量上限为 100。
- 如果应用大小超过 200 MB,当用户在使用移动网络连接的情况下从 Google Play 安装该应用时,系统会显示一个对话框(不会阻止安装),提示用户其要在 Android 设备上安装的这个应用较大。
2. Play Asset Delivery
Play Asset Delivery (PAD) 是针对 Android App Bundle (AAB) 发布格式的资产拆分解决方案。它允许大小超过 200MB 的游戏通过向 Play 发布包含游戏所需所有资源的单个工件来替换旧式扩展文件 (OBB)。PAD 提供灵活的交付模式、自动更新、压缩和增量修补,并且可以免费使用。使用 PAD,所有资产包都托管在 Google Play 上并提供,无需使用内容交付网络 (CDN) 即可将游戏资源提供给玩家。
Play Asset Delivery 使用资产包来存储其他资产,例如纹理、声音和网格,但没有可执行代码。通过 Dynamic Delivery,可以根据三种交付模式(install-time、fast-follow 和 on-demand)自定义每个资产包下载到设备上的方式和时间。
2.1 交付方式
Play Asset Delivery 提供了三种分发方式:
- install-time:此类资源包可视作 APK 的一部分,在用户下载安装应用时交付。此类资源包由于是必加载内容,因此会增加 Google Play 商店上列出的应用大小,且用户无法修改或删除这些资源包。
- fast-follow:此类资源包会在用户安装应用后立即自动下载,不管用户是否打开应用,资源包都会快速跟进下载。下载过程中,用户仍然可以进入应用。这些资源包会增加 Google Play 商店上列出的应用大小。
- on-demand:此类资源包会在应用运行时下载。资源包不会自动下载,需要调用对应的 API 请求,才会下载。
需要特别注意:
- 每个
fast-follow和on-demandAsset Pack 的下载大小上限为 512 MB。 - 所有
install-timeAsset Pack 的总下载大小上限为 1 GB。 - 一个 Android App Bundle 中的所有 Asset Pack 的总下载大小上限为 2 GB。
- 一个 Android App Bundle 中最多可以使用 50 个资源包。
- Google Play 商店会以归档文件(而非拆分 APK)的形式提供配置为
fast-follow和on-demand的资源包。 - 这些资源包随后会在应用的内部存储空间中展开,可以使用 Play Asset Delivery 库查询以这种方式提供的资源包的位置。
- 应用不应假定这些文件存在或其位于何处,因为这些文件可能会被用户删除或被 Play Asset Delivery Library 在游戏会话之间移动。
- 尽管这些文件可由应用写入,也应将其视为只读文件,因为资源包补丁依赖于这些文件的完整性。
2.2 资产更新
当应用程序更新时,install-time 资产包会作为基础应用程序更新的一部分进行更新(无需开发人员采取任何行动)。
应用 fast-follow 和 on-demand 资产包的更新请遵循以下步骤:
- 应用程序的补丁(包括所有资产)已下载到设备上的安全位置。
- 应用程序二进制文件已更新(包括任何
install-time资产包)。 - 所有之前下载的资产包均已失效。
- 资产补丁被复制并应用于存储在应用程序内部存储中的资产。
在大多数情况下,当用户打开游戏时,整个更新已经完成,用户可以立即开始玩更新后的版本。在极少数情况下,当应用打开时,应用二进制文件可能已经更新,而资产补丁的应用过程尚未完成,因此资产尚未准备好访问。您需要通过围绕这些资产提供适当的“正在更新”用户界面元素来适应这种情况,或者构建逻辑来处理尚未准备好访问的无效资产。由于应用程序二进制更新仅在下载所有资产包类型后才会进行,因此应用补丁是一个本地、离线操作,应该可以快速完成。
2.3 集成资产交付
2.3.1 Unity
要在 Unity 中使用 Play Asset Delivery,请完成以下步骤:
- 使用 AAB 发布格式。
- 选择
File > Build Settings。 - 从
Platform窗格的平台列表中,选择Android平台。如果Android显示为灰色,请完成 Android 环境设置。 - 启用
Build App Bundle (Google Play)。如果要导出项目并在 Android Studio 中构建它,请启用Export Project,然后启用Export for App Bundle。
- 选择
- 拆分应用程序二进制文件。
- 选择
Edit > Project Settings。 - 在项目设置窗口中,选择
Player选项卡,然后打开Android Player Settings:
- 在
Publishing Settings部分中,启用Split Application Binary。
- 选择
构建应用程序时,Unity 会创建一个 Android App Bundle (AAB),其中包含拆分为基础模块和资产包的应用程序。
基础模块:包含第一个场景中的可执行文件(Java 和原生)、插件和资源。资产包:包含其余所有内容,包括剩余的场景、资源和流式资源。
资产包具有下载大小限制,为了解决这个问题,Unity 会根据附加资源的大小更改其生成资源包的方式:
- 如果额外的资源占用的存储空间少于 1GB,Unity 会将所有内容打包到一个带有
install-time交付模式的资源包中。 - 如果附加资源占用的存储空间超过 1GB,Unity 会将流式资源添加到一个资源包中,将所有其他资源添加到另一个资源包中。Unity 会将
install-time交付模式分配给较大的资源包,将fast-follow交付模式分配给较小的资源包。 - 对于 Unity 自动生成的资源包,Unity 不支持更改交付模式。如果想要更改资源包的交付模式,请创建自定义资源包。
2.3.2 Cocos
要在 Cocos Creator 中使用 Play Asset Delivery,请完成以下步骤(以 install-time 模式为例):
- 构建一个简单的
Cocos Creator测试工程:- 使用
Cocos Creator创建一个空工程,本示例使用的是 Cocos Creator 3.4 版本。本示例名称:CocosCreator_PAD_Example。 - 在
assets目录下创建一个resources目录,并放入超过150M的资源 - 发布为
Android工程。
- 使用
- 使用
Android Studio打开项目:- 将项目
build.gradle文件中的 Android Gradle 插件版本更新为4.0.0或更高版本。
- 将项目
创建资产包:
- 在项目的
根目录创建一个文件夹,并命名为install_time_asset_pack(目录的名字只能包含英文、数字和下划线)。 在
install_time_asset_pack目录下,创建一个build.gradle文件并添加以下代码:// In the asset pack's build.gradle file: plugins { id 'com.android.asset-pack' } assetPack { //这里必须填入文件夹的名字 packName = "install_time_asset_pack" // Directory name for the asset pack dynamicDelivery { deliveryType = "install-time" } }- 在项目的应用
build.gradle文件中,添加项目中每个资源包的名称,如下所示:// In the app build.gradle file: android { ... assetPacks = [":install_time_asset_pack"] } - 在项目的
settings.gradle文件中,添加项目中的所有资源包,如下所示:// In the settings.gradle file: include ':app' include ':install_time_asset_pack' ... - 在资源包
install_time_asset_pack目录下,创建src/main/assets子目录。 - 将想要分发的资源
移动(不是拷贝)到src/main/assets目录内。 - 使用 Gradle 构建 Android App Bundle。在生成的 app bundle 中,根级目录现在包含以下内容:
asset-pack-name/manifest/AndroidManifest.xml:用于配置资源包的标识符和分发模式asset-pack-name/assets/your-asset-directories:此目录包含作为资源包的一部分分发的所有资源
- 如果想要使用
fast-follow和on-demand模式分发,需要添加 Play Asset Delivery 库:implementation "com.google.android.play:asset-delivery:2.2.2" // For Kotlin use asset-delivery-ktx implementation "com.google.android.play:asset-delivery-ktx:2.2.2"
- 在项目的
2.4 访问资产包
访问资产包的流程图如下图所示:
