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

このページでは、 ソフトウェア定義車両(SDV)プラットフォーム全体で、高可用性レンダラ(HAR)DriverUI、および安全モニターなどの Display Safety コンポーネントにアクセス、ビルド、実行するための概要について説明します。

コードへのアクセス

このセクションでは、HARDriverUI の Display Safety コンポーネントのコードベースにアクセスする方法について説明します。

高可用性レンダラ

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

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

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

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

HAR のディレクトリ構造の詳細については、Display Safety のコード構造をご覧ください

安全モニター

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

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

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

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. Display Safety のデュアル VM 構造。

HAR と SDV Media のターゲットをビルドする

  • ベース メディア ターゲット: sdv_media_cf
    • 説明: SDV メディア スタック専用のターゲットで、さまざまなメディア フレームワークの分離テストを容易にします。
    • ディレクトリの場所: device/google/sdv/
  • HAR 統合ターゲット: sdv_media_har_cf
    • 説明: このターゲットは、メディア スタックを HAR と統合し、Cuttlefish で SDV Media を実行します。
    • ディレクトリの場所: device/google/sdv_dsplay_safety/
    • ビルドの実行:
# In the root of the Android source
source build/envsetup.sh
lunch sdv_media_har_cf-trunk_staging-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 構成を拡張して Display Safety コンポーネントを組み込みます。このターゲットは、インストルメント クラスタ内の Display Safety サービスとインタラクションの検証に不可欠です。
    • ディレクトリの場所: device/google/sdv_dsplay_safety/
    • DriverUI バイナリを追加する: Blueprint Android.bp ファイルとともに DriverUI.apkpackages/apps/Car/DriverUIPrebuilt にコピーします。

      # 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-trunk_staging-userdebug
    m -j
    

ターゲット デプロイ

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

SDV Media と HAR のデプロイ

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

: SDV Media と SDV IVI はどちらも、Unlocked ブートモードで Display Safety クラスタの起動されます。詳細については、SDV ブートモードをご覧ください。

# In the root of the Android source
source build/envsetup.sh
lunch sdv_media_har_cf-trunk_staging-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 を使用した Display 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-trunk_staging-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 つのディスプレイが初期化されます。1 つは SDV-IVI システム用、もう 1 つは DriverUI 用です。DriverUI は、 クラスCluster2 とも呼ばれます)を活用して、特権クラスタ アプリとして動作します。ClusterHomeManager

SDV-IVI VM の DriverUI

図 3. DriverUI を使用した Display Safety SDV IVI VM。

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

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

ディスプレイの合成

図 4. Display Safety のディスプレイ構成の概要。

デュアル 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 を使用した Display Safety の完全なクラスタ。

安全モニターのビルド

安全モニターは、デフォルトで SDV Media ターゲット用にビルドされます。

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

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

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

# 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