android apk 转aab+pad 实现方案
前言
各位同学的大家好,最近要上架google 遇到的一些问题 所以整理一下。这个解决方案是37互娱的同学提供的我也只是重新整理下 希望大家不要说我抄袭
背景
当前海外主要渠道是谷歌的Google Play,而根据Google Play的政策,2021年8月起,就需要使用Android App Bundle(aab)格式了。
而且谷歌对包体大小也做了限制,超过150MB的包无法上传,如果只上传小包,那么玩家在进入游戏时必然需要等待较长时间的游戏资源加载,影响转化。而如果想在安装时就附带游戏资源,突破150MB的限制,则需要接入谷歌提供的Play Asset Delivery功能。
如何构建aab+ pad 工程 我们这边做个简单示范 需要了解同学可以看之前博客
https://blog.csdn.net/xq610928/article/details/123187474?spm=1001.2014.3001.5502
准备aab +pad 工程
image.png如果我们通过官方文档介绍构建的一个aab+pad 已经OK了
image.png
主要核心资源都放在了install_time_asset_pack 这个目录main/assets 路径下面 这边我找了一些单机小游戏和一些垃圾资源打进包里面 做测试
打出来的aab包
image.png
我们在windows电脑上面右键查看这个包的大小是500MB左右
image.png
我们用360压缩工具查看我们分包是没错的
image.png
OK了以后我们把传到商店测试 也是可以的 这里就不做过多演示了
apk 转aab+pad 这个的具体使用场景和实现方案
image.png计划很完美,接下来只需要按计划行事~
image.png
aab+pad转apk
首先我们先了解下aab+pad的文件组成 按官方文档Android App Bundle 格式的介绍,pad的资源包是存在区别于主体代码文件夹(base/
)的独立文件夹内的。
上图中紫色的部分就是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/
image.png
生成apks
-
1.从 aab 生成一组 APK
java -jar bundletool-all-1.6.1.jar build-apks \
--bundle=base.aab \
--output=base.apks \
--ks=test.jks \
--ks-pass=pass:****** \
--ks-key-alias=****** \
--key-pass=pass:******
-
2.将 APK 部署到连接的设备
还原成apk
竟然apk可以转化成aab,同样aab也可以生成apk,而且更加简单
java -jar bundletool-all-1.6.1.jar build-apks \
--mode=universal \
--bundle=base.aab \
--output=test.apks \
--ks=luojian37.jks \
--ks-pass=pass:****** \
--ks-key-alias=****** \
--key-pass=pass:******
此时就可以或得一个test.apks的压缩包,解压这个压缩包就有一个universal.apk,和开始转化的apk几乎一样。
如图
image.png里面只有两个文件,toc.pb虽然我们不知道这是什么,但是pb文件一般都是提供配置信息,直接忽略,剩下的universal.apk文件就是我们需要的,包含了所有资源和代码的apk了。
拿到apk后,我们就可以使用旧流程进行切包,对apk内的代码进行升级了,之后我们就可以拿到切包后的apk文件。
至此,我们就按计划完成了第一步了,进度50%,一切顺利。😏
apk转aab
更加顺利的是,apk转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的限制了,所以还是不能上传到谷歌后台。
问题不大,我们只需要稍微调整计划,把需要做的事情变为:
从研发输出的aab+pad中提取pad压缩包
把研发输出的aab+pad转成apk
把反编译修改后的apk转成base压缩包
把base压缩包和pad压缩包转化aab包
-
1从研发输出的aab+pad中提取pad压缩包
这个就比较简单了 我们之间用压缩工具直接就解压研发给我们的aab
如图
image.png解压出来的如图
image.png
我们得到如下三个文件 pad 的资源 我们不需要做任何修改 一般来来说研发都是处理好的我们只需要尽到这个目录下面然后 压缩出我们的pad的zip 压缩包即可
-
2把研发输出的aab+pad转成apk
这个在上面讲到了 就一条命令就行了
java -jar bundletool-all-1.6.1.jar build-apks \
--mode=universal \
--bundle=base.aab \
--output=test.apks \
--ks=test.jks \
--ks-pass=pass:****** \
--ks-key-alias=****** \
--key-pass=pass:******
反编译apk 然后修改里面内容这个就比较简单了 我这边就不展开讲了 大家可以去看我之前逆向的文章
Android 反编译工具的各种用法
-
3把反编译修改后的apk转成base压缩包
我们还是参考apk转aab我们之前的文章 不过这次我们只需要base.zip,所以只需要执行到压缩资源这一步即可。
这里我们还是讲一下那个脚本怎么生成的 因为手动很多人也不愿意去动
脚本码云仓库地址:
https://gitee.com/qiuyu123/build_aab_tool_pad
我们找到 bundletool.py 文件
image.png然后把这里delete操作注释起来
image.png在build_aab_tool\temp_20220621151158\modules 目录下面会有这个base.zip
image.png这里我们需要注意
我们得到的base.zip
image.png研发给到的aab解压出来的pad资源
image.png我们对比发现 我们需要把base.zip 里面assets 里面资源文件删除 不然我们最后再打包的时候 aab+pad 的包时候就会出现资源冲突的。
最终的base 目录就是这样assets 目录不能多余的pad分包资源文件
image.pngimage.png
把base压缩包和pad压缩包转化aab包
java -jar bundletool-all-1.11.0.jar build-bundle --modules=base.zip,install_time_asset_pack.zip --output=my.aab
需要用到bundletool-all-1.11.0.jar 大家可以自行去下载也可以用脚本代码里面的
aab签名
jarsigner -digestalg SHA1 -sigalg SHA1withRSA -keystore test.jks -storepass 123456 -keypass 123456 my.aab key0
传到google后台测试
将我们打包好的aab传到后台测试即可 我这边已经成功了就不再传了 包很大要传很久
内部测试下载
image.pngimage.png
我们下载出来后安装到手机测试没问题的话 那么整个流程就完成了。
最后总结:
本文介绍了apk 转aab+pad流程的分析过程,以及所需要注意的细节,再次感谢37互娱的同学提供方案,我也是在此基础上面整理一下 。希望文章能帮助到各位同学。以后我还会贡献更多有用的代码分享给大家。各位同学如果觉得文章还不错 ,麻烦给关注和star,小弟在这里