디스플레이 안전 시작하기

이 페이지에서는 소프트웨어 정의 차량 (SDV) 플랫폼 전반에서 고가용성 렌더러 (HAR), DriverUI, 안전 모니터를 비롯한 디스플레이 안전 구성요소에 액세스하고, 빌드하고, 실행하는 방법을 간략하게 설명합니다.

코드 액세스

이 섹션에서는 HARDriverUI 디스플레이 안전 구성요소의 코드베이스에 액세스하는 방법을 설명합니다.

고가용성 렌더러

고가용성 렌더러 (HAR)의 코드베이스는 packages/services/display_safety/기본 저장소 체크아웃의 일부로 제공됩니다.

HAR의 코드베이스는 다음과 같이 구성됩니다.

  • 프레임워크: 플랫폼, 렌더링, 애니메이션, 오디오의 핵심 프레임워크 인터페이스를 포함합니다.
  • 참조: 프레임워크 인터페이스의 플랫폼별 구현과 HAR 참조 앱 코드, 안전 도구 모음 (설계 컴파일러, 안전 모니터)을 포함합니다.
  • 서비스: 구성요소 간에 차량 데이터를 전송하고 수신하는 Android 전용 서비스와 APEX 데이터 패키지 정의입니다.
  • 미리 빌드: Impeller 그래픽 라이브러리와 같은 미리 빌드된 바이너리용 래퍼를 제공합니다.

Harry 참조 앱 코드는 packages/services/display_safety/reference/harry_app에 있습니다.

HAR의 자세한 디렉터리 구조는 안전 코드 구조 표시를 참고하세요.

안전 모니터

안전 모니터 코드베이스는 packages/services/display_safety/reference/safety-monitor에서 기본 저장소 체크아웃의 일부로 제공됩니다.

안전 모니터 코드는 다음과 같이 구성됩니다.

  • main.rs: 경고등 아티팩트를 가져오고 차량 데이터 서버와 경고등 모니터링 루프를 초기화합니다. 경고등 가시성에 관한 정보가 경고등 검사 결과와 비교되며, 결과는 SDV 로그를 사용하여 제공됩니다.
  • Vehicle_data_server.rs: 차량 데이터를 구독하고 기본 루프의 경고등 가시성을 업데이트하는 서버입니다.
  • Telltale_monitoring.rs: 루프에서 실행되며, screencap crate를 사용하여 screenbuffer의 사본을 가져오고 지정된 영역에서 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 내 SDV 미디어와 SDV 차량용 인포테인먼트 (IVI) 내 DriverUI의 타겟을 컴파일하고 실행하여 SDV로 전체 클러스터 솔루션을 달성하는 프로세스를 자세히 설명합니다.

게스트 VM

그림 1. 안전 이중 VM 구조를 표시합니다.

HAR 및 SDV 미디어 타겟 빌드

  • 기본 미디어 타겟: sdv_media_cf
    • 설명: 다양한 미디어 프레임워크의 격리된 테스트를 지원하는 SDV 미디어 스택 전용 타겟입니다.
    • 디렉터리 위치: device/google/sdv/
  • HAR 통합 타겟: sdv_media_har_cf
    • 설명: 이 타겟은 미디어 스택을 HAR과 통합하여 Cuttlefish에서 SDV 미디어를 실행합니다.
    • 디렉터리 위치: 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 스튜디오에서 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_dsplay_safety/
    • DriverUI 바이너리 추가: 청사진 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 미디어 및 HAR 배포

HAR 타겟은 device/google/sdv_media_cf.mk 내에 지정된 사전 정의된 sdv-media-config.json 구성을 사용하여 생성됩니다.

참고: SDV 미디어와 SDV IVI는 모두 디스플레이 안전 클러스터의 Unlocked 부팅 모드에서 실행됩니다. 자세한 내용은 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 미디어 VM의 HAR

그림 2. HAR을 사용하여 안전 SDV 미디어 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 타겟의 배포는 두 디스플레이를 초기화합니다. 하나는 SDV-IVI 시스템용이고 다른 하나는 DriverUI용입니다. DriverUI는 권한이 있는 클러스터 앱으로 작동하며 ClusterHomeManager 클래스 (Cluster2라고도 함)를 활용합니다.

SDV-IVI VM의 DriverUI

그림 3. DriverUI를 사용하여 안전 SDV IVI VM을 표시합니다.

이중 VM 클러스터 배포

Cuttlefish는 이중 VM 구성을 사용하여 두 개의 가상 머신 (VM)을 실행하여 디스플레이 오버레이를 달성하는 기능을 제공합니다.

디스플레이 컴포지션

그림 4. 안전 디스플레이 구성 개요를 표시합니다.

packages/services/display_safety/service/에서 제공되는 ds-toolkit를 사용하여 이중 VM 구성을 실행할 수 있습니다.

m ds_toolkit
ds_toolkit launch

구성이 실행되면 터미널에 localhost 포트의 브라우저에서 타겟에 액세스하는 로그가 표시됩니다. Point your browser to https://localhost:8443 to interact with the device.

이렇게 하면 가상 머신 디스플레이가 모두 오버레이된 완전히 작동하는 클러스터에서 두 Cuttlefish 타겟이 모두 실행됩니다.

안전 전체 클러스터 표시

그림 5. SDV 미디어 및 SDV IVI VM으로 안전 전체 클러스터 표시

건물 안전 모니터

안전 모니터는 다음 SDV 미디어 타겟 중 하나에 대해 기본적으로 빌드됩니다.

# 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