目录、规则和 sepolicy

本页面将介绍运行 Android O 的设备的目录布局,以及 VNDK 规则和关联的 sepolicy。

目录布局

退化目录布局由以下目录组成:

  • /system/lib[64] 包含所有框架共享库,具体包括 LL-NDK、SP-NDK、VNDK 和框架专用库(包括 LL-NDK-Indirect、SP-NDK-Indirect 以及一些与 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 O 中并未严格地强制实施此规则,但未来版本中会这么做)。
  • 供应商进程不得从系统分区加载非 LL-NDK 库、非 SP-NDK 库、非 VNDK-SP 库和非 VNDK 库(Android O 中并未严格地强制实施此规则,但未来版本中会这么做)。
  • 注意:要想从未来版本(比 Android O 更高的版本)的 Framework-Only OTA 中受益,就不得在搭载 Android O 的设备中违反此规则。

  • 已安装的 VNDK 库必须是由 Google 定义的合格 VNDK 库的子集。
  • SP-HAL 和 SP-HAL-Dep 的外部依赖项必须仅限于 LL-NDK 库、SP-NDK 库或由 Google 定义的 VNDK-SP 库。
    • SP-HAL 共享库的依赖项必须仅限于 LL-NDK 库、SP-NDK 库、SP-NDK 库、由 Google 定义的 VNDK-SP 库、其他 SP-HAL 库和/或可标记为 SP-HAL-Dep 库的其他供应商共享库。
    • 只有当供应商共享库不是 AOSP 库,且其依赖项仅限于 LL-NDK 库、SP-NDK 库、由 Google 定义的 VNDK-SP 库、SP-HAL 库和/或其他 SP-HAL-Dep 库时,才可标记为 SP-HAL-Dep 库。
  • VNDK-SP 必须保持独立。在 Android O 中,libRS_internal.so 会被系统以特殊方式处理,但在未来版本中,其处理方式会被重新考虑。
  • 不得通过非 HIDL 接口(包括但不限于 Binder、套接字、共享内存、文件等)进行框架-供应商通信。
  • 系统分区必须足够大,以便容纳所有符合条件的 VNDK 库的两个副本,以及不符合条件的框架共享库的一个副本。

sepolicy

本部分中介绍的框架进程对应于 sepolicy 中的 coredomain,而供应商进程对应于 non-coredomain。例如,/dev/binder 只能在 coredomain 中被访问,而 /dev/vndbinder 只能在非 coredomain 中被访问。

类似政策会限制对系统分区和供应商分区上的共享库的访问。下表列出了访问不同类别的共享库时所需的权限:

类别 分区 是否可从
coredomain 访问
是否可从
非 coredomain 访问
LL-NDK 系统
LL-NDK-Indirect 系统
SP-NDK 系统
SP-NDK-Indirect 系统
VNDK-SP/VNDK-SP-Indirect/VNDK-SP-Indirect-Private 系统
VNDK-SP-Ext/VNDK-SP-Indirect-Ext 供应商
VNDK 系统
VNDK-Ext 供应商
FWK-ONLY 系统
FWK-ONLY-RS 系统
SP-HAL 供应商
SP-HAL-Dep 供应商
VND-ONLY 供应商

LL-NDK-Indirect、SP-NDK-Indirect、VNDK-SP-Indirect 和 VNDK-SP-Indirect-Private 必须从这两个域中都可访问,因为非 coredomain 会间接访问这些库。同样,SP-HAL-Dep 必须可从 coredomain 访问,因为 SP-HAL 依赖该域。