https://www.jianshu.com/p/8a71dab2172c
Android.bp 文件格式 | Android Open Source Project
语法浅析_android.bp中的subdirs有啥作用-优快云博客
APEX是Google继Project Treble后的又一重大举措,它是Android Q的系统组件更新机制。APEX的想法在GNU/Linux发行版中非常普遍:针对Linux库集合中的特定部分的包更新。但这是Google从未尝试过的事情,因为Android中使用了一个ro(只读)分区,在其中存储了所有系统库和框架,而不是大多数Linux发行版中通常使用的rw(读写)分区,从而使得其难以实现标准升级过程。
库是预编译的代码,可以在其它程序中使用。常用的方法是可以制作成Android应用程序调用的库,减少Android应用程序的大小,因为不需要在多个应用程序中实现相同的代码。我们可以在/system/lib
和/system/lib64
目录中找到许多预装系统库。Android系统库通常不会单独更新-相反,它们会通过OTA更新作为Android平台升级的一部分进行更新(备注:意思就是要整个系统升级才能把系统库部分也一并升级了,而不能像Linux那样子,可以针对特定的系统库进行升级)。另一方面,Linux发行版的库可以单独升级。
随着APEX的推出,Android中的系统库可以像Android应用程序一样单独更新。这样做的好处是,应用程序开发人员将能够利用更新后的库,而无需等待OEM推出完整的系统升级。
APEX是一个生态系统,迫使Google重新考虑Android从不同于/system的非标准分区加载所有库和文件的方式。
首先,我们必须区分共享库和静态库。共享库是一个库(如libkind.so的文件),它不包含自身运行所需的所有代码,而是与实际提供代码的其它库进行链接;静态库则是,可以认为它不依赖于其它任何库,并在文件中静态包含了所有内容。
下面是具体格式讲解:
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 文件的格式。
图 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.xml
。AndroidManifest.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 预留。