GooglePlay要求 2021 年下半年开始,上架的app必须使用 Bundle 打包。所以 apk 使用 Bundle 打包已经势在必行。
这篇文档主要查询官方文档,然后根据文档自行实践了一下。提前了解 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 后台
下面通过命令将 aab 转为 apks (是 apks 不是 apk)
java -jar bundletool-all-1.3.0.jar build-apks --bundle=app-debug.aab --output=app-debug.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 后缀文件,但显然这些文件是无法直接解包安装的
如果要安装的话,依旧要借助这个工具进行:
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
文件。可以看看这个文件的内容:
它基本囊括了这台手机支持的 apk 的信息。然后执行命令生成一些 apk:
java -jar bundletool-all-1.3.0.jar extract-apks --apks=app-debug.apks --output-dir=apks --device-spec=config.json
这里使用 --output-dir
指定了输出目录为:apks
,在这个命令执行目录下会根据 config.json
生成多个 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
又无法单独安装:
如果需要本地 apk 测试,还是使用之前的 assembleDebug
生成吧。
至此 apk bundle 打包和 bundletool 的基本用法已经掌握