이 페이지에서는 소프트웨어 정의 차량 (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의 타겟을 컴파일하고 실행하는 프로세스를 자세히 설명합니다.

그림 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를 BlueprintAndroid.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.에서 브라우저의 대상에 액세스하는 로그가 표시됩니다.

그림 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라고도 함)를 활용하여 권한이 있는 클러스터 앱으로 작동합니다.

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