surfaceflinger.rc是如何在init.rc加载过程中加载进去的?

17 阅读2分钟

在 Android 系统中,surfaceflinger.rc 作为管理 SurfaceFlinger 服务(负责图形合成与显示管理的核心服务)的配置文件,其加载过程依赖于 init 进程对特定目录下 .rc 文件的自动扫描机制,具体流程如下:

1. surfaceflinger.rc 的存放路径

SurfaceFlinger 是 Android 系统的核心服务(属于系统基础组件),其 .rc 配置文件通常被编译安装到 /system/etc/init/ 目录下。
这一目录是 init 进程启动时自动扫描并加载 .rc 文件的核心路径之一(系统级服务的配置文件默认存放于此)。

2. init 进程对 .rc 文件的扫描与加载逻辑

init 进程启动后,会按固定顺序扫描并加载多个分区下的 .rc 文件目录,其中优先处理 /system/etc/init/ 目录(系统核心服务配置)。具体步骤:

  • init 进程初始化时,会解析主配置文件 init.rc(位于根目录 /),但主 init.rc 并不直接 import surfaceflinger.rc
  • 随后,init 进程会主动遍历预设的 .rc 文件目录(包括 /system/etc/init//vendor/etc/init/ 等),对目录中所有 .rc 文件按文件名顺序依次加载(文件名不影响加载,仅按目录优先级处理)。

由于 surfaceflinger.rc 位于 /system/etc/init/ 目录,因此会被 init 进程自动扫描到并加载解析。

3. 加载时机与依赖

surfaceflinger.rc 的加载时机早于 SurfaceFlinger 服务的启动:

  • init 进程在 early-initinit 阶段之间完成所有 .rc 文件的加载(包括 surfaceflinger.rc)。
  • 加载后,surfaceflinger.rc 中定义的 service 块(SurfaceFlinger 服务)和 on 块(启动触发条件)会被解析并存储到 init 进程的配置数据库中。
  • 当系统启动到特定阶段(如 on post-fson boot),满足 surfaceflinger.rc 中定义的触发条件(如 class_start core)时,SurfaceFlinger 服务才会被实际启动。

总结

surfaceflinger.rc 并非通过主 init.rcimport 指令显式加载,而是依赖 init 进程对 /system/etc/init/ 目录的自动扫描机制。由于其存放路径属于 init 进程默认扫描的系统级配置目录,因此会在系统启动早期被自动加载解析,为后续 SurfaceFlinger 服务的启动提供配置基础。