起動プロセスは、ブート 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 の両方をカーネル ブートイメージに移動し、すべての依存ライブラリを静的にリンクする必要があります。