作者
我们好,我是加权,现在担任海外游戏发行的安卓开发。
布景
当前海外首要渠道是谷歌的Google Play,而依据Google Play的方针,2021年8月起,就需求运用Android App Bundle(aab)格局了。
并且谷歌对包体巨细也做了约束,超过150MB的包无法上传,假如只上传小包,那么玩家在进入游戏时必定需求等待较长时间的游戏资源加载,影响转化。而假如想在装置时就顺便游戏资源,打破150MB的约束,则需求接入谷歌供给的Play Asset Delivery功用。
更多的介绍能够回忆咱们之前的文章。
- 方针东西类-谷歌Android App Bundle(aab)方针海外发行
- 方针东西类-apk转aab+pad
问题
依据上述布景,海外游戏运用aab+pad的搭配必定是大势所趋了。而当研制接入pad功用后,就只能产出aab包了,因为pad是依赖于aab格局的。而旧有的切包流程是针对apk包的,不再适用于当前业务了,所以咱们要怎样对aab+pad包进行切包,升级sdk代码?且看下文分解。
基本思路
咱们先看看旧的针对APK的切包流程
这个流程里边最中心的是融合代码的进程,里边是包括了许多长辈的(工时)心血的,咱们肯定不期望(加班)重新再写一次,假如能复用这部分的代码就好了。
那么怎样才能最大限度的运用已有的功用呢?
假如咱们能够先把aab转成apk,那样就能够彻底复用旧的逻辑,等到apk切包成功后,咱们再将apk转回aab,岂不是完美?新的流程如下
那按方案,咱们只需求做两件事情:
- 把研制输出的aab+pad转成apk
- 把切包后的apk转成aab+pad
方案很完美,接下来只需求按方案行事~
aab+pad转apk
接入了pad的aab格局
首先咱们先了解下aab+pad的文件组成,单纯的aab格局能够参阅之前的文章方针东西类-谷歌Android App Bundle(aab)方针海外发行,而当接入了pad后,aab内的文件又会怎样呢?
按官方文档Android App Bundle 格局的介绍,pad的资源包是存在区别于主体代码文件夹(base/
)的独立文件夹内的。
上图中紫色的部分便是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.pb
,META-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了。
拿到apk后,咱们就能够运用旧流程进行切包,对apk内的代码进行升级了,之后咱们就能够拿到切包后的apk文件。
至此,咱们就按方案完成了第一步了,进展50%,一切顺畅。
apk转aab
更加顺畅的是,apk转aab咱们之前的文章方针东西类-谷歌Android App Bundle(aab)方针海外发行现已有所介绍,依照文章介绍,最终咱们就能够得到了一个aab包。难道咱们现已成功了吗?
先别高兴得太早,滚动条的位置现已透露了事情没有那么简单。
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的约束了,所以仍是不能上传到谷歌后台。
问题剖析
所以咱们现在的问题是,apk转aab的时候,pad资源丢掉了,那么咱们能不能在apk转aab时,把pad资源补回来呢?
依据之前的文章,方针东西类-apk转aab+pad中的生成aab+pad的包部分,咱们知道,只要咱们能供给pad的资源紧缩包,那么就能够把pad重新打进aab中,所以咱们的流程图调整如下
问题不大,咱们只需求稍微调整方案,把需求做的事情变为:
- 从研制输出的aab+pad中提取pad紧缩包
- 把研制输出的aab+pad转成apk
- 把切包后的apk转成base紧缩包
- 把base紧缩包和pad紧缩包转化aab包
0x01 提取pad紧缩包
上文现已提到,接入了pad的aab包目录结构如下
├── base/
├── dex/
├── .../
├── base_assets/
├── assets/
├── assets.pb
├── manifest/
├── AndroidManifest.xml
├── BundleConfig.pb
├── META-INF/
其间base_assets/
目录便是pad资源,在它里边
-
assets/
目录,一般便是游戏的资源,会直接兼并到apk的assets中,保存。 -
assets.pb
,pb
文件是装备信息文件,由bundletool生成,紧缩包内不需求,直接删去。 -
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.zip
和pad.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的切包流程的剖析进程,以及所需求留意的细节,期望能帮到我们~