解释Android App Bundle的Play Asset Delivery
解读
面试官问的不是“什么是AAB”,而是Play Asset Delivery(PAD)在AAB体系里到底解决了什么问题、Unity项目如何接入、对包体与运行时性能的影响。国内大厂已全面切AAB上架海外Google Play,热更合规、首包大小、用户流失率都与PAD直接挂钩,答不到“资源分包策略+Unity脚本层调用+运行时扩展”三层,会被判定为仅停留在“听过”。
知识点
- AAB(Android App Bundle):Google Play强制格式,把APK拆成base + config splits,本地无法直接安装,必须通过Play分发。
- Play Asset Delivery(PAD):Google官方提供的大型资源分发方案,替代旧版OBB(扩展文件),只能在AAB格式下使用,支持install-time、fast-follow、on-demand三种模式。
- Unity 2021.2+内置Play Asset Delivery插件,提供AssetPack API,C#层可直接请求、挂载、释放资源包。
- 资源包上限150 MB(install-time),fast-follow/on-demand无硬性上限,但单包建议≤1 GB,否则下载失败率飙升。
- 纹理ETC2/ASTC、Shader Variant、Addressable均可放入PAD,首包仅保留首次关卡必需资源,其余按需下载,降低30%以上首装流失。
- 国内出海项目需兼顾CDN回退:若用户侧Google Play不可用,必须自建CDN+校验机制,否则黑屏卡死。
- 性能关键点:下载过程占用ExoPlayer线程,Unity主线程需监听AssetPackRequest.Status,避免阻塞;已下载的pack会在**/android/obb/../files/assetpacks**缓存,二次启动直接mmap,IO与内存零拷贝。
答案
Play Asset Delivery是Google Play在AAB时代推出的官方大型资源分发方案,用来替代容易丢失的OBB文件。它把资源拆成install-time、fast-follow、on-demand三种模式:install-time随APK一起安装,不超过150 MB,适合首关必备资源;fast-follow在APK安装完成后立即后台下载,用户进入游戏前大概率已就绪;on-demand真正按需下载,由代码主动触发。
Unity侧通过Google Play Asset Delivery插件提供C#接口:
- 在Editor里把文件夹标记为AssetPack,设置delivery类型,构建时会生成***.assetpack.pb**并打入AAB。
- 运行时先调用
PlayAssetDelivery.RetrieveAssetPackAsync(“level2_pack”)拿到AssetPackRequest,轮询Status:Pending表示正在下载,可更新进度条;Completed后通过assetPackRequest.GetAssetLocation("level2/terrain.asset")拿到AssetLocation,直接传路径给Addressable或AssetBundle.LoadFromFile,实现零拷贝加载。
- 下载失败或Play服务缺失时,走自建CDN回退,MD5+大小校验后拷贝到
Application.persistentDataPath,保持代码层无感切换。
使用PAD后,我们把首包从128 MB压缩到63 MB,首日安装成功率提升18%,用户平均等待时长减少22秒;同时借助fast-follow,进入第二关前资源100%就绪,无弹窗等待,留存率提升7.3%。
拓展思考
- 与Addressable的联动:把Addressable的Catalog远程LoadPath指向
asset-pack://伪协议,实现同一套代码既支持PAD又支持国内CDN,减少双轨维护。 - 版本升级兼容:Google Play支持增量patch,但AssetPack内部文件路径一旦改变就算新包,因此需固定文件名+基于偏移的patch算法,避免整包重下。
- 合规与审核:install-time包体仍计入Google Play政策4GB上限,且不允许包含可执行脚本,因此Lua、DLL热更文件必须放在on-demand包,并通过自研AOT解释器规避政策风险。