在U8SDK中, 游戏接入聚合SDK框架,再通过分包工具, 就可以打出上架各个渠道平台的游戏包。 在之前的技术文章中, 我们已经说过分包工具的原理: 基于母包apk反编译,再合并代码与资源,最后再回编译。
这种方式,对于上架国内外大部分渠道平台,都没问题。 但是对于Google Play商店, 却有不同的要求:Google Play商店上架的包体格式是aab,并且单个aab中base包的大小不能超过200M(截至2024年时的规定),如果有超出部分,需要将超出的资源,采用Google Play提供的Play Assets Delivery(简称:PAD)方式进行组织和存放。
之前我们已经在U8SDK分包工具中,增加了对aab打包的支持; 但因为U8SDK的客户群还主要将其用于国内渠道平台包的分发, 海外主要通过AS直接出包,所以对于PAD资源的处理, 一直没有提上日程。
但随着现在海外需求的激增,海外发行渠道也逐渐增多, 使用U8SDK分包工具来处理并上架Google Play平台, 已经迫在眉睫。
这篇, 我们就来看下基于反编译分包生成aab的时候, 怎么自动处理游戏母包中的额外资源呢?
根据Google Play Asset Delivery 官方文档, 我们可以知道, 每个pad模块的结构和普通aab的base中的结构, 基本一致。 主要包含assets和manifest两个目录。
所以核心思路也很简单, 步骤如下:
- 将需要拆分到pad中的资源从母包assets中,拷贝到单独的pad目录/assets下面(保持文件的相对路径一致)
- 事先准备好pad资源模块的AndroidManifest.xml配置模板
- 在上面AndroidManifest.xml模板中,我们定义了三个占位符:${applicationId},${u8_pad_name}和${u8_pad_type}。 在pad打包时,我们将这几个占位符替换为最终的包名、pad模块名称以及pad类型(install-time/fast-follow/on-demand)
- 调用aapt2命令,对pad目录资源进行编译, 编译过程和之前base模块的资源编译命令一致。如果不清楚,可以参考之前的博客:
- 将编译后的AndroidManifest.xml中,放到manifest目录下即可
- 将pad目录压缩为zip文件
- 最终在调用bundletool.jar的build-bundle命令时, 使用—modules=”xxx/base.zip,xxx/pad1.zip” 即可打出带PAD资源的aab了。
目前在U8SDK最新打包工具中, 我们是将PAD的资源打包, 做成了插件方式。 在打包google上架渠道时, 选择这个插件, 就可以自动将游戏中的资源, 打成不同的PAD资源包了。