目录
序言
2021年8月开始,应用要上Google Play需要提交aab格式包,相比之前的apk包构建要麻烦一些,好在android官网对aab构建文档比较详细,可以一看。以下是Android官网的aab介绍链接
先说aab包的结构,因为我没用过apk+obb格式的分包方法,所以就不做对比了。
Google对aab有两种资源分发方式,按资源分发(Play Asset Delivery,PAD)和按功能分发(Play Feature Deliery,PFD)。现在我只接触了Playable Asset Delivery的方式所以就以这种为例,这种方式提供三种资源的分发模式,install-time,fast-follow,on-demand。
install-time | 随安装包资源,这部分资源大小会显示在商店里,随应用下载时一起下载,正常情况下应用启动时这部分资源必定存在 |
fast-follow | 快速跟进资源,应用安装后会在后台自动下载,应用启动后时不保证下载完,需要自行实现逻辑调用官方接口判断资源是否存在 |
on-demand | 按需资源,应用运行中需要时再下载的资源,需要自行实现逻辑用官方接口进行资源请求 |
以上资源的单位是资源包(asset pack),每个asset pack只能设置一种分发模式,等整个asset pack下载完成,才能使用其中包含的资源。
构建aab包
Unity构建aab包有两种方法,一种是直接用Unity构建aab包,这种方法需要接入Google提供的Unity插件。另一种方法是用Unity导出gradle工程,然后再构建成aab包
方法一、直接用Unity出aab包
构建选项里去掉Export Project,此时Build App Bundle变成可选择项,勾选功能,就可以构建出aab的包,但注意,这种方式构建出的是个空包,只有Streaming Asstes内容,没有那些asset pack。
如果需要直接Unity里构建包含asset pack的aab,需要下载Android官网提供的插件来进行整个构建流程(其实插件也是调用unity api先构建空的aab包,然后再把aab包都解压出来,再给要新增资源生成AndroidManifest,然后再用aapt2 link,再用bundletool工具生成新的aab包,麻烦到你绝不想看流程)
方法二、Unity导出gradle出aab包
这个就方便很多了,直接Export Project勾上,导出,用Android Studio打开,一个清爽的工程就展现在眼前了,然后根据需要开始塞资源,这里可以根据Android官方教程来做针对原生代码或 Java 代码构建 | Android 开发者 | Android Developers (google.cn)
我们创建一个AssetPack1,设置成install-time资源,关键修改有三处
第一、配置AssetPack1的build.gradle
第二、整个工程的settings.gradle要添加引用
第三、给launcher的build.gradle添加引用
第四、记得asset pack不能出空包,如果想要先构建aab,后续再用zip命令给aab里调整资源,可以给assets里添加一个占位用的文件
完成,现在就可以进行调试了,用Android Studio的一大好处就是方便调试,这里我们要调试的是aab不是apk,所以记得给要改部署方式,从aab中获取apk。(如果只有aab包,那还是得用Android官网提供得bundletool工具进行aab安装)
现在启动模拟器或者插上手机,点击”Run“让Android Studio安装应用,进行构建即可!
aab包的结构和安装文件结构
现在我们看看aab包体内的目录和安装到模拟器上后的目录结构
aab包的结构
其中base文件夹
AssetPack1文件夹,assets里就是之前添加的EmptyTxt.txt文件
应用安装后的结构
如上图可以观察到资源其实分离开的,原来Unity Streaming Assets的资源会默认放在base.apk里,而新增的install-time的AssetPack会放到split_AssetPack1.apk中
aab的安装流程
注意其实aab安装分成了两个步骤,如果用bundletool工具进行安装时就可以发现
bundletool会先根据aab生成apks(针对一种或多种机型的所有用到的资源的集合包)
再用apks安装到手机上(从资源集合包中抽取适用当前机型的资源进行安装)
注意事项:
这里再提及一下构建过程中的注意事项
- AndroidGradle插件版本需要4.0.0以上,低于这个版本构建时会报找不到插件“com.android.asset-pack“
- asset pack不能是空包,每个包里至少有一个文件,不然打不出来
- 文件的相对路径不能重复,因为所有asset pack包在底层读取都是用相对路径的,所以如果一个包里放的资源相对路径是AAA/BBB.txt,那么其他asset pack包(包括base)一定不能有再有AAA/BBB.txt相对路径的资源,直接用Android Studio出aab包时遇到相对路径相同会报错,但自己用zip塞新资源时只有真正运行才能发现,要注意
- (结合第3条)官方原生的读取接口或者插件提供的资源读取接口已经处理了资源在多个asset pack中的情况(即只要相对路径正确,底层就能找到资源),通常一些大厂插件运行在Android平台时也是用了Android官方接口,所以不用改动,能无缝支持aab包下读取资源。但总会有些插件独辟蹊径自己搞一套资源读取方法,这时就可能出现资源实际在AssetPack1.apk里,但插件自身读写接口只搜索了base.apk的情况,这种情况或者魔改插件,或者就关注插件方的更新吧
- base.apk包有150MB大小的限制,要不真不用这么搞麻烦/(ㄒoㄒ)/~~,记得上述资源都有数量和大小限制,具体详见Android官网