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/)的独立文件夹内的。

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

  • 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.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,小弟在这里

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342

推荐阅读更多精彩内容