起動時間の管理

起動プロセスは、ブート ROM から始まり、ブートローダー、カーネル、initZygoteシステム サーバーが続く一連のアクションです(太字は 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。クラスのプリロードの最適化(読み込むクラスのリストを指定します)。

  • パッケージ マネージャー

  • システム サーバー。使用しているシステム サービスのみを開始します。

最適化を支援するために、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 の両方をカーネル ブートイメージに移動し、すべての依存ライブラリを静的にリンクする必要があります。