什么是 AAB (Android App Bundle)?
AAB (Android App Bundle) 是 Google 推出的新一代 Android 应用发布格式,用于取代传统的 APK 格式。AAB 的全称是 Android App Bundle,扩展名为 .aab
,它并不是直接可以安装的文件,而是用于上传到 Google Play 的发布包。
1. AAB 的核心特性
动态交付 (Dynamic Delivery):
- Google Play 会根据用户设备特性(如屏幕密度、CPU 架构、语言等),从
.aab
文件中动态生成适合该设备的 APK 文件(包括 Base APK 和 Split APKs)。 - 用户只会下载设备所需的资源和代码,减小下载包的大小。
- 模块化支持:
- 支持将应用划分为多个模块(Dynamic Feature Modules),部分功能可以按需下载,而不是在安装时全部下载。
-
更小的下载包:
- AAB 格式将应用分成多个部分,避免了用户下载无关的资源或代码。例如,不会下载与用户设备无关的语言包、屏幕密度资源等。
3. AAB 的工作原理
当你上传 .aab
文件到 Google Play 后,Google Play 会对其进行处理:
-
分拆资源和代码:
- Google Play 会将
.aab
文件拆分为 Base APK 和多个 Split APK。 - Base APK 包含应用的核心逻辑和必要的资源。
- Split APK 包含设备特定的资源(如语言、屏幕密度、CPU 架构)。
- Google Play 会将
-
动态生成适配的 APK:
- 当用户从 Google Play 下载应用时,Google Play 会根据用户设备特性动态生成 APK,只包含必要的部分。
-
按需加载模块:
- 如果应用包含动态功能模块,可以在运行时按需下载,而不是安装时一并下载。
所以安装的时候做少安装两个apk包,一个是Base APK 还有一个是Split APK,最少两个,因为可能会多个Base APK包。
那如果我们自己想测试aab包该怎么测试
从 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
命令,如下所示:
我们也需要将aab包转成apk才能使用。bundletool 工具,这是google为我们提供的,
https://developer.android.com/tools/bundletool?hl=zh-cn
首先得下载这个工具,这个下载地址是官方提供的
https://github.com/google/bundletool/releases
下载完后发现是一个.jar结尾的,所有得用java -jar命令执行
什么是.jar文件
.jar
程序本质上是用 Java 编写的,所以需要 Java 虚拟机(JVM)来执行它。
-
运行工具:
- 许多开发工具和 CLI 工具(如
bundletool
、gradle
)都是以.jar
文件形式分发。
- 许多开发工具和 CLI 工具(如
java -jar
命令的含义
java -jar
是用来运行 .jar
文件的命令,其中:
-
java
- 是 Java 虚拟机(JVM)的命令行工具,用来启动和运行 Java 程序。
- 通常是 JRE(Java Runtime Environment)或 JDK(Java Development Kit)的一部分。
-
-jar
- 是
java
命令的一个选项,表示运行一个 JAR 包。 - 它告诉 JVM,目标文件是一个可执行的
.jar
文件,并让 JVM按照 JAR 文件的MANIFEST.MF
文件中的Main-Class
配置来启动程序。
- 是
所以我们运行这个程序
java -jar bundletool的path
结下来我们使用bundletool将aab转变成apk
命令:
java -jar bundletool build-apks --bundle=aab文件路径 --output=需要写入的apks路径
--output这个记得一定是apks结尾的
但是这个是没有签名的apk,是不可以安装的
如果要将这些 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
一定记得 --和他签名的字符有两个空格,我就是直接复制过去,报错的
如果这个签名的信息配置错误,那么就调用debug.jks去打包
这里其实我有个问题,为什么我打包aab的使用了签名,再打包这apk的时候为什么又要重新签名,googlePlay没有我的签名是如何实现的呢?
-
AAB 签名:
- 当你生成
.aab
文件时,AAB
本质上是一个归档文件,它包含了应用的所有模块和资源,但并未直接构建具体的 APK 文件。 - 打包
.aab
时,确实需要用签名(如 keystore)对AAB
文件本身进行签名。这是为了验证.aab
的完整性和来源,防止被篡改。
- 当你生成
-
生成 APK 时:
- 从 AAB 到 APK 是一个重新构建过程。
bundletool
会根据设备配置(如屏幕密度、语言、CPU 架构等)从.aab
文件中提取资源,动态生成针对性的 APK。 - 由于这是一个新的构建过程,生成的 APK 文件必须重新进行签名,确保它们的完整性和来源可信。
- 从 AAB 到 APK 是一个重新构建过程。
2. Google Play 是如何拿到你的签名用于最终签名 APK 的?
2. Google Play 是如何拿到你的签名用于最终签名 APK 的?
Google Play 应用签名的机制
Google Play 在分发应用时,会执行 Google Play 应用签名(Google Play App Signing)。具体过程如下:
-
上传 AAB 到 Google Play:
- 当你上传
.aab
文件到 Google Play,Google Play 会验证.aab
文件的签名,确保是由开发者上传且未被篡改。
- 当你上传
-
Google Play 持有的签名密钥:
- Google Play 要求开发者在启用 Google Play 应用签名时,将应用的签名密钥交由 Google Play 保管。
- 如果是新应用,Google Play 会生成一个新的签名密钥,专门用于分发你的应用。
- 如果是旧应用(签名密钥已存在),开发者需要将原有的签名密钥上传给 Google Play。
-
Google Play 用自己的签名密钥重新签名:
- Google Play 接收
.aab
文件后,会提取资源并生成针对性 APK 文件。 - 生成的 APK 文件会使用 Google Play 保管的签名密钥重新签名。
- Google Play 接收
-
用户设备校验签名:
- 用户下载的 APK 文件会通过 Google Play 签名的密钥校验其完整性和来源。
3. 为什么 Google Play 不直接使用上传 AAB 的签名密钥?
主要原因有以下几点:
-
提高安全性:
- 开发者的签名密钥保存在 Google Play 的安全硬件模块(HSM)中,比开发者本地存储更安全。
- 即使开发者的签名密钥泄露,Google Play 的分发不会受影响,因为它用的是自己的签名密钥。
-
灵活性(签名密钥更新):
- Google Play 签名支持签名密钥轮换。比如,如果你的密钥泄露,你可以通过 Google Play 请求生成新的密钥。
-
一致性:
- Google Play 可以确保所有从它分发的 APK 都有统一的签名,避免因为开发者错误操作导致 APK 文件不一致。
. Google Play 如何校验上传的 AAB 文件
当你将 .aab
文件上传到 Google Play,Google Play 会进行以下签名校验过程:
第一步:检查开发者的签名密钥
- 当你首次在 Google Play 控制台发布应用时:
- 如果启用了 Google Play 应用签名:你需要上传你的签名密钥(
.jks
文件中的密钥)到 Google Play,或者 Google Play 会帮助你生成并保管一个新的签名密钥。 - 这个签名密钥成为 Google Play 用于验证你上传内容的依据。
- 如果启用了 Google Play 应用签名:你需要上传你的签名密钥(
第二步:提取 AAB 的签名
- Google Play 提取
.aab
文件中的签名信息。 .aab
文件的签名是由jarsigner
或类似工具在构建时生成的,它会在.aab
的META-INF/
目录下保存签名。
第三步:对比签名
- Google Play 将提取到的
.aab
签名信息,与 Google Play 控制台中保存的开发者签名密钥进行对比。- 如果签名匹配:Google Play 确认
.aab
文件是由你这个开发者上传的,接着进行后续处理(例如分解.aab
并生成.apk
)。 - 如果签名不匹配:Google Play 会拒绝你的
.aab
,并提示签名无效的错误。
- 如果签名匹配:Google Play 确认