android 的aab包

什么是 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 格式将应用分成多个部分,避免了用户下载无关的资源或代码。例如,不会下载与用户设备无关的语言包、屏幕密度资源等。
  1. AAB 的工作原理

当你上传 .aab 文件到 Google Play 后,Google Play 会对其进行处理:

  • 分拆资源和代码

    • Google Play 会将 .aab 文件拆分为 Base APK 和多个 Split APK。
    • Base APK 包含应用的核心逻辑和必要的资源。
    • Split APK 包含设备特定的资源(如语言、屏幕密度、CPU 架构)。
  • 动态生成适配的 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 在本地测试 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 工具(如 bundletoolgradle)都是以 .jar 文件形式分发。

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 复制代码
java -jar bundletool build-apks --bundle=aab文件路径 --output=需要写入的apks路径

--output这个记得一定是apks结尾的

但是这个是没有签名的apk,是不可以安装的

如果要将这些 APK 部署到设备,您还需要添加应用的签名信息,如以下命令所示。如果您未指定签名信息,bundletool 会尝试使用调试密钥为 APK 签名。

java 复制代码
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 文件必须重新进行签名,确保它们的完整性和来源可信。

2. Google Play 是如何拿到你的签名用于最终签名 APK 的?

2. Google Play 是如何拿到你的签名用于最终签名 APK 的?

Google Play 应用签名的机制

Google Play 在分发应用时,会执行 Google Play 应用签名(Google Play App Signing)。具体过程如下:

  1. 上传 AAB 到 Google Play

    • 当你上传 .aab 文件到 Google Play,Google Play 会验证 .aab 文件的签名,确保是由开发者上传且未被篡改。
  2. Google Play 持有的签名密钥

    • Google Play 要求开发者在启用 Google Play 应用签名时,将应用的签名密钥交由 Google Play 保管。
    • 如果是新应用,Google Play 会生成一个新的签名密钥,专门用于分发你的应用。
    • 如果是旧应用(签名密钥已存在),开发者需要将原有的签名密钥上传给 Google Play。
  3. Google Play 用自己的签名密钥重新签名

    • Google Play 接收 .aab 文件后,会提取资源并生成针对性 APK 文件。
    • 生成的 APK 文件会使用 Google Play 保管的签名密钥重新签名。
  4. 用户设备校验签名

    • 用户下载的 APK 文件会通过 Google Play 签名的密钥校验其完整性和来源。

3. 为什么 Google Play 不直接使用上传 AAB 的签名密钥?

主要原因有以下几点:

  1. 提高安全性

    • 开发者的签名密钥保存在 Google Play 的安全硬件模块(HSM)中,比开发者本地存储更安全。
    • 即使开发者的签名密钥泄露,Google Play 的分发不会受影响,因为它用的是自己的签名密钥。
  2. 灵活性(签名密钥更新)

    • Google Play 签名支持签名密钥轮换。比如,如果你的密钥泄露,你可以通过 Google Play 请求生成新的密钥。
  3. 一致性

    • Google Play 可以确保所有从它分发的 APK 都有统一的签名,避免因为开发者错误操作导致 APK 文件不一致。

. Google Play 如何校验上传的 AAB 文件

当你将 .aab 文件上传到 Google Play,Google Play 会进行以下签名校验过程:

第一步:检查开发者的签名密钥
  • 当你首次在 Google Play 控制台发布应用时:
    • 如果启用了 Google Play 应用签名 :你需要上传你的签名密钥(.jks 文件中的密钥)到 Google Play,或者 Google Play 会帮助你生成并保管一个新的签名密钥。
    • 这个签名密钥成为 Google Play 用于验证你上传内容的依据。
第二步:提取 AAB 的签名
  • Google Play 提取 .aab 文件中的签名信息。
  • .aab 文件的签名是由 jarsigner 或类似工具在构建时生成的,它会在 .aabMETA-INF/ 目录下保存签名。
第三步:对比签名
  • Google Play 将提取到的 .aab 签名信息,与 Google Play 控制台中保存的开发者签名密钥进行对比。
    • 如果签名匹配 :Google Play 确认 .aab 文件是由你这个开发者上传的,接着进行后续处理(例如分解 .aab 并生成 .apk)。
    • 如果签名不匹配 :Google Play 会拒绝你的 .aab,并提示签名无效的错误。
相关推荐
梓仁沐白13 分钟前
Android清单文件
android
董可伦2 小时前
Dinky 安装部署并配置提交 Flink Yarn 任务
android·adb·flink
每次的天空3 小时前
Android学习总结之Glide自定义三级缓存(面试篇)
android·学习·glide
恋猫de小郭3 小时前
如何查看项目是否支持最新 Android 16K Page Size 一文汇总
android·开发语言·javascript·kotlin
flying robot5 小时前
小结:Android系统架构
android·系统架构
xiaogai_gai5 小时前
有效的聚水潭数据集成到MySQL案例
android·数据库·mysql
鹅鹅鹅呢6 小时前
mysql 登录报错:ERROR 1045(28000):Access denied for user ‘root‘@‘localhost‘ (using password Yes)
android·数据库·mysql
在人间负债^6 小时前
假装自己是个小白 ---- 重新认识MySQL
android·数据库·mysql
Unity官方开发者社区6 小时前
Android App View——团结引擎车机版实现安卓应用原生嵌入 3D 开发场景
android·3d·团结引擎1.5·团结引擎车机版
进击的CJR9 小时前
MySQL 8.0 OCP 英文题库解析(三)
android·mysql·开闭原则