디스플레이 안전 시작하기

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

코드 액세스

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

고가용성 렌더러

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

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

  • 프레임워크: 플랫폼, 렌더링, 애니메이션, 오디오의 핵심 프레임워크 인터페이스를 포함합니다.
  • 참조: 프레임워크 인터페이스의 플랫폼별 구현과 HAR 참조 앱의 코드, 안전 도구 모음 (Design Compiler, 안전 모니터)이 포함되어 있습니다.
  • 서비스: 구성요소 간에 차량 데이터를 주고받기 위한 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 크레이트를 사용하여 화면 버퍼의 사본을 가져오고 지정된 영역에서 텔테일을 검사합니다. 그런 다음 텔테일 검사 결과가 기본 루프로 전송됩니다.

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 미디어 내 HAR과 SDV 차량용 인포테인먼트 (IVI) 내 DriverUI의 타겟을 컴파일하고 실행하는 프로세스를 자세히 설명합니다.

게스트 VM

그림 1. 디스플레이 안전 이중 VM 구조

HAR 및 SDV 미디어 타겟 빌드

  • 기본 미디어 타겟: sdv_media_cf
    • 설명: SDV 미디어 스택의 전용 타겟으로, 다양한 미디어 프레임워크의 격리된 테스트를 지원합니다.
    • 디렉터리 위치: device/google/sdv/
  • HAR 통합 타겟: sdv_media_har_cf
    • 설명: 이 타겟은 미디어 스택을 HAR과 통합하여 Cuttlefish에서 SDV 미디어를 실행합니다.
    • 디렉터리 위치: 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 스튜디오에서 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를 Blueprint Android.bp 파일과 함께 packages/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-aosp_current-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-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 미디어 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-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 타겟을 배포하면 두 개의 디스플레이가 초기화됩니다. 하나는 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-aosp_current-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