因开发需要,周末尝试了上传apk到Google play,在资料都填完的情况下,发现现在,apk已经无法满足市场要求了。了解下发现Google Play 新应用的格式是 Android App Bundle(以下简称aab) 。当然如果有源码的话完全可以使用Android Studio生成aab,奈何仅有apk。
一顿冲浪,借鉴了不少文章,最终完成。
需要工具
-
bundletool.jar
bundletool.jar 是google提供生成&测试aab的工具,gradle打包里面也是使用的这个工具。
获取方式github: https://github.com/google/bundletool/releases -
apktool_2.5.0.jar
反编译安卓apk工具。
获取方式github: https://github.com/iBotPeaches/Apktool/releases -
aapt2
aapt全称Android Asset Packaging Tool是Android资源打包工具。
获取方式ANDROID SDK: $ANDROID_SDK/build-tools/30.0.3/aapt2 -
android.jar
android framework,提供了系统的资源和api。
获取方式ANDROID SDK: $ANDROID_SDK/platforms/android-30/android.jar
aapt2和Android在Android sdk目录下。 现在谷歌对sdk的版本要求在31以上,所以项目一定要用最新的sdk进行编译
既然是将apk转成aab,自然要有apk,将apk和这几个jar包放到一个文件夹,可能会方便一点。
鉴于现在Android Studio基本上自带sdk和jdk,在apk转aab的时候用起来可能不是很方便,所以电脑再配置一下jdk吧
进入正题
- 1.通过apktool去解压apk包
java -jar apktool.jar d test.apk -s -o decode_apk_dir
解压apk后目录结构,这个应该和代码有关系
钱钱钱
- 2.使用aapt2编译生成 文件集合
aapt2 compile --dir decode_apk_dir\res -o compiled_resources.zip
- 3.生成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
(为了方便展示,换行了,弄个文件把这些弄成一行,相关配置自己改)
- 4.解压base.apk
- 5.拷贝资源
创建base文件夹,以base文件夹为根目录,也可以直接用解压后的base,我是直接用的
创建 base/manifest 将 base/AndroidManifest.xml 剪切过来
拷贝assets , 将 ./decode_apk_dir/assets 拷贝到 ./base/assets
拷贝lib, 将 ./decode_apk_dir/lib 拷贝到 ./base/lib
拷贝unknown, 将 ./decode_apk_dir/unknown 拷贝到 ./base/root
拷贝kotlin, 将 ./decode_apk_dir/kotlin拷贝到 ./base/root/kotlin
拷贝META-INF,将./decode_apk_dir/original/META-INF 拷贝到 ./base/root/META-INF (删除签名信息 .RSA、.SF、.MF)
创建./base/dex 文件夹,将 ./decode_apk_dir/*.dex(多个dex都要一起拷贝过来)
(没有的就没有吧)
base/resources.pb ============> base/resources.pb
base/res ============> base/res
base/AndroidManifest.xml ============> base/manifest/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
创建META-INF ============> base/root/META-INF
decode_apk_dir/.dex ============> base/dex/.dex
最终的目录结构
base/
├── assets
├── dex
├── lib
├── manifest
├── res
├── resources.pb
└── root
- 6.将base文件夹,压缩成base.zip 一定要zip格式
压缩后双击打开显示的是所有资源,而不是显示base,点击base再显示所有资源;在base文件夹里选中所有内容进行压缩,不要选中base文件夹进行压缩
- 7.编译aab
java -jar bundletool.jar build-bundle --modules=base.zip --output=base.aab
这段有几篇是带了斜杠的,这里注意,么有杠杠
- 8.aab签名
jarsigner -digestalg SHA1 -sigalg SHA1withRSA
-keystore <签名文件路径>
-storepass <签名文件密码>
-keypass <签名文件密码>
base.aab
<签名文件别名>
(去掉换行符) 签名的时候,看了好几篇都是不让用 apksigner 为 aab
签名,而是直接使用的jdk生产的签名文件进行签名,这个没去尝试