启动过程是一个从启动 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。** 类预加载优化(指定要加载的类列表)。
-
软件包管理器
-
优化产品映像以仅包含正在使用的 APK。
-
-
**系统服务器。** 仅启动正在使用的系统服务。
为了帮助您进行优化,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 都移至内核启动映像,并静态链接所有依赖库。