作者

我们好,我是加权,现在担任海外游戏发行的安卓开发。

布景

当前海外首要渠道是谷歌的Google Play,而依据Google Play的方针,2021年8月起,就需求运用Android App Bundle(aab)格局了。

并且谷歌对包体巨细也做了约束,超过150MB的包无法上传,假如只上传小包,那么玩家在进入游戏时必定需求等待较长时间的游戏资源加载,影响转化。而假如想在装置时就顺便游戏资源,打破150MB的约束,则需求接入谷歌供给的Play Asset Delivery功用。

更多的介绍能够回忆咱们之前的文章。

  1. 方针东西类-谷歌Android App Bundle(aab)方针海外发行
  2. 方针东西类-apk转aab+pad

问题

依据上述布景,海外游戏运用aab+pad的搭配必定是大势所趋了。而当研制接入pad功用后,就只能产出aab包了,因为pad是依赖于aab格局的。而旧有的切包流程是针对apk包的,不再适用于当前业务了,所以咱们要怎样对aab+pad包进行切包,升级sdk代码?且看下文分解。

基本思路

咱们先看看旧的针对APK的切包流程

政策工具类-谷歌Android App Bundle(aab)+Play Asset Delivery(pad)发行切包
这个流程里边最中心的是融合代码的进程,里边是包括了许多长辈的(工时)心血的,咱们肯定不期望(加班)重新再写一次,假如能复用这部分的代码就好了。

那么怎样才能最大限度的运用已有的功用呢?

政策工具类-谷歌Android App Bundle(aab)+Play Asset Delivery(pad)发行切包

假如咱们能够先把aab转成apk,那样就能够彻底复用旧的逻辑,等到apk切包成功后,咱们再将apk转回aab,岂不是完美?新的流程如下

政策工具类-谷歌Android App Bundle(aab)+Play Asset Delivery(pad)发行切包
那按方案,咱们只需求做两件事情:

  1. 把研制输出的aab+pad转成apk
  2. 把切包后的apk转成aab+pad

方案很完美,接下来只需求按方案行事~

政策工具类-谷歌Android App Bundle(aab)+Play Asset Delivery(pad)发行切包

aab+pad转apk

接入了pad的aab格局

首先咱们先了解下aab+pad的文件组成,单纯的aab格局能够参阅之前的文章方针东西类-谷歌Android App Bundle(aab)方针海外发行,而当接入了pad后,aab内的文件又会怎样呢?

按官方文档Android App Bundle 格局的介绍,pad的资源包是存在区别于主体代码文件夹(base/)的独立文件夹内的。

政策工具类-谷歌Android App Bundle(aab)+Play Asset Delivery(pad)发行切包
上图中紫色的部分便是pad的资源包。

  • asset_pack_1/ 和 asset_pack_2/ :对于需求大量图形处理的大型应用或游戏,您能够将财物模块化处理为资源包。……如需详细了解如何将资源包添加到您的 app bundle,请参阅Play Asset Delivery 概览。

百闻不如一见,有了理论基础,咱们直接找个aab+pad的包解压看看~ 解压某个接入了pad的游戏的aab包,咱们得到了

├── base/
    ├── dex/
    ├── .../
├── base_assets/
    ├── assets/
    ├── assets.pb
    ├── manifest/
        ├── AndroidManifest.xml
├── BundleConfig.pb
├── META-INF/

其间base/BundleConfig.pbMETA-INF/都是老熟人了,那么毫无疑问,剩余的base_assets/便是研制接入的pad资源包了,实际上这个文件夹的称号取决于研制接入时的文件夹称号,是可变,咱们在切包时需求考虑这个要素

aab转apks

虽然方案是aab转apk,可是实际上aab并不能直接转apk,而是需求先转成apks文件。

处理aab文件,谷歌供给了一个专用的东西bundletool,详细的运用方法我们能够自行google,不再叙说。

那咱们aab转apks自然也是要用到这个东西,详细是运用build-apks指令。

不过需求留意的是,aab转apks,一般状况是针对特定设备转化的,这时候不适用于该设备的资源就不会放进apks中,而咱们的意图是进行切包,肯定是需求一切资源的,那么就需求用到build-apks指令的--mode=universal参数了,参数的详细含义和效果我们自行阅读文档。

所以完好指令是

java -jar bundletool.jar build-apks --mode=universal --bundle=my_app.aab --output=my_app.apks

然后咱们就得到了一个apks文件。

apks转apk

apks实际上便是一个紧缩包,能够直接解压,百闻不如一见,咱们直接解压上述命令得到的apks文件看看,里边究竟有什么。

├── toc.pb
├── universal.apk

里边只要两个文件,toc.pb虽然咱们不知道这是什么,可是pb文件一般都是供给装备信息,直接忽略,剩余的universal.apk文件便是咱们需求的,包括了一切资源和代码的apk了。

政策工具类-谷歌Android App Bundle(aab)+Play Asset Delivery(pad)发行切包

拿到apk后,咱们就能够运用旧流程进行切包,对apk内的代码进行升级了,之后咱们就能够拿到切包后的apk文件。

至此,咱们就按方案完成了第一步了,进展50%,一切顺畅。

apk转aab

更加顺畅的是,apk转aab咱们之前的文章方针东西类-谷歌Android App Bundle(aab)方针海外发行现已有所介绍,依照文章介绍,最终咱们就能够得到了一个aab包。难道咱们现已成功了吗?

政策工具类-谷歌Android App Bundle(aab)+Play Asset Delivery(pad)发行切包

先别高兴得太早,滚动条的位置现已透露了事情没有那么简单。

aab+pad切包,pad的功用才是要害,所以咱们还需求验证pad功用是否正常,咱们解压转化得到的aab包,就会发现,pad功用对应的文件夹(上文中的base_assets)消失了。那么这个文件夹是什么时候丢掉的呢?

咱们细心想想,apk是不支持pad功用的,所以应该是在aab转apks时,bundletool把pad的资源也兼并进apk中了,而在--mode=universal中也有相关描绘

留意bundletool仅包括功用模块,这些模块在通用 APK 中的对应清单中指定<dist:fusing dist:include="true"/>。如需了解详情,请参阅功用模块清单。

bundletool会把功用模块包括进apk中,所以pad在转化的进程当中现已被兼并进apk了。这意味着得到的aab包是不包括pad功用的,那就不能打破150M的约束了,所以仍是不能上传到谷歌后台。

政策工具类-谷歌Android App Bundle(aab)+Play Asset Delivery(pad)发行切包

问题剖析

所以咱们现在的问题是,apk转aab的时候,pad资源丢掉了,那么咱们能不能在apk转aab时,把pad资源补回来呢?

依据之前的文章,方针东西类-apk转aab+pad中的生成aab+pad的包部分,咱们知道,只要咱们能供给pad的资源紧缩包,那么就能够把pad重新打进aab中,所以咱们的流程图调整如下

政策工具类-谷歌Android App Bundle(aab)+Play Asset Delivery(pad)发行切包

问题不大,咱们只需求稍微调整方案,把需求做的事情变为:

  1. 从研制输出的aab+pad中提取pad紧缩包
  2. 把研制输出的aab+pad转成apk
  3. 把切包后的apk转成base紧缩包
  4. 把base紧缩包和pad紧缩包转化aab包

0x01 提取pad紧缩包

上文现已提到,接入了pad的aab包目录结构如下

├── base/
    ├── dex/
    ├── .../
├── base_assets/
    ├── assets/
    ├── assets.pb
    ├── manifest/
        ├── AndroidManifest.xml
├── BundleConfig.pb
├── META-INF/

其间base_assets/目录便是pad资源,在它里边

  1. assets/目录,一般便是游戏的资源,会直接兼并到apk的assets中,保存。
  2. assets.pbpb文件是装备信息文件,由bundletool生成,紧缩包内不需求,直接删去。
  3. manifest/AndroidManifest.xml,为pad编译后的装备信息,决定了pad的下发规矩,咱们不需求更改研制决定的pad下发规矩,所以保存即可。

按上所述,咱们直接把pad目录下的assets/manifest/紧缩得到pad紧缩包,留作后续进程运用。紧缩包的目录结构应如下

// pad.zip,称号随意,下文统一称pad.zip
├── assets/
├── manifest/
    ├── AndroidManifest.xml

0x02 aab+pad转成apk

和上文彻底一致,不再重复。

0x03 apk转成base.zip

咱们仍是参阅方针东西类-谷歌Android App Bundle(aab)方针海外发行, 不过这次咱们只需求base.zip,所以只需求执行到紧缩资源这一步即可。

细心的朋友应该现已发现,这儿运用的apk包仍是和之前相同,是包括了pad资源的,可是现在pad的内容在之前现已被紧缩到pad.zip中了,所以假如仍是全量资源放进base.zip中,那么在转化aab,兼并base.zippad.zip时就会呈现资源抵触的问题。

所以咱们需求在编译资源前,把pad中的资源从apk的反编译目录中移除掉,所以咱们得到的base.zip是不包括pad资源的。

0x04 产出包括pad的aab

最终,咱们顺畅得到包括首要代码的base.zip和包括pad资源的pad.zip,就能够经过以下命令输出aab了

java -jar bundletool.jar build-bundle --modules=base.zip,pad.zip --output=my.aab

假如一切顺畅的话,那么咱们就能够再次得到一个aab包,最终咱们再次验证下有没有翻车。

验证

解压aab包能够发现pad的目录还存在,别的咱们还能够

java -jar bundletool.jar validate --bundle my.aab

假如打包后pad正常,那么输出的成果中会包括以下内容(base_assets为pad模块的称号,不同游戏会不同)

Asset packs:
	Asset pack: base_assets

结束语

本文介绍了aab+pad的切包流程的剖析进程,以及所需求留意的细节,期望能帮到我们~

进程中有问题或者需求沟通的同学,能够扫描二维码加老友,然后进群进行问题和技术的沟通等;