Android App Bundle apk转aab

2 篇文章 0 订阅
1 篇文章 0 订阅

最近,Google play的新政策可真是让各大游戏公司忙碌呀

背景

根据Google Play的政策要求,自 2021 年 8 月起,Google Play 将开始要求新应用使用 Android App Bundle(以下简称aab) 进行发布。该格式将取代 APK 作为标准发布格式

正常情况下直接用AS的打包生成aab就可以满足需求,上传到Google play了。

但是会有这么一个问题,并不是所有时候你都可以拿到一个游戏工程或者源码的,如果给你的是一个apk包,那你怎么办呢?

接下来,就向大家介绍如何从apk一步步转化成aab。

需要工具

apk生成aab

解压apk

通过apktool去解压apk包

java -jar apktool_2.5.0.jar d test.apk -s -o decode_apk_dir

解压apk后 decode_apk_dir 目录结构:
在这里插入图片描述
编译资源

编译资源使用aapt2编译生成 *.flat文件集合

aapt2 compile --dir decode_apk_dir\res -o compiled_resources.zip

生成compiled_resources.zip文件

为什么要加.zip的后缀,不和谷歌官方文档一样直接生成compiled_resources文件,或者compiled_resources文件夹。此处为了windows能正常的编译打包,linux和mac随意~

关联资源

生成base.apk

aapt2 link --proto-format -o base.apk -I android_30.jar 
--min-sdk-version 19 --target-sdk-version 29 
--version-code 1 --version-name 1.0 
--manifest decode_apk_dir\AndroidManifest.xml 
-R compiled_resources.zip --auto-add-overlay

解压base.apk

解压到base文件夹,目录结构:
在这里插入图片描述
拷贝资源

以base文件夹为根目录

创建 base/manifest 将 base/AndroidManifest.xml 剪切过来

拷贝assets , 将 ./temp/decode_apk_dir/assets 拷贝到 ./temp/base/assets

拷贝lib, 将 ./temp/decode_apk_dir/lib 拷贝到 ./temp/base/lib

拷贝unknown, 将 ./temp/decode_apk_dir/unknown 拷贝到 ./temp/base/root

拷贝kotlin, 将 ./temp/decode_apk_dir/kotlin拷贝到 ./temp/base/root/kotlin

拷贝META-INF,将./temp/decode_apk_dir/original/META-INF 拷贝到 ./temp/base/root/META-INF (删除签名信息***.RSA**、.SF、.MF)

创建./base/dex 文件夹,将 ./decode_apk_dir/*.dex(多个dex都要一起拷贝过来)

base/manifest                        ============> base/AndroidManifest.xml
decode_apk_dir/assets                ============> base/assets
decode_apk_dir/lib                   ============> base/lib
decode_apk_dir/unknown               ============> base/root
decode_apk_dir/kotlin                ============> base/root/kotlin
decode_apk_dir/original/META-INF     ============> base/root/META-INF
decode_apk_dir/*.dex                 ============> base/dex/*.dex

最终的目录结构

base/
├── assets
├── dex
├── lib
├── manifest
├── res
├── resources.pb
└── root

压缩资源

将base文件夹,压缩成base.zip 一定要zip格式

注意:压缩后双击打开显示的是所有资源,而不是显示base,点击base再显示所有资源;否则会报AndroidManifest.xml找不到的错
在这里插入图片描述
编译aab

打包app bundle需要使用bundletool

java -jar bundletool-all-1.6.1.jar build-bundle --modules=base.zip --output=base.aab 

aab签名

jarsigner -digestalg SHA1 -sigalg SHA1withRSA 
-keystore xxx.jks 
-storepass 签名文件密码
-keypass 签名文件密码
base.aab 
*****(alias)

注意:您不能使用 apksigner 为 aab 签名。签名aab的时候不需要使用v2签名,使用JDK的普通签名就行。

测试

此时我们已经拿到了一个aab的包,符合Google Play的上架要求,那么我们要确保这个aab的包是否正常呢?作为一个严谨的程序员还是得自己测一下。

上传Google Play
上传Google Play的内部测试,通过添加测试用户从Google Play去下载到手机测试。更加能模拟真实的用户环境。

bundletool安装aab(推荐)
每次都上传到Google Play上面去测试,成本太高了,程序员一般没上传权限,运营也不在就没法测试了。此时我们可以使用bundletool模拟aab的安装。

连接好手机,调好adb,执行bundletool命令进行安装

1.从 aab 生成一组 APK

java -jar bundletool-all-1.6.1.jar build-apks 
--bundle=base.aab 
--output=base.apks 
--ks=xxx.jks 
--ks-pass=pass:****** 
--ks-key-alias=****** 
--key-pass=pass:******

2.将 APK 部署到连接的设备

java -jar bundletool-all-1.6.1.jar install-apks --apks=base.apks

还原成apk

竟然apk可以转化成aab,同样aab也可以生成apk,而且更加简单

java -jar bundletool-all-1.6.1.jar build-apks 
--mode=universal 
--bundle=base.aab 
--output=test.apks 
--ks=xxx.jks 
--ks-pass=pass:****** 
--ks-key-alias=****** 
--key-pass=pass:******

此时就可以或得一个test.apks的压缩包,解压这个压缩包就有一个universal.apk,和开始转化的apk几乎一样

最后,感谢这位大佬的分享,同时需要python脚本源码的请到原文处下载:https://juejin.cn/post/6982111395621896229

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值