Android APEX 文件格式

Android Pony EXpress (APEX) 是 Android 10 中引入的一种容器格式,用于较低级别系统模块的安装流程中。此格式可帮助更新不适用于标准 Android 应用模型的系统组件。一些示例组件包括原生服务和原生库、硬件抽象层 (HAL))、运行时 (ART) 以及类库。

“APEX”这一术语也可以指 APEX 文件。

背景

虽然 Android 支持通过软件包安装程序应用(例如 Google Play 商店应用)更新适用于标准应用模型(如服务、Activity)的模块,但是对于较低级别的操作系统组件,使用类似模型具有以下缺陷:

  • 基于 APK 的模块不能在启动序列早期使用。软件包管理器是应用相关信息的中央代码库,只能从 activity 管理器(在启动过程的后期阶段准备就绪)启动。
  • APK 格式(特别是清单)专用于 Android 应用,系统模块并不总是适用。

设计

本部分简要介绍了 APEX 文件格式和 APEX 管理器的设计,后者是一项管理 APEX 文件的服务。

如需详细了解为 APEX 选择此设计的原因,请参阅开发 APEX 时考虑的替代方案

APEX 格式

这是 APEX 文件的格式。

APEX 文件格式

图 1. APEX 文件格式

在顶层,APEX 文件是一个 ZIP 文件,其中的文件以未压缩的形式存储,且位于 4 KB 边界。

APEX 文件中的 4 个文件如下所示:

  • apex_manifest.json
  • AndroidManifest.xml
  • apex_payload.img
  • apex_pubkey

apex_manifest.json 文件包含软件包名称和版本,可标识 APEX 文件。 这是一个采用 JSON 格式的 ApexManifest 协议缓冲区。

AndroidManifest.xml 文件允许 APEX 文件使用与 APK 相关的工具和基础架构,例如 ADB、PackageManager 和软件包安装程序应用(如 Play 商店)。例如,APEX 文件可以使用现有工具(如 aapt)来检查文件中的基本元数据。该文件包含软件包名称和版本信息。这些信息通常也可以在 apex_manifest.json 中找到。

对于处理 APEX 的新代码和系统,建议使用 apex_manifest.json,而非 AndroidManifest.xmlAndroidManifest.xml 可能包含可供现有应用发布工具使用的其他定位信息。

apex_payload.img 是由 dm-verity 支持的 ext4 文件系统映像。该映像通过环回设备在运行时装载。具体而言,哈希树和元数据块是使用 libavb 库创建的。因为该映像应该可以装载到位,所以文件系统载荷不会进行解析。常规文件包含在 apex_payload.img 文件中。

apex_pubkey 是用于为文件系统映像签名的公钥。在运行时,此密钥可确保使用为内置分区中的相同 APEX 签名的同一实体为已下载的 APEX 签名。

APEX 命名准则

为了避免伴随平台发展产生的新 APEX 之间的命名冲突,请遵循以下命名准则:

  • com.android.*
    • 为 AOSP APEX 预留。并非任何公司或设备所专用。
  • com.<companyname>.*
    • 为公司预留。可能由相应公司的多台设备使用。
  • com.<companyname>.<devicename>.*
    • 为特定设备(或部分设备)的专属 APEX 预留。

APEX 管理器

APEX 管理器(即 apexd)是一个独立的原生进程,负责验证、安装和卸载 APEX 文件。此进程已启动,并在引导序列早期准备就绪。APEX 文件通常预安装在设备的 /system/apex 下。如果没有可用的更新,APEX 管理器默认使用这些软件包。

APEX 的更新序列使用 PackageManager 类,如下所示。

  1. 通过软件包安装程序应用、ADB 或其他来源下载 APEX 文件。
  2. 软件包管理器启动安装过程。在识别出该文件是 APEX 文件后,软件包管理器会将控制权转交给 APEX 管理器。
  3. APEX 管理器验证 APEX 文件。
  4. 如果 APEX 文件通过验证,则 APEX 管理器的内部数据库会进行更新,以反映 APEX 文件会在下次启动时激活。
  5. 在成功验证软件包后,安装请求者接收广播。
  6. 为了继续安装,系统必须重新启动。
  7. 下次启动时,APEX 管理器会启动、读取内部数据库,并针对列出的每个 APEX 文件执行以下操作:

    1. 验证 APEX 文件。
    2. 从 APEX 文件创建环回设备。
    3. 在环回设备之上创建设备映射器块设备。
    4. 将设备映射器块设备装载到唯一路径(例如 /apex/name@ver)上。

装载内部数据库中列出的所有 APEX 文件后,APEX 管理器为其他系统组件提供 Binder 服务,以查询有关已安装的 APEX 文件的信息。例如,其他系统组件可以查询设备中安装的 APEX 文件列表,也可以查询装载特定 APEX 的确切路径,以便可以访问这些文件。

APEX 文件是 APK 文件

APEX 文件是有效的 APK 文件,因为它们是包含 AndroidManifest.xml 文件的已签名 ZIP 归档文件(使用 APK 签名方案)。这允许 APEX 文件使用 APK 文件的基础架构,例如软件包安装程序应用、签名实用程序和软件包管理器。

APEX 文件中的 AndroidManifest.xml 文件是最小的,由软件包 nameversionCode 以及用于精细定位的可选 targetSdkVersionminSdkVersion 和 maxSdkVersion 组成。这些信息允许通过已有渠道(如软件包安装程序应用和 ADB)传递 APEX 文件。

支持的文件类型

APEX 格式支持以下文件类型:

  • 原生共享库
  • 原生可执行文件
  • JAR 文件
  • 数据文件
  • 配置文件

这并不意味着 APEX 可以更新所有这些文件类型。能否更新某个文件类型,取决于具体平台以及这些文件类型的接口定义的稳定性如何。

签名选项

可通过两种方式为 APEX 文件签名。第一种方式是使用密钥为 apex_payload.img(具体来说是附加到 apex_payload.img 的 vbmeta 描述符)文件签名。第二种方式是使用 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值