Android Bundle 打包教程

Android Bundle 打包教程

GooglePlay要求 2021 年下半年开始,上架的app必须使用 Bundle 打包。所以 apk 使用 Bundle 打包已经势在必行。

google 官方文档

这篇文档主要查询官方文档,然后根据文档自行实践了一下。提前了解 Bundle 打包步骤和注意点。

Bundle 打包要求

如果使用 as 工具,则要求版本必须在 Android Studio 3.2 及以上

当然一个公司发布apk。一般都是服务器打包。所以支持命令行构建 app bundle

// debug 包构建
gradlew bundleDebug

// release 构建
gradlew bundleRelease

与之前的命令区别是将 assemble 换成了 bundle

但是:如果使用 bundle 打包必须使用 GooglePlay 托管签名。也就是上传打包的私钥文件,不知道这项要求后面是否会更改,对于某些大型公司来说,又是否会妥协,将私钥上传至 GooglePlay。

打包实践

如果只是想打包使用 bundle ,那么一般不需要任何操作,只要将命令从 gradle assembleRelease 换成 gradle bundleRelease 即可。下面试一下

E:\MWorkFolder\WebViewProxy>gradlew bundleDebug
Starting a Gradle Daemon (subsequent builds will be faster)

> Configure project :app
task a
hello world
target:project ':app'

BUILD SUCCESSFUL in 15s
26 actionable tasks: 26 up-to-date
E:\MWorkFolder\WebViewProxy>

执行命令显示成功了。

打开 项目根目录\app\build\outputs\bundle\debug 。里面会有一个 app-debug.aab 文件。

这便是一个 aab 包了。但是 aab 包无法直接安装。如果测试的话,需要使用工具才能安装这个生成的 aab 包。

虽然程序一般不需要做任何改动就可以直接生成 aab 。但 build.gradle 中推荐配置:

android {

    ......

    bundle {
        density {
            enableSplit true
        }
        abi {
            enableSplit true
        }
        language {
            enableSplit true
        }
    }
}

虽然生成步骤看上去很简单。但如果项目很复杂,或者用了其它骚操作等等,则要注意分包后,资源文件可能缺失导致的问题。

所以在 bundle 打包后,要将它安装到设备上进行测试:

安装 aab 包

一般 bundle 打包后是无法直接安装的,google 提供了一个工具。它开源在 github 上:https://github.com/google/bundletool/releases

利用这个工具将 aab 转为 apks 后才能安装到本地设备上。否则只能上传到 google play 后台

bundletool-all-1.3.0.jar 下载

下面通过命令将 aab 转为 apks (是 apks 不是 apk)

java -jar bundletool-all-1.3.0.jar build-apks --bundle=app-debug.aab --output=app-debug.apks

build apks

生成过程中有一个提示信息,要求提供debug签名。这里没有提供,暂时不管。如果要提供的话,后面新增参数:

--ks=/MyApp/keystore.jks
--ks-pass=file:/MyApp/keystore.pwd
--ks-key-alias=MyKeyAlias
--key-pass=file:/MyApp/key.pwd

上面命令执行完成后,获得了一个文件:app-debug.apks ,它不是平常认知中的 apk 后缀。

强行修改 apks 后缀为 zip 查看了一下。发现里面有一个 splits 目录。其中包含各种命名的 apk 后缀文件,但显然这些文件是无法直接解包安装的

aplits目录

如果要安装的话,依旧要借助这个工具进行:

java -jar bundletool-all-1.3.0.jar install-apks --apks=app-debug.apks

如果电脑连接了多台手机设备,需要提供参数安装到指定设备上:--device-id=serial-id

此时已经安装成功了。手机上打开测试也一切正常

aab 转 apk 包测试

上面过程中一直使用 bundletool 进行操作。如果需要生成一个指定的 apk 呢?

可以创建一个配置文件,然后工具根据这个配置文件生成指定的 apk

bundletool 工具也可以生成这个配置。假设手机已经连接在电脑上。则执行命令:

java -jar bundletool-all-1.3.0.jar get-device-spec --output=config.json

它会在当前目录生成一个 config.json 文件。可以看看这个文件的内容:

config

它基本囊括了这台手机支持的 apk 的信息。然后执行命令生成一些 apk:

java -jar bundletool-all-1.3.0.jar extract-apks --apks=app-debug.apks --output-dir=apks --device-spec=config.json

生成 apk

这里使用 --output-dir 指定了输出目录为:apks ,在这个命令执行目录下会根据 config.json 生成多个 apk:

生成的 apk

这里有四个 apk 。根据名称,可以理解为每个apk都包含了部分资源。

例如: arm64_v8a 二进制文件 xxhdpi 资源文件 zh 文本文件

经过测试仅安装 base-master.apk 然后打开 app 是可行的。 但只在部分情况下可行。例如用来测试的 app 没有必须使用的二进制 so 文件

通过工具将 aab 转为 apk 目前看上去没有什么作用。因为生成的四个 apk 文件只有名称为 base-master 的可以直接安装。即便安装上了,如果 apk 依赖 so 库文件,也是无法正常使用的。那么生成的意义是什么呢。。。

如果程序有二进制库文件必须使用。则安装这个 base-apk 运行会报错,提示缺少 so 库。但同级目录下的 base-arm64-v8a.apk 又无法单独安装:

so error

如果需要本地 apk 测试,还是使用之前的 assembleDebug 生成吧。


至此 apk bundle 打包和 bundletool 的基本用法已经掌握

Copyright: 采用 知识共享署名4.0 国际许可协议进行许可

Links: https://zwc365.com/2020/11/20/androidbundle-build

Buy me a cup of coffee ☕.