本页面将介绍运行 Android 8.0 或更高版本系统的设备的目录布局,以及 VNDK 规则和关联的 sepolicy。
目录布局
退化目录布局由以下目录组成:
/system/lib[64]
包含所有框架共享库,具体包括 LL-NDK、VNDK 和框架专用库(包括 LL-NDK-Private 和一些与 VNDK-SP 中的库同名的库)。/system/lib[64]/vndk-sp
包含适用于 Same-Process HAL 的 VNDK-SP 库。/vendor/lib[64]
包含供应商扩展的 VNDK 库(DXUA 库或 DXUX VNDK 库)、Same-Process HAL 实现,以及其他供应商共享库。/vendor/lib[64]/vndk-sp
可能包含供应商扩展的 VNDK-SP 库。
供应商模块从 /system/lib[64]
中加载 VNDK 库。
VNDK 规则
本部分提供了完整的 VNDK 规则列表。
- 框架进程不得从供应商分区中加载非 SP-HAL 共享库(此规则从 Android 8.1 开始严格地强制实施)。
- 供应商进程不得从系统分区加载非 LL-NDK 库、非 VNDK-SP 库和非 VNDK 库(Android O 中并未严格地强制实施此规则,但未来版本中会这么做)。
- 已安装的 VNDK 库必须是由 Google 定义的合格 VNDK 库的子集。
- SP-HAL 和 SP-HAL-Dep 的外部依赖项必须仅限于 LL-NDK 库或由 Google 定义的 VNDK-SP 库。
- SP-HAL 共享库的依赖项必须仅限于 LL-NDK 库、由 Google 定义的 VNDK-SP 库、其他 SP-HAL 库和/或可标记为 SP-HAL-Dep 库的其他供应商共享库。
- 只有当供应商共享库不是 AOSP 库,且其依赖项仅限于 LL-NDK 库、由 Google 定义的 VNDK-SP 库、SP-HAL 库和/或其他 SP-HAL-Dep 库时,才可标记为 SP-HAL-Dep 库。
- VNDK-SP 必须保持独立。在 Android 8.0 中,系统以一种特殊方式处理
libRS_internal.so
,但在未来版本中,其处理方式会被重新考虑。 - 不得通过非 HIDL 接口(包括但不限于 Binder、套接字、共享内存、文件等)进行框架-供应商通信。
- 系统分区必须足够大,以便容纳所有符合条件的 VNDK 库的两个副本,以及不符合条件的框架共享库的一个副本。
sepolicy
本部分中介绍的框架进程对应于 sepolicy 中的 coredomain
,而供应商进程对应于 non-coredomain
。例如,/dev/binder
只能在 coredomain
中被访问,而 /dev/vndbinder
只能在非 coredomain
中被访问。
类似政策会限制对系统分区和供应商分区上的共享库的访问。下表列出了访问不同类别的共享库时所需的权限:
类别 | 分区 | 可从 coredomain 访问 |
可从 非 coredomain 访问 |
---|---|---|---|
LL-NDK | 系统 | 是 | 是 |
LL-NDK-Private | 系统 | 是 | 是 |
VNDK-SP/VNDK-SP-Private | 系统 | 是 | 是 |
VNDK-SP-Ext | 供应商 | 是 | 是 |
VNDK | 系统 | 是 | 是 |
VNDK-Ext | 供应商 | 否 | 是 |
FWK-ONLY | 系统 | 是 | 否 |
FWK-ONLY-RS | 系统 | 是 | 否 |
SP-HAL | 供应商 | 是 | 是 |
SP-HAL-Dep | 供应商 | 是 | 是 |
VND-ONLY | 供应商 | 否 | 是 |
LL-NDK-Private 和 VNDK-SP-Private 必须从这两个域中都可访问,因为非 coredomain
会间接访问它们。同样,SP-HAL-Dep 必须可从 coredomain
访问,因为 SP-HAL 依赖于它。
same_process_hal_file 标签
供应商分区中包含下面几个库。请让这些库从 coredomain
和非 coredomain
都可访问。
- VNDK-SP-Ext,位于
/vendor/lib[64]/vndk-sp
- SP-HAL,位于
/vendor/lib[64]
或/vendor/lib[64]/hw
- SP-HAL-Dep,位于
/vendor/lib[64]
或/vendor/lib[64]/hw
将这些文件明确标记为 same_process_hal_file
,因为在默认情况下,从 coredomain
无法访问 vendor
分区中的任何内容。请向供应商专用的 file_contexts
文件中添加类似下面的代码行。
/vendor/lib(64)?/hw/libMySpHal\.so u:object_r:same_process_hal_file:s0 /vendor/lib(64)?/vndk-sp/libBase\.so u:object_r:same_process_hal_file:s0 /vendor/lib(64)?/libBaseInternal\.so u:object_r:same_process_hal_file:s0