Android

android apk 转aab+pad 实现方案

2023-02-05  本文已影响0人  xq9527

前言

各位同学的大家好,最近要上架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/)的独立文件夹内的。

image.png
上图中紫色的部分就是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

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:******

还原成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包

这个就比较简单了 我们之间用压缩工具直接就解压研发给我们的aab

如图

image.png

解压出来的如图


image.png

我们得到如下三个文件 pad 的资源 我们不需要做任何修改 一般来来说研发都是处理好的我们只需要尽到这个目录下面然后 压缩出我们的pad的zip 压缩包即可

这个在上面讲到了 就一条命令就行了

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 反编译工具的各种用法

我们还是参考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.png
image.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.png

内部测试下载

image.png
image.png

我们下载出来后安装到手机测试没问题的话 那么整个流程就完成了。

最后总结:

本文介绍了apk 转aab+pad流程的分析过程,以及所需要注意的细节,再次感谢37互娱的同学提供方案,我也是在此基础上面整理一下 。希望文章能帮助到各位同学。以后我还会贡献更多有用的代码分享给大家。各位同学如果觉得文章还不错 ,麻烦给关注和star,小弟在这里

上一篇下一篇

猜你喜欢

热点阅读