管理启动时间

启动过程涉及一系列操作,首先是启动 ROM,接着是引导加载程序、内核、InitZygote系统服务器(粗体表示 Android 特有启动过程)。在汽车特有的启动过程中,后视摄像头等早期服务必须在内核启动期间启动。

顺序 组件 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,则只需启动服务管理器,然后在早期启动 VNS。

  • 如果系统无法快速装载 /system,则必须同时将服务管理器和 VNS 移至内核启动映像,然后静态关联所有依赖库。