부팅 프로세스는 부트 ROM에서 시작된 작업의 체인이며, 부트로더, 커널, Init, Zygote, 시스템 서버가 뒤따라 나옵니다(굵게 표시된 부분은 Android 관련 부팅 프로세스임). 자동차 관련 부팅 프로세스에서는 초기 서비스(예: 후방 카메라)가 커널 부팅 중에 시작해야 합니다.
순서 | 구성요소 | Android | Android Automotive |
---|---|---|---|
1 | Boot ROM | 부트로더의 첫 번째 단계를 내부 RAM에 로드합니다. | |
2 | 부트로더 | 메모리를 초기화하고 보안을 확인하며 커널을 로드합니다. | |
3 | 커널 | 인터럽트 컨트롤러, 메모리 보호, 캐시 및 예약을 설정하고 사용자 공간 프로세스를 실행합니다. | 후방 카메라(RVC) 프로세스는 커널 부팅 초기에 시작됩니다. 프로세스가 실행되면 VMCU의 GPIO에서 RVC를 트리거하여 화면에 표시합니다. |
4 | Init 프로세스 | init.rc 스크립트를 파싱하고, 파일 시스템을 마운트하며, zygote 및 시스템 프로세스를 시작합니다. |
차량 HAL(VHAL)은 핵심 서비스의 일부로 init 단계에서 시작됩니다. ServiceManager에 따라 초기 상태로 이동할 수 있습니다. 공유 라이브러리(예: init)의 종속 항목을 삭제해야 합니다. |
5 | Zygote | Android 객체의 자바 런타임 및 init 메모리를 설정합니다. | |
6 | 시스템 서버 | 시스템의 첫 번째 자바 구성요소로, 핵심 Android 서비스를 시작합니다. | CarService는 모든 시스템 서비스가 시작된 후에 시작됩니다. |
부팅 시간 최적화
시스템의 부팅 시간을 개선하려면 다음 가이드라인을 따르세요.
-
Kernel. 사용 중인 모듈만 로드하고 사용 중인 하드웨어 구성요소만 초기화합니다.
-
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 모두를 커널 부팅 이미지로 이동하고 모든 종속 라이브러리를 정적으로 연결해야 합니다.