android bundetool 详解
一、什么是 bundetool ?为什么要使用 bundetool ?
在使用Android Studio 构建 Android App Bundle 后,需要测试 Android App Bundle 生成 APK 的情形,以及这些 APK 部署到设备上之后的表现。
可以通过两种方式来测试 app bundle:
(1)、在本地使用 bundletool 命令行工具进行测试
(2)、通过 Google Play 进行测试(方法是将 app bundle 上传到 Play 管理中心并使用测试轨道)
这里主要介绍如何使用 bundletool 在本地测试 app bundle。
bundletool 是一种底层工具,可供 Gradle、Android Studio 和 Google Play 用于构建 Android App Bundle 或将 App Bundle 转换为部署到设备的各种 APK。
也可以将 bundletool 作为一种命令行工具,用于重新创建、检查和验证应用 APK 的 Google Play 服务器端 build。
二、 app bundle 生成 APKS
当 bundletool 从 app bundle 生成 APK 时,它会将这些 APK 纳入到一个名为“APK set archive”的容器中,该容器以 .apks 作为文件扩展名。
如果要将 APK 部署到设备,需要添加应用的签名信息。
如果未指定签名信息,bundletool 会尝试使用调试密钥为 APK 签名。
bundletool build-apks --bundle=/MyApp/my_app.aab --output=/MyApp/my_app.apks
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
命令时可以设置的各种标记和选项。
只有 --bundle
和 --output
是必需的,其他标记都是可选的。
标记 | 说明 |
--bundle=path |
**(必需)**指定您使用 Android Studio 构建的 App Bundle 的路径。 |
--output=path |
**(必需)**指定“.apks”输出文件的名称,该文件中包含了应用的所有 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 |
如果您有多个已连接的设备,请使用此标记指定要部署应用的设备的序列 ID。 |
--device-spec=spec_json |
使用此标记提供 .json 文件的路径,该文件指定了您要针对其生成 APK 的设备配置。 |
--mode=universal |
如果您希望 bundletool 只构建一个包含应用的所有代码和资源的 APK,以使该 APK 与应用支持的所有设备配置兼容,请将模式设置为 universal。请注意,这些 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 集的路径。
如下所示:
bundletool install-apks --apks=/MyApp/my_app.apks
如果连接了多个设备,请添加 --device-id=serial-id 标记来指定目标设备。
注意:如果将 --local-testing 标记与 build-apks 命令一起使用,要使本地测试正常运行,需要使 install-apks 安装 APK。
四、生成设备专用 APK 集
如果不想针对应用支持的所有设备配置生成一组 APK,则可以使用 --connected-device 选项,仅针对已连接设备的配置生成 APK,如下所示。
bundletool build-apks --connected-device --bundle=/MyApp/my_app.aab --output=/MyApp/my_app.apks
如果连接了多个设备,请添加 --device-id=serial-id 标记来指定目标设备。
五、使用设备规范 JSON 文件
(1)、bundletool 生成并使用设备规范 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
(2)、手动创建设备规范 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
命令的行为:
标记 | 说明 |
--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 命令会自动添加指定集的所有相关模块。默认情况下,该命令会估算首次下载时安装的所有模块的下载 |