发现问题

在上传海外游戏项目到谷歌商店的时候,遇到了提示初始安装大小超过150M上限的问题,导致游戏项目不能正常上线


分析问题

后来查阅资料,得知上传游戏到谷歌商店提示包大小超过150M是指aab包里的base文件夹压缩后的大小,但是我对比了下(如下图)以前可以正常上架的游戏包(base文件夹158M)和不能上架的游戏包(base文件夹161M),我猜测是谷歌允许游戏包体积超过规定大小10M以内,也就是允许最大包体积是160M。


解决方案

对于这种情况,谷歌官方其实是有对应的方案的,就是Play Asset Delivery(游戏资源分发)
官方文档:https://developer.android.google.cn/guide/app-bundle/asset-delivery

1、首先是新建Android Library做为存放资源的分包 ,命名:game_asset_pack

2、在 game_asset_pack 目录中,创建一个 build.gradle 文件并添加以下代码:

apply plugin: 'com.android.asset-pack'
assetPack {
    packName = 'game_asset_pack'
    dynamicDelivery {
        deliveryType = "install-time" //PAD资源分发 安装时分发
    }
}

deliveryType代表的是分发模式,共有三种:
install-time:资源包在用户安装应用时分发,一般存放需要一打开游戏就用到的资源;
fast-follow:资源包会在用户安装应用后立即自动下载;用户无需打开应用即可开始 fast-follow 下载;
on-demand 资源包会在应用运行时下载。

3、在项目的应用 build.gradle 文件中,添加项目中 Asset Pack 的名称:

//项目中最可以有50个Asset Pack,需要将所有Asset Pack名称都添加到这里
assetPacks = [":game_asset_pack"] 
//assetPacks = [":asset_pack1", ":asset_pack2"]

4、在settings.gradle中添加项目中所有的Asset Pack:
include ':game_asset_pack'
//includ ':asset_pack2'

5、将需要做分发处理的游戏资源放在game_asset_pack模块下的src/main/assets 目录下 游戏架构不同游戏资源的存放路径也不一样,laya架构的游戏项目一般存放其src/main/assets目录下的内容。 同时需要注意的是**不要将游戏启动相关的配置文件放进去**,不然可能会导致游戏不能正常启动的情况,比如 Unity 游戏的 assets 中的 bin 文件夹和 config 配置,如果放在资源分包的目录下的话,aab 安装后会出现黑屏或者 not enough storage space to install 的提示。

6、将 Play Asset Delivery 集成到游戏项目中
在应用级build.gradle中添加依赖:
implementation 'com.google.android.play:asset-delivery:2.0.0'

7、进行aab包打包、安装、测试
(进行资源分发处理后,直接打apk包安装会出现游戏找不到资源的情况,需要先打包aab再通过aab安装到手机中)
这是资源分发处理后打包好的aab游戏包

可以看到base目录只剩下31m,游戏资源都放到新的模块game_asset_pack里了,这时候提交到谷歌商店就可以正常过审了。


知识延伸:

1、aab包打包、安装测试方法

Android App Bundle (aab)是谷歌官方提供的一种新发布格式,其中包含应用的所有经过编译的代码和资源。 APK 生成及签名全部交由 Google Play 来处理。
当用户在Google Play下载软件的时候,Google Play 会根据你上传的 aab ,针对用户设备的配置(比如CPU架构、语言等),为用户提供经过优化的 APK,因此只会下载特定设备所需的代码和资源来运行你的应用,以此来减小软件安装所需要的体积。
打包好的aab包并不能直接安装到手机中,而是需要上传到 Google Play 后台,通过商店下载安装测试。
但是我们在应用资源分发PAD模式的时候,打包成的apk是不能正常运行的,因为PAD模式是基于aab格式来运行的。
那么,我们打包好的apk不能正常运行,aab又不能直接安装到手机中,如果我们需要测试打包好的aab游戏包是否有问题该怎么办呢?如果是上传到google play后台再下载安装,测试流程未免也太繁琐了。
对于这个问题,谷歌官方是有提供一套工具bundletool来将aab安装到手机中的。

aab安装过程如下:
1.将aab包转化为apks格式:

java -jar [bundletool文件名] build-apks --bundle=[aab文件名] --output=[apks文件名]
--ks=[签名文件名]
--ks-pass=pass:[签名密码]
--ks-key-alias=[别名]
--key-pass=pass:[别名密码]

需要注意的是,在将aab转换成apks时,如果不指定签名 ,会用安卓默认签名,这样可能会导致Google支付不能正常调起的问题。

java -jar [bundletool文件名] install-apks --apks [apks文件名]
call gradlew app:assembleRelease
call gradlew app:bundleRelease