Trang này cung cấp thông tin tổng quan về cách truy cập, tạo và chạy các thành phần An toàn màn hình, bao gồm cả trình kết xuất có tính sẵn sàng cao (HAR), DriverUI và trình giám sát an toàn, trên các nền tảng Xe được xác định bằng phần mềm (SDV).
Quyền truy cập vào mã
Phần này trình bày cách truy cập vào toàn bộ mã nguồn cho các thành phần An toàn cho màn hình HAR và DriverUI.
Trình kết xuất có khả năng hoạt động cao
Cơ sở mã cho trình kết xuất có tính sẵn sàng cao (HAR) có trong quy trình kiểm xuất kho lưu trữ chính tại packages/services/display_safety/.
Toàn bộ mã nguồn cho HAR có cấu trúc như sau:
- Khung: Chứa các giao diện khung cốt lõi cho nền tảng, kết xuất, hoạt ảnh và âm thanh.
- Tham chiếu: Chứa các cách triển khai dành riêng cho nền tảng đối với các giao diện khung, cũng như mã cho ứng dụng tham chiếu HAR và chuỗi công cụ an toàn (Trình biên dịch thiết kế, trình giám sát an toàn).
- Dịch vụ: Các dịch vụ dành riêng cho Android để gửi và nhận dữ liệu xe giữa các thành phần, cũng như các định nghĩa cho gói dữ liệu APEX.
- Prebuilts: Cung cấp trình bao bọc cho các tệp nhị phân được tạo sẵn, chẳng hạn như thư viện đồ hoạ Impeller.
Mã ứng dụng tham chiếu Harry nằm tại packages/services/display_safety/reference/harry_app.
Để biết cấu trúc thư mục chi tiết của HAR, hãy xem phần Cấu trúc mã an toàn hiển thị
Giám sát an toàn
Toàn bộ mã nguồn cho trình giám sát an toàn có trong kho lưu trữ chính tại packages/services/display_safety/reference/safety-monitor.
Mã giám sát an toàn có cấu trúc như sau:
main.rs: Tìm nạp các cấu phần phần mềm chỉ báo, khởi chạy máy chủ dữ liệu xe và các vòng lặp giám sát chỉ báo. Thông tin về khả năng hiển thị của đèn báo được so sánh với kết quả kiểm tra đèn báo, với kết quả được cung cấp bằng nhật ký SDV.Vehicle_data_server.rs: Máy chủ đăng ký dữ liệu xe, cập nhật khả năng hiển thị của đèn báo cho vòng lặp chính.Telltale_monitoring.rs: Chạy trong một vòng lặp, tìm nạp bản sao của screenbuffer bằng cách sử dụng screencap crate và kiểm tra các khu vực được chỉ định để tìm telltale. Sau đó, kết quả kiểm tra dấu hiệu sẽ được gửi đến vòng lặp chính.
DriverUI
DriverUI có trong cơ sở mã không đi kèm và bạn có thể truy cập vào cơ sở mã này từ nhánh 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
Để biết thêm thông tin về nguồn không đi kèm và nguồn Google, hãy xem phần Tích hợp các ứng dụng không đi kèm.
Xây dựng và chạy
Phần này trình bày chi tiết quy trình biên dịch và thực thi các mục tiêu cho HAR trong SDV Media và DriverUI trong SDV IVI (Đầu phát giải trí trong xe) để đạt được giải pháp cụm đầy đủ bằng SDV.

Hình 1. Hiển thị cấu trúc máy ảo kép về An toàn.
Tạo mục tiêu HAR và SDV Media
- Mục tiêu truyền thông cơ bản:
sdv_media_cf- Mô tả: Một mục tiêu chuyên biệt cho ngăn xếp nội dung nghe nhìn SDV, tạo điều kiện cho việc kiểm thử riêng biệt nhiều khung nội dung nghe nhìn.
- Vị trí thư mục:
device/google/sdv/
- Mục tiêu tích hợp HAR:
sdv_media_har_cf- Nội dung mô tả: Mục tiêu này tích hợp ngăn xếp nội dung nghe nhìn với HAR, thực thi SDV Media trên Cuttlefish.
- Vị trí thư mục:
device/google/sdv_dsplay_safety/ - Thực thi bản dựng:
# In the root of the Android source
source build/envsetup.sh
lunch sdv_media_har_cf-trunk_staging-userdebug
m -j
Tạo DriverUI
Từ nhánh ub-automotive-master, bạn có thể tạo các ứng dụng không có gói bằng cách sử dụng CommandLine hoặc AndroidStudio.
Trong Android Studio, hãy nhập tệp Gradle:
packages/apps/Car/libs/aaos-apps-gradle-project/build.gradle
Đây là dự án Gradle chính có tất cả các ứng dụng chưa được đóng gói, bao gồm cả DriverUI. Tạo dự án bằng Gradle:
# To build only DriverUI module of aaos-apps-gradle-project use
./gradlew :driver-ui:assemble
Sau khi tạo bản dựng thành công, tệp APK DriverUI sẽ có tại out/aaos-apps-gradle-build/driver-ui/outputs/apk/default/debug/
driver-ui-default-debug.apk
Mã DriverUI có tại packages/apps/Car/DriverUI
Lưu ý: DriverUI là một mô-đun con của dự án Gradle chính, vì vậy, tất cả các tác vụ Gradle đều được chạy bằng aaos-apps-gradle-project.
Tạo mục tiêu SDV IVI bằng DriverUI
- Mục tiêu cơ bản:
sdv_ivi_cf- Nội dung mô tả: Đây là mục tiêu SDV cơ bản cho IVI trên cấu trúc x86-64.
- Vị trí thư mục:
device/google/sdv/
Mục tiêu tích hợp DriverUI:
sdv_ivi_cf_ds- Nội dung mô tả: Mục tiêu này mở rộng cấu hình IVI cơ bản để kết hợp các thành phần An toàn cho màn hình. Mục tiêu này là điều kiện thiết yếu để xác thực các dịch vụ và hoạt động tương tác liên quan đến An toàn màn hình trong cụm đồng hồ.
- Vị trí thư mục:
device/google/sdv_dsplay_safety/ Thêm tệp nhị phân DriverUI: Sao chép
DriverUI.apkvàopackages/apps/Car/DriverUIPrebuiltcùng với tệp BlueprintAndroid.bp.# 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
Bạn nên thiết lập Android.bp để sử dụng tên mô-đun DriverUIPrebuilt và ghi đè 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,
},
}
Thực thi bản dựng:
# In the root of the Android source source build/envsetup.sh lunch sdv_ivi_cf_ds-trunk_staging-userdebug m -j
Triển khai mục tiêu
Sau khi hoàn tất quy trình xây dựng cho cả hai mục tiêu, các tiện ích Cuttlefish sẽ giúp khởi động các mục tiêu như mô tả trong phần này.
Triển khai SDV Media và HAR
Mục tiêu HAR được tạo bằng cấu hình sdv-media-config.json được xác định trước, được chỉ định trong device/google/sdv_media_cf.mk.
Lưu ý: SDV Media và SDV IVI đều được khởi chạy ở chế độ khởi động Unlocked cho cụm An toàn màn hình. Để biết thông tin chi tiết, hãy xem phần Chế độ khởi động 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"
Sau khi tạo, thiết bị đầu cuối sẽ hiện nhật ký để truy cập vào mục tiêu trong trình duyệt trên một cổng localhost: Point your browser to https://localhost:8443 to interact with the
device.

Hình 2. Hiển thị VM nội dung đa phương tiện SDV an toàn bằng HAR.
Triển khai SDV IVI và DriverUI
Mục tiêu SDV IVI DriverUI bắt đầu bằng cách sử dụng sdv-ivi-config.json hiện có được xác định trong device/google/sdv_ivi_cf.mk. Bạn cũng có thể chỉ định các tham số cấu hình khởi động bổ sung và kích thước màn hình phù hợp cho màn hình cụm.
# 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
Sau khi mục tiêu được khởi động, thiết bị đầu cuối sẽ hiện nhật ký để truy cập vào mục tiêu trong trình duyệt trên một cổng máy chủ cục bộ: Point your browser to https://localhost:8443 to
interact with the device.
Việc triển khai các mục tiêu SDV-IVI và DriverUI sẽ khởi động 2 màn hình: một cho hệ thống SDV-IVI và một cho DriverUI. DriverUI hoạt động như một ứng dụng cụm có đặc quyền, tận dụng lớp ClusterHomeManager (còn gọi là Cluster2).

Hình 3. Hiển thị SDV IVI VM an toàn bằng DriverUI.
Triển khai cụm máy ảo kép
Cuttlefish cung cấp khả năng chạy hai Máy ảo (VM) bằng cấu hình VM kép để đạt được lớp phủ hiển thị.

Hình 4. Hiển thị tổng quan về thành phần Hiển thị an toàn.
Bạn có thể chạy cấu hình máy ảo kép bằng cách sử dụng ds-toolkit có tại packages/services/display_safety/service/.
m ds_toolkit
ds_toolkit launch
Sau khi cấu hình được chạy, thiết bị đầu cuối sẽ hiện nhật ký để truy cập vào mục tiêu trong trình duyệt trên một cổng máy chủ cục bộ: Point your browser to https://localhost:8443 to
interact with the device.
Thao tác này sẽ khởi chạy cả hai mục tiêu Cuttlefish trong một cụm hoạt động đầy đủ với cả hai màn hình máy ảo được phủ lên nhau.

Hình 5. Hiển thị toàn bộ cụm An toàn với SDV Media và SDV IVI VM.
Thiết bị giám sát an toàn cho toà nhà
Theo mặc định, màn hình an toàn được tạo cho mục tiêu SDV Media:
# In the root of the Android source
source build/envsetup.sh
lunch sdv_media_har_cf-trunk_staging-userdebug
m -j
Trong thời gian chạy, trình giám sát an toàn sử dụng một nhóm mặc định gồm các cấu phần phần mềm trình biên dịch được tạo và đóng gói vào APEX cho màn hình cụm tham chiếu.
Bạn có thể tạo các cấu phần phần mềm mới bằng cách chạy har-design-compiler. Công cụ này chạy trên mục tiêu để tạo cấu phần phần mềm từ một bản thiết kế. Bạn nên chạy công cụ này, kéo các cấu phần phần mềm mới từ đích đến và tạo lại hình ảnh.
Theo mặc định, công cụ này được tạo và cài đặt trên mục tiêu.
# 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
Trình giám sát an toàn sẽ khởi động khi mục tiêu được khởi động. Màn hình giám sát an toàn sẽ chạy liên tục theo vòng lặp để xác minh các thành phần quan trọng về an toàn trên màn hình so với những gì được mong đợi bằng cách phân tích bộ nhớ đệm màn hình và các tín hiệu dữ liệu đến từ xe.
Bạn có thể xem nhật ký của tính năng giám sát an toàn bất cứ lúc nào:
adb logcat | grep har-safety-monitor