이 페이지에서는 소프트웨어 정의 차량 (SDV) 플랫폼 전반에서 고가용성 렌더러 (HAR), DriverUI, 안전 모니터를 비롯한 디스플레이 안전 구성요소에 액세스하고, 빌드하고, 실행하는 방법을 간략하게 설명합니다.
코드 액세스
이 섹션에서는 HAR 및 DriverUI 디스플레이 안전 구성요소의 코드베이스에 액세스하는 방법을 설명합니다.
고가용성 렌더러
고가용성 렌더러 (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로 전체 클러스터 솔루션을 달성하는 프로세스를 자세히 설명합니다.

그림 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.apk를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-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.

그림 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라고도 함)를 활용합니다.

그림 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