bundletool 是一种底层工具,可供 Android Studio、Android Gradle 插件和 Google Play 构建 Android App Bundle 文件。此外,bundletool 可将 app bundle 转换为部署到设备的各种 APK。
Android SDK Bundle (ASB) 及其 APK 就是使用 bundletool 构建的。它还可以用作命令行工具,以便您自行构建 app bundle 和 SDK Bundle,以及为应用 APK 或支持运行时的 SDK 的 APK 重新创建 Google Play 服务器端 build。
下载 bundletool
如果您还没有下载 bundletool,请从 GitHub 代码库下载。
构建和测试 app bundle
您可以使用 Android Studio 或 bundletool 命令行工具来构建 Android App Bundle 文件,然后测试从该 app bundle 生成 APK。
构建 app bundle
请使用 Android Studio 和 Android Gradle 插件构建 Android App Bundle 文件并为其签名。但是,如果无法使用该 IDE(例如,因为您使用的是连续构建服务器),您也可以从命令行构建 app bundle 并使用 jarsigner 为其签名。
如需详细了解如何使用 bundletool 构建 app bundle,请参阅使用 bundletool 构建 app bundle。
从 app bundle 生成一组 APK
构建 Android App Bundle 文件后,请测试 Google Play 使用该 Android App Bundle 文件生成 APK 的情形,以及这些 APK 部署到设备上之后的表现。
您可以通过以下两种方式测试 app bundle:
- 在本地使用
bundletool命令行工具。 - 使用测试轨道通过 Google Play 将您的 app bundle 上传到 Play 管理中心。
本部分将介绍如何使用 bundletool 在本地测试 app bundle。
当 bundletool 从 app bundle 生成 APK 后,它会将生成的 APK 纳入到一个名为“APK set archive”的容器中,该容器以 .apks 作为文件扩展名。如需从 app bundle 为应用支持的所有设备配置生成一组 APK,请使用 bundletool build-apks 命令,如下所示:
bundletool build-apks --bundle=/MyApp/my_app.aab --output=/MyApp/my_app.apks
如果要将这些 APK 部署到设备,您还需要添加应用的签名信息,如以下命令所示。如果您未指定签名信息,bundletool 会尝试使用调试密钥为 APK 签名。
bundletool build-apks --bundle=/MyApp/my_app.aab --output=/MyApp/my_app.apks --ks=/MyApp/keystore.jks --ks-pass=file:/MyApp/keystore.pwd --ks-key-alias=MyKeyAlias --key-pass=file:/MyApp/key.pwd
下表更详细地介绍了使用 bundletool build-apks 命令时可以设置的各种标志和选项:
表 1. bundletool build-apks 命令的选项
| 标志 | 说明 |
|---|---|
--bundle=path |
(必需)指定您使用 Android Studio 构建的 app bundle 的路径。如需了解详情,请参阅构建您的项目。 |
--output=path |
(必需)指定输出 .apks 文件的名称,该文件中包含了应用的所有 APK 工件。如需在设备上测试此文件中的工件,请按照有关如何将 APK 部署到已连接设备的部分中的步骤操作。
|
--overwrite |
使用您通过 --output 选项指定的路径覆盖任何现有的输出文件。如果您不添加此标志,而输出文件已存在,您会遇到构建错误。
|
--aapt2=path |
指定 AAPT2 的自定义路径。
默认情况下,bundletool 包含自己的 AAPT2 版本。
|
--ks=path |
(可选)指定用于为 APK 签名的部署密钥库的路径。如果您不添加此标志,bundletool 会尝试使用调试签名密钥为您的 APK 签名。
|
--ks-pass=pass:password 或 --ks-pass=file:/path/to/file |
指定密钥库密码。如果您指定纯文本格式的密码,请使用 pass: 限定该密码。如果您要传递包含该密码的文件的路径,请使用 file: 限定该路径。如果您使用 --ks 标志指定密钥库,而未指定 --ks-pass,那么 bundletool 会提示您从命令行输入密码。
|
--ks-key-alias=alias |
指定要使用的签名密钥的别名。 |
--key-pass=pass:password 或 --key-pass=file:/path/to/file |
指定签名密钥的密码。如果您指定纯文本格式的密码,请使用 pass: 限定该密码。如果您要传递包含该密码的文件的路径,请使用 file: 限定该路径。如果此密码与密钥库自身的密码相同,您可以省略此标志。 |
--connected-device |
指示 bundletool 针对已连接设备的配置构建 APK。如果您不添加此标记,bundletool 会为您的应用支持的所有设备配置生成 APK。
|
--device-id=serial-number |
如果您有多个已连接的设备,请使用此标志指定要部署应用的设备的序列号。 |
--device-spec=spec_json |
提供 .json 文件的路径,该文件指定了您要针对其生成 APK 的设备配置。如需了解详情,请参阅有关如何生成并使用设备规范 JSON 文件的部分。
|
--mode=universal |
将模式设置为 universal。如果您希望 bundletool 构建一个包含应用的所有代码和资源的 APK,以使该 APK 与应用支持的所有设备配置兼容,请使用此选项。
注意: 请注意,这些 APK 要比针对特定设备配置优化过的 APK 更大。但是,这些 APK 更便于与内部测试人员共享,例如想在多种设备配置上测试应用的测试人员。 |
--local-testing
|
启用 app bundle 进行本地测试。在本地测试时,由于无需上传到 Google Play 服务器,因此能够实现快速的迭代测试周期。
有关如何使用 |
将 APK 部署到连接的设备
生成一组 APK 后,bundletool 可以将其中适当的 APK 组合部署到已连接的设备。
例如,如果您的已连接设备搭载 Android 5.0(API 级别 21)或更高版本,bundletool 会推送在该设备上运行您的应用所需的基础 APK、功能模块 APK 和配置 APK。或者,如果您的已连接设备搭载 Android 4.4(API 级别 20)或更低版本,bundletool 会搜索兼容的多 APK,以将其部署到您的设备。
如需从 APK 集部署您的应用,请使用 install-apks 命令并使用 --apks=/path/to/apks 标志指定 APK 集的路径,如以下命令所示。如果您连接了多个设备,请添加 --device-id=serial-id 标志来指定目标设备。
bundletool install-apks --apks=/MyApp/my_app.apks
生成一组设备专用的 APK
如果您不想针对应用支持的所有设备配置构建一组 APK,则可以使用 --connected-device 选项,仅针对已连接设备的配置构建 APK(如以下命令所示)。如果您连接了多个设备,请添加 --device-id=serial-id 标志来指定目标设备。
bundletool build-apks --connected-device --bundle=/MyApp/my_app.aab --output=/MyApp/my_app.apks
生成并使用设备规范 JSON 文件
bundletool 可以针对 JSON 文件指定的设备配置生成一组 APK。如需首先为已连接的设备生成 JSON 文件,请运行以下命令:
bundletool get-device-spec --output=/tmp/device-spec.json
bundletool 会在该工具的目录中为您的设备创建一个 JSON 文件。然后,您可以将该文件传递给 bundletool,以仅针对该 JSON 文件中描述的配置生成一组 APK,如下所示:
bundletool build-apks --device-spec=/MyApp/pixel2.json --bundle=/MyApp/my_app.aab --output=/MyApp/my_app.apks
手动创建设备规范 JSON
如果您无法访问要构建目标 APK 集的设备(例如,您想通过自己手头没有的设备试试应用),则可以手动创建采用以下格式的 JSON 文件:
{
"supportedAbis": ["arm64-v8a", "armeabi-v7a"],
"supportedLocales": ["en", "fr"],
"screenDensity": 640,
"sdkVersion": 27
}
然后,您可以将此 JSON 传递给 bundle extract-apks 命令,如上一部分中所述。
从现有的 APK 集中提取设备专用 APK
如果您已有一个 APK 集,并且想要从中提取出一部分针对特定设备配置的 APK,则可以使用 extract-apks 命令并指定设备规范 JSON,如下所示:
bundletool extract-apks --apks=/MyApp/my_existing_APK_set.apks --output-dir=/MyApp/my_pixel2_APK_set.apks --device-spec=/MyApp/bundletool/pixel2.json
估算 APK 集中 APK 的下载大小
APK 集内的 APK 将在压缩后通过网络传送。如需估算这些 APK 的下载大小,请使用 get-size total 命令:
bundletool get-size total --apks=/MyApp/my_app.apks
您可以使用以下标志修改 get-size total 命令的行为:
表 2. get-size total 命令的选项
| 标志 | 说明 |
|---|---|
--apks=path |
(必需)指定要估算下载大小的现有 APK 集文件的路径。 |
--device-spec=path |
指定用于匹配的设备规范文件(通过 get-device-spec 获取或手动构建)的路径。您可以通过指定部分路径来估算一组配置。
|
--dimensions=dimensions
| 指定估算大小时使用的维度。接受以逗号分隔的 SDK、ABI、SCREEN_DENSITY 和 LANGUAGE 列表。如需使用所有维度进行估算,请指定 ALL。
|
--instant |
估算支持免安装体验的 APK(而不是安装版 APK)的下载大小。默认情况下,bundletool 会估算安装版 APK 的下载大小。 |
--modules=modules |
指定要纳入估算范围的 APK 集中的模块,以逗号分隔列表的形式指定。bundletool 命令会自动添加指定集的所有相关模块。默认情况下,该命令会估算首次下载时安装的所有模块的下载大小。
|
其他资源
如需详细了解如何使用 bundletool,请观看 App Bundle:使用 bundletool 和 Play 管理中心测试 app bundle。