管理启动时间

启动过程是一个从启动 ROM 开始的动作链,接下来是引导加载程序、内核、**Init**、**Zygote** 和**系统服务器**(粗体表示 Android 特定的启动过程)。在汽车特定的启动过程中,诸如后视摄像头 (RVC) 之类的早期服务必须在内核启动期间启动。

顺序 组件 Android Android Automotive
1 启动 ROM 将引导加载程序的第一阶段加载到内部 RAM 中。
2 引导加载程序 初始化内存,验证安全性,并加载内核。
3 内核 设置中断控制器、内存保护、缓存和调度;启动用户空间进程。 **后视摄像头 (RVC)** 进程在内核启动早期启动。进程启动后,来自 VMCU 的 GPIO 触发 RVC 以在显示屏上显示。
4 Init 进程 解析 init.rc 脚本,挂载文件系统,启动 Zygote,启动系统进程。 **车辆 HAL (VHAL)** 在 init 阶段作为核心服务的一部分启动。可以根据 ServiceManager 移至更早的状态;需要删除对共享库(例如 init)的依赖项。
5 Zygote 为 Android 对象设置 Java 运行时和 init 内存。
6 系统服务器 系统中的第一个 Java 组件,启动核心 Android 服务。 **CarService** 在所有系统服务启动后启动。

优化启动时间

为了提高系统中的启动时间,请使用以下指南

  • **内核。** 仅加载正在使用的模块,并且仅初始化正在使用的硬件组件。

  • init.rc

    • 注意阻塞操作(服务与命令调用相比)。
    • 仅启动正在使用的内容。
    • 为服务设置正确的优先级。
  • **Zygote。** 类预加载优化(指定要加载的类列表)。

  • 软件包管理器

  • **系统服务器。** 仅启动正在使用的系统服务。

为了帮助您进行优化,Google 提供了以下工具

  • 使用 packages/services/Car/tools/bootanalyze/bootanalyze.py 分析 logcat 和 dmesg 日志。

  • 使用 packages/services/Car/tools/bootio/ 记录启动期间进程的 I/O。您必须使用特定标志编译内核(请参阅 README.md 文件)。

尽早启动服务

在启动序列中,某些服务可能会在 Android 开始启动之前启动。

后视摄像头

后视摄像头 (RVC) 应在内核中处理。当车辆换入倒档时,VMCU 会通知原生内核进程,之后原生内核进程会将 RVC 图像显示到显示屏上。车辆 HAL 可以使用 hardware/libhardware/include/hardware/vehicle_camera.h 控制 RVC。

车辆 HAL (VHAL)

某些系统可能需要在启动序列的早期阶段读取和缓冲 CAN 数据(例如,车速、档位状态),同时等待用户空间服务启动(这发生在启动序列的稍后阶段)。这种情况要求 VNS 以及 HAL 和 CAN 控制器非常早地启动,通常在几秒钟内。

  • 可以快速挂载 /system 的系统可以直接尽早启动 service manager 和 VNS。

  • 无法快速挂载 /system 的系统必须将 service manager 和 VNS 都移至内核启动映像,并静态链接所有依赖库。