启动过程涉及一系列操作,首先是启动 ROM,接着是引导加载程序、内核、Init、Zygote 和系统服务器(粗体表示 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:类预加载优化(用于指定要加载的类的列表)。
-
软件包管理器
-
优化产品图片以仅包含正在使用的 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
,则只需启动服务管理器,然后在早期启动 VNS。 -
如果系统无法快速装载
/system
,则必须同时将服务管理器和 VNS 移至内核启动映像,然后静态关联所有依赖库。