Apk转Aab(Android App Bundle)

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

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

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

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

  • bundletool-all-1.6.1.jar
    bundletool.jar 是google提供生成&测试aab的工具,gradle打包里面也是使用的这个工具。
    获取方式github: github.com/google/bundletool/releases
    详细文档&使用方法: developer.android.com/studio/command-line/bundletool

  • apktool_2.5.0.jar
    反编译安卓apk工具。
    获取方式github: github.com/iBotPeaches…

  • aapt2
    aapt全称Android Asset Packaging Tool是Android资源打包工具。
    获取方式ANDROID SDK: $ANDROID_SDK/build-tools/30.0.3/aapt2
    详细文档&使用方法: developer.android.com/studio/command-line/aapt2

  • android.jar
    android framework,提供了系统的资源和api。
    获取方式ANDROID SDK: $ANDROID_SDK/platforms/android-30/android.jar

  • 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文件

    生成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文件夹为根目录

    将解压得到的resources.pb拷贝到 ./temp/base/resources.pb

    将解压得到的res拷贝到 ./temp/base/res

    创建manifest文件夹, 将解压得到的AndroidManifest.xml拷贝到 ./temp/base/manifest

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

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

    创建root文件夹,拷贝unknown, 将 ./temp/decode_apk_dir/unknown 拷贝到 ./temp/base/root/unknown

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

    root目录下创建META-INF文件夹,得到 ./temp/base/root/META-INF

    创建dex 文件夹,将 ./temp/decode_apk_dir/*.dex拷贝到 ./temp/base/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
    

    将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 <签名文件路径>
    -storepass <签名文件密码>
    -keypass <签名文件密码>
    base.aab 
    <签名文件别名>
    

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

    测试与安装

    限于篇幅,Aab的测试与安装放在下一篇文章
    详见Aab(Android App Bundle)测试与安装