ブート プロセスは、ブート ROM から始まり、ブートローダー、カーネル、 Init 、 Zygote 、およびシステム サーバーが続く一連のアクションです (太字は Android 固有のブート プロセスを示します)。自動車固有のブート プロセスでは、リアビュー カメラ (RVC) などの初期サービスがカーネルのブート中に開始される必要があります。
注文 | 成分 | アンドロイド | アンドロイドオートモーティブ |
---|---|---|---|
1 | ブートROM | ブート ローダーの最初のステージを内部 RAM にロードします。 | |
2 | ブートローダー | メモリを初期化し、セキュリティを検証し、カーネルをロードします。 | |
3 | カーネル | 割り込みコントローラ、メモリ保護、キャッシュ、およびスケジューリングをセットアップします。ユーザー空間プロセスを起動します。 | バックビュー カメラ (RVC)プロセスは、カーネル起動の早い段階で開始されます。プロセスが起動すると、VMCU からの GPIO が RVC をトリガーしてディスプレイに表示します。 |
4 | 初期化プロセス | init.rc スクリプトを解析し、ファイル システムをマウントし、Zygote を起動し、システム プロセスを起動します。 | Vehicle HAL (VHAL) は、コア サービスの一部として初期フェーズ中に開始されます。 ServiceManager に応じて以前の状態に移行できます。共有ライブラリ (init など) への依存関係を削除する必要があります。 |
5 | 受精卵 | Android オブジェクトの Java ランタイムと初期メモリをセットアップします。 | |
6 | システムサーバー | システム内の最初の Java コンポーネントは、コア Android サービスを開始します。 | CarService は、すべてのシステム サービスが開始された後に開始されます。 |
起動時間を最適化する
システムの起動時間を短縮するには、次のガイドラインに従ってください。
カーネル。使用中のモジュールのみをロードし、使用中のハードウェア コンポーネントのみを初期化します。
init.rc
- 操作のブロックに注意してください (サービスとコマンド呼び出しの比較)。
- 使用するものだけを開始します。
- サービスに正しい優先順位を設定します。
受精卵。クラスのプリロードの最適化 (ロードするクラスのリストを指定します)。
パッケージマネージャー
使用中の 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 の両方をカーネル ブート イメージに移動し、すべての依存ライブラリを静的にリンクする必要があります。