最近在搞海外相关需求,借此机会记录一下谷歌出包和上架过程。
谷歌宣布从 2019 年 8 月 1 日 开始,在 Google Play 上发布的应用必现支持 64 位架构,这个意味着如果你要上谷歌平台就不能使用Mono的方式打包,只能选择IL2CPP,因为Mono是不支持64位的。
另外上架的应用要包含多份架构的 SO 包,导致应用大小增加,以前只有 armeabi-v7a 一种 CPU 架构,但是为支持 64 位,需要增加 arm64-v8a 架构的库。
所以谷歌宣布从2021年8月份开始,所有提交到Google Play商店的新应用必须采用AAB格式,因为AppBundle(AAB)是Google在2018年推出的动态打包方式,这种包格式以.aab为文件扩展名。
通过aab包发布到 Google Play 的应用,Google Play 能自动将 aab 根据不同维度分解为一个基础包和一系列的“拆分包”,这些拆分包其实就是一个个apk,其中有分为配置拆分包、PFD拆分包和PAD拆分包。
当用户下载应用时,Google Play 会根据用户设备的特性只下发基础包和对应的拆分包,从而减小用户下载应用的大小。
同时谷歌还要求AAB包下的Base目录大小不能超过150M不然上传不了谷歌商店,不过谷歌提供了其他目录用于存放资源和代码。
这些目录分别如下:
install-time:安装时分发
fast-follow:快速跟进式分发模式,在安装游戏完成后,自动下载。
on-demand:按需分发模式,通过google API下载
现在大部分游戏资源其实都是放在Base目录下的,也就是安卓工程的src/main/assets目录, 而且基本上是超过150M的,也就是说我们开发者需要更改自己原有的资源加载方式,把大部分资源移动到install-time,fast-follow,on-demand这3个目录中,谷歌有提供相关的API去这些目录中获取资源。
其中有专门针对Unity的API和工具:

文档地址:https://developer.android.google.cn/guide/app-bundle/asset-delivery/build-unity
如果你不想更改原来的加载方式,可以把资源全部放在install-time目录下,在这个目录下的资源不需要使用谷歌的API进行加载,而是在安装的时候会自动帮你安装到手机上。
如下,把Unity导出的工程划分为以下几个目录:

然后把src/main/assets下的资源分配到install-time,fast-follow,on-demand目录,但是要注意在这3个目录下的目录结构需要和src下的目录结构一样。
比如原来的资源存放在src\main\assets\res目录,现在你要把res下的部分资源移动到install-time目录下,那你需要在install-time目录下新建一个src\main\assets\res的目录结构,然后把src\main\assets\res的资源移动到install-time\src\main\assets\res目录下,这样就大功告成了。
只要保证原来src\main\assets目录的大小加上库文件的大小不超过150M那么打包出来AAB的base目录也不会超过150M。
AAB包的结构如下:


观察发现,base目录的大小主要是assets+lib的大小,而lib下是我们的库文件,这些是无法缩减和移动的。
其实从测试的角度上来说光打出AAB包还不算真正的结束,这个时候如果你想测试AAB包是不行的,因为AAB无法直接安装在你的手机上。
所以发行那边或者测试通常会向你要一个AAB包对应的APK包,幸好谷歌有提供相关的工具把AAB包反编译为APK。
首先要去Github下载这个工具:https://github.com/google/bundletool/releases
然后使用命令:java -jar 你下载的bundletool路径.jar build-apks –bundle=你的AAB包路径.aab –output=输出apks的路径.apks –ks=安卓签名文件路径 –ks-pass=pass:ks密码 –ks-key-alias=bf_lmzh_yn –key-pass=pass::key密码
执行后等待几分钟(根据每个人的电脑性能的不同编译时间有快有慢)会在你设置的输出目录下生成一个.apks的文件,使用解压软件打开它,standalones目录下的apk文件即是你AAB对应的APK文件,把APK和AAB一起发给发行和测试,到此出包工作才全部结束。
