android 的aab包

news/2025/1/31 18:37:35/

什么是 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 架构)。
  • 动态生成适配的 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 工具(如 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 -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 文件必须重新进行签名,确保它们的完整性和来源可信。

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,并提示签名无效的错误。

 


http://www.ppmy.cn/news/1568213.html

相关文章

【Linux】--- 制作一个简易的shell

制作一个简易的shell 一、设置命令行二、获取输入的命令第一步和第二步代码细节剖析 三、命令行字符串分割第三步细节剖析 四、执行命令五、代码汇总及演示 想要制作一个简易的shell&#xff0c;过程分为四步 一、设置命令行 #include<stdio.h> #include<stdlib.h>…

【算法】经典博弈论问题——斐波那契博弈 + Zeckendorf 定理 python

目录 斐波那契博弈&#xff08;Fibonacci Nim&#xff09;齐肯多夫&#xff08;Zeckendorf&#xff09;定理示例分析实战演练 斐波那契博弈&#xff08;Fibonacci Nim&#xff09; 先说结论&#xff1a;当初始石子数目 n 是斐波那契数时&#xff0c;先手必败&#xff1b;否则&a…

开发环境搭建-4:WSL 配置 docker 运行环境

在 WSL 环境中构建&#xff1a;WSL2 (2.3.26.0) Oracle Linux 8.7 官方镜像 基本概念说明 容器技术 利用 Linux 系统的 文件系统&#xff08;UnionFS&#xff09;、命名空间&#xff08;namespace&#xff09;、权限管理&#xff08;cgroup&#xff09;&#xff0c;虚拟出一…

【统计的思想】假设检验(二)

假设检验是根据人为设定的显著水平&#xff0c;对被测对象的总体质量特性进行统计推断的方法。 如果我们通过假设检验否定了零假设&#xff0c;只是说明在设定的显著水平下&#xff0c;零假设成立的概率比较小&#xff0c;并不是说零假设就肯定不成立。如果零假设事实上是成立…

Vue学习四—— Home主体页面

前言 在之前已经实现了登录页面&#xff0c;项目页面增删查改的操作&#xff0c;然后选择项目&#xff0c;进入Home页面&#xff0c;也就是核心主体页面。 一、实现效果图 使用elemrnt-plus的布局容器&#xff0c;将页面分为4部分&#xff0c;也可以选择自己喜欢的布局。 在侧…

无监督学习:聚类、异常检测

聚类 工作原因我对聚类特别熟悉&#xff0c;因此视频课程基本快进看完&#xff0c;不做记录 异常检测 高斯(正态)分布 多特征异常检测 将每个特征作为独立特征&#xff08;实践证明即使不完全独立也影响不大&#xff09;计算高斯分布的参数&#xff0c;然后将待预估样本代入…

LINUX部署微服务项目步骤

项目简介技术栈 主体技术&#xff1a;SpringCloud&#xff0c;SpringBoot&#xff0c;VUE2&#xff0c; 中间件&#xff1a;RabbitMQ、Redis 创建用户 在linux服务器home下创建用户qshh&#xff0c;用于后续本项目需要的环境进行安装配置 #创建用户 useradd 用户名 #设置登录密…

three.js+WebGL踩坑经验合集(2):3D场景被相机裁切后,被裁切的部分依然可以被鼠标碰撞检测得到(射线检测)

three.js内置了Raycaster类实现鼠标的碰撞检测&#xff0c;用它可以实现3D物体的鼠标点击&#xff0c;移入移出&#xff0c;触屏检测一类的业务功能。 该功能虽然强大&#xff0c;但同事们普遍反映不是那么好用&#xff0c;因为它不像其它配套了可视编辑的3D引擎一样&#xff…