ディスプレイの安全性機能を使ってみる

このページでは、ソフトウェア定義車両(SDV)プラットフォーム全体で、高可用性レンダラ(HAR)、DriverUI、安全モニターなどのディスプレイ セーフティ コンポーネントにアクセス、ビルド、実行する方法の概要を説明します。

コードアクセス

このセクションでは、HAR と DriverUI のディスプレイ セーフティ コンポーネントのコードベースにアクセスする方法について説明します。

高可用性レンダラ

高可用性レンダラ(HAR)のコードベースは、packages/services/display_safety/ のメイン リポジトリ チェックアウトの一部として入手できます。

HAR のコードベースは次のように構成されています。

  • フレームワーク: プラットフォーム、レンダリング、アニメーション、オーディオのコア フレームワーク インターフェースが含まれています。
  • リファレンス: フレームワーク インターフェースのプラットフォーム固有の実装、HAR リファレンス アプリのコード、安全ツールチェーン(Design Compiler、安全モニター)が含まれています。
  • サービス: コンポーネント間で車両データを送受信するための Android 固有のサービスと、APEX データ パッケージの定義。
  • Prebuilts: Impeller グラフィック ライブラリなどのビルド済みバイナリのラッパーを提供します。

Harry リファレンス アプリのコードは packages/services/display_safety/reference/harry_app にあります。

HAR の詳細なディレクトリ構造については、ディスプレイ セーフティ コードの構造をご覧ください。

安全モニター

安全モニターのコードベースは、packages/services/display_safety/reference/safety-monitor のメイン リポジトリ チェックアウトの一部として利用できます。

安全モニターのコードは次のように構成されています。

  • main.rs: 警告灯アーティファクトを取得し、車両データサーバーと警告灯モニタリング ループを初期化します。telltale の視認性に関する情報は、telltale の検査結果と比較され、結果は SDV ログを使用して提供されます。
  • Vehicle_data_server.rs: 車両 データをサブスクライブし、メインループの警告灯の表示を更新するサーバー。
  • Telltale_monitoring.rs: ループで実行され、screencap クレートを使用してスクリーン バッファのコピーを取得し、指定された領域でテルテールを検査します。telltale 検査の結果はメインループに送信されます。

DriverUI

DriverUI は、ub-automotive-master ブランチからアクセスできる、バンドルされていないコードベースの一部として利用できます。

mkdir ub-automotive-master && cd ub-automotive-master
repo init -u https://android.googlesource.com/platform/manifest -b ub-automotive-master
repo sync -cq

バンドルされていないアプリと Google ソースの詳細については、バンドルされていないアプリを統合するをご覧ください。

ビルドと実行

このセクションでは、SDV Media 内の HAR と SDV 車載インフォテインメント(IVI)内の DriverUI のターゲットをコンパイルして実行し、SDV で完全なクラスタ ソリューションを実現するプロセスについて詳しく説明します。

ゲスト VM

図 1. ディスプレイ セーフティのデュアル VM 構造。

HAR と SDV のメディア ターゲットを構築する

  • ベース メディア ターゲット: sdv_media_cf
    • 説明: SDV メディア スタック専用のターゲット。さまざまなメディア フレームワークの分離テストを容易にします。
    • ディレクトリの場所: device/google/sdv/
  • HAR 統合ターゲット: sdv_media_har_cf
    • 説明: このターゲットは、メディア スタックを HAR と統合し、Cuttlefish で SDV Media を実行します。
    • ディレクトリの場所: device/google/sdv_display_safety/
    • ビルドの実行:
# In the root of the Android source
source build/envsetup.sh
lunch sdv_media_har_cf-aosp_current-userdebug
m -j

DriverUI をビルドする

ub-automotive-master ブランチから、CommandLine または AndroidStudio を使用して、バンドルされていないアプリをビルドできます。

Android Studio で、Gradle ファイルをインポートします。 packages/apps/Car/libs/aaos-apps-gradle-project/build.gradle

これは、DriverUI を含むすべてのバンドルされていないアプリを含むメインの Gradle プロジェクトです。Gradle を使用してプロジェクトをビルドします。

# To build only DriverUI module of aaos-apps-gradle-project use
./gradlew :driver-ui:assemble

ビルドが成功すると、DriverUI APK が out/aaos-apps-gradle-build/driver-ui/outputs/apk/default/debug/ driver-ui-default-debug.apk で利用可能になります。

DriverUI コードは packages/apps/Car/DriverUI で入手できます。

注: DriverUI はメインの Gradle プロジェクトのサブモジュールであるため、すべての Gradle タスクは aaos-apps-gradle-project を使用して実行されます。

DriverUI を使用して SDV IVI ターゲットをビルドする

  • ベース ターゲット: sdv_ivi_cf
    • 説明: x86-64 アーキテクチャの IVI の基本的な SDV ターゲットとして機能します。
    • ディレクトリの場所: device/google/sdv/
  • DriverUI 統合ターゲット: sdv_ivi_cf_ds

    • 説明: このターゲットは、ベースの IVI 構成を拡張して、ディスプレイ セーフティ コンポーネントを組み込みます。このターゲットは、インストルメント クラスタ内のディスプレイ セーフティ サービスとインタラクションの検証に不可欠です。
    • ディレクトリの場所: device/google/sdv_display_safety/
    • DriverUI バイナリを追加する: DriverUI.apk を packages/apps/Car/DriverUIPrebuilt にコピーし、Blueprint Android.bp ファイルもコピーします。

      # Create a blueprint file, contents of this file are shown in the next step
      touch /path/to/aosp_repo_root/packages/apps/Car/DriverUIPrebuilt/Android.bp
      # Copy DriverUI.apk built
      cp /path/to/ub-automotive-master/out/aaos-apps-gradle-build/driver-ui/outputs/apk/default/debug/driver-ui-default-debug.apk /path/to/aosp_repo_root/packages/apps/Car/DriverUIPrebuilt/DriverUI.apk
      

Android.bp は、モジュール名 DriverUIPrebuilt を使用し、DriverUIStubApp をオーバーライドするように設定する必要があります。

android_app_import {
    name: "DriverUIPrebuilt",
    overrides: ["DriverUIStubApp"],
    apk: "DriverUI.apk",
    privileged: true,
    product_specific: true,
    certificate: "platform",
    required: ["allowed_privapp_com.android.car.driverui"],

    optional_uses_libs: [
        "androidx.window.extensions",
        "androidx.window.sidecar",
    ],
    enforce_uses_libs: false,
    dex_preopt: {
        enabled: false,
    },
}
  • ビルドの実行:

    # In the root of the Android source
    source build/envsetup.sh
    lunch sdv_ivi_cf_ds-aosp_current-userdebug
    m -j
    

ターゲット デプロイ

両方のターゲットのビルドプロセスが正常に完了すると、Cuttlefish ユーティリティは、このセクションで説明されているようにターゲットの起動を支援します。

SDV メディアと高解像度(HAR)のデプロイ

HAR ターゲットは、device/google/sdv_media_cf.mk 内で指定されている事前定義の sdv-media-config.json 構成を使用して作成されます。

注: SDV Media と SDV IVI はどちらも、ディスプレイ セーフティ クラスタの Unlocked ブートモードで起動されます。詳細については、SDV 起動モードをご覧ください。

# In the root of the Android source
source build/envsetup.sh
lunch sdv_media_har_cf-aosp_current-userdebug
cvd create --extra_bootconfig_args="androidboot.sdv.boot_mode=unlocked androidboot.sdv.instance_name=instance1 androidboot.virt.address=3"

作成されると、ターミナルに、localhost ポート Point your browser to https://localhost:8443 to interact with the device. でブラウザのターゲットにアクセスするためのログが表示されます。

SDV Media VM の HAR

図 2. HAR を使用して Safety SDV Media VM を表示します。

SDV IVI と DriverUI のデプロイ

SDV IVI DriverUI ターゲットは、device/google/sdv_ivi_cf.mk で定義されている既存の sdv-ivi-config.json を使用して起動します。追加のブート構成パラメータと、クラスタ画面に適したディスプレイ サイズを指定することもできます。

# In the root of the Android source
source build/envsetup.sh
lunch sdv_ivi_cf_ds-aosp_current-userdebug
cvd create --extra_bootconfig_args="androidboot.sdv.boot_mode=unlocked androidboot.sdv.instance_name=instance2 androidboot.virt.address=4" --display1=width=1920,height=720

ターゲットが初期化されると、ターミナルに、localhost ポート(Point your browser to https://localhost:8443 to interact with the device.)でブラウザからターゲットにアクセスするためのログが表示されます。

SDV-IVI ターゲットと DriverUI ターゲットをデプロイすると、2 つのディスプレイ(SDV-IVI システム用と DriverUI 用)が初期化されます。DriverUI は、ClusterHomeManager クラス(Cluster2 とも呼ばれます)を利用して、特権付きクラスタアプリとして動作します。

SDV-IVI VM の DriverUI

図 3. DriverUI を使用して Safety SDV IVI VM を表示します。

デュアル VM クラスタのデプロイ

Cuttlefish には、デュアル VM 構成を使用して 2 つの仮想マシン(VM)を起動し、ディスプレイ オーバーレイを実現する機能があります。

ディスプレイの合成

図 4. ディスプレイの安全性のディスプレイ構成の概要。

デュアル VM 構成は、packages/services/display_safety/service/ で入手可能な ds_toolkit を使用して起動できます。

m ds_toolkit
ds_toolkit launch

構成が起動すると、ターミナルに、localhost ポート Point your browser to https://localhost:8443 to interact with the device. でブラウザのターゲットにアクセスするためのログが表示されます。

これにより、両方の仮想マシン ディスプレイがオーバーレイされた、完全に動作するクラスタで両方の Cuttlefish ターゲットが起動します。

ディスプレイの安全(フルクラスタ)

図 5. SDV Media と SDV IVI VM を使用して、ディスプレイ セーフティ フルクラスタを表示します。

建物の安全監視

安全モニターは、デフォルトで次のいずれかの SDV メディア ターゲット用に構築されます。

# In the root of the Android source
source build/envsetup.sh
lunch sdv_media_har_cf-aosp_current-userdebug
m -j

実行時に、安全モニターは、リファレンス クラスタ ディスプレイ用に生成され、APEX にパッケージ化されたコンパイラ アーティファクトのデフォルト セットを使用します。

har-design-compiler を実行すると、新しいアーティファクトが生成されることがあります。このツールは、ターゲット上で実行され、設計からアーティファクトを生成します。ツールを実行し、ターゲットから新しいアーティファクトを pull して、イメージを再ビルドすることをおすすめします。このツールは、デフォルトでビルドされ、ターゲットにインストールされます。

# Run the compiler on the target
adb shell har_design_compiler -c </path/to/artifacts> -o /data/local/tmp/
# Pull the artifacts to the local filesystem
adb pull data/local/tmp/artifacts services/harry-prebuilt/data/assets/
# Rebuild the image
m -j

安全モニターは、ターゲットが起動されると初期化されます。安全モニターはループ内で継続的に実行され、画面バッファと受信車両データ信号を分析して、画面上の安全上重要な要素を想定される要素と照合します。

安全モニターのログはいつでも確認できます。

adb logcat | grep har-safety-monitor