Hầu hết các thay đổi cần thiết để hỗ trợ VirtIO trong AAOS đều liên quan đến các thay đổi ở cấp triển khai HAL trở xuống trong Hạt nhân Android chung. Khung Android giao tiếp với một HAL chung không phân biệt phần cứng bằng cách sử dụng trình điều khiển VirtIO trong nhân máy ảo khách AAOS. Nhân này giao tiếp với các thiết bị VirtIO ở phía máy chủ bằng giao thức VirtIO. Các thiết bị VirtIO ở phía máy chủ có thể truy cập vào phần cứng thực bằng cách sử dụng trình điều khiển thiết bị dành riêng cho SoC.
Việc giao tiếp giữa trình điều khiển VirtIO và thiết bị VirtIO diễn ra thông qua virtqueue
, đây là các vùng đệm vòng giống như DMA của danh sách thu thập dữ liệu phân tán.
Bạn có thể sử dụng một số phương thức truyền tải, chẳng hạn như MMIO hoặc PCI để trao đổi thông điệp VirtIO giữa các máy ảo.
Trong một số trường hợp, vsock
đã được tận dụng để giao tiếp giữa các máy ảo.
Giao tiếp HAL của xe, Điều khiển âm thanh và Trạng thái kết xuất được hỗ trợ bằng cách sử dụng kết nối với tác nhân ngang hàng trên một máy ảo riêng biệt qua giao diện vsock
.
GRPC-vsock
được dùng để truy cập vào các hệ thống con không được chuẩn hoá này.
GRPC trong cây nguồn Android đã được sửa đổi để hoạt động với vsock
với định dạng địa chỉ là vsock:CID:PORT_NUMBER
.

Âm thanh
Trong AAOS ảo hoá, máy ảo khách Android có thể sử dụng virtio-snd
để truy cập vào âm thanh.
virtio-snd
cung cấp các thiết bị PCM ảo hoá cho máy ảo Android để quá trình triển khai HAL âm thanh có thể tương tác với các thiết bị âm thanh ảo hoá bằng thư viện TinyALSA.
Phương thức triển khai HAL âm thanh mặc định nằm trong AOSP tại /device/google/trout/hal/audio/6.0
. OEM có thể sửa đổi ro.vendor.trout.audiohal.{in,out}_period_{ms,count}
cho nền tảng của họ. OEM cũng có thể triển khai HAL âm thanh của riêng mình bằng cách ghi đè các biến liên quan đến âm thanh trong /device/google/trout/aosp_trout_common.mk.
HAL điều khiển âm thanh quản lý quyền phát âm thanh trong AAOS. Ví dụ: khi hệ thống phát âm thanh khẩn cấp, bạn có thể cần phải tắt tiếng nhạc phát trong nền. HAL điều khiển âm thanh sẽ thông báo cho các ứng dụng đang phát nhạc đó tắt tiếng trong trường hợp này. Trong hệ thống ảo hoá, âm thanh có thể đến từ các máy ảo khác. Trong quá trình triển khai tham chiếu, máy ảo khách AAOS có một trình nền máy chủ điều khiển âm thanh đang chạy, sử dụng GRPC-vsock
để nhận các yêu cầu lấy quyền phát âm thanh từ các máy ảo khác.
Máy ảo lưu trữ có thể sử dụng device/google/trout/hal/audiocontrol/2.0/libandroid_audio_controller
để gửi yêu cầu điều khiển âm thanh đến AAOS. Trong khi giữ quyền phát âm thanh, libandroid_audio_controller
sẽ tiếp tục gửi tín hiệu nhịp tim đến AAOS cho đến khi quyền phát được nhả.

Bluetooth
Việc triển khai Bluetooth dựa trên thiết kế minh hoạ dưới đây.

Cấu hình Bluetooth rảnh tay
Để bật Cấu hình rảnh tay Bluetooth (HFP) trên trout
, thông số kỹ thuật của thiết bị âm thanh VirtIO đã được mở rộng để hỗ trợ các chế độ điều khiển âm thanh. Khi sử dụng phương pháp này, thiết bị âm thanh VirtIO ở phía máy chủ/trình điều khiển ảo hoá sẽ cung cấp 3 chế độ điều khiển âm thanh liên quan đến HFP:
hfp_enable
hfp_set_sampling_rate
hfp_volume
Khi AAOS chạy dưới dạng máy ảo khách, AAOS sẽ sử dụng TinyAlsa để đặt các chế độ điều khiển âm thanh này. Để bật trường hợp sử dụng HFP, máy chủ lưu trữ/máy ảo hoá sẽ thực hiện việc định tuyến và hiệu chỉnh theo nhà cung cấp.
Việc triển khai Bluetooth dựa trên hình minh hoạ thiết kế bên dưới.

Trạng thái kết xuất
Khi tạo báo cáo lỗi cho AAOS ảo hoá, bạn nên thêm thông tin về máy ảo lưu trữ để nhà phát triển có cái nhìn toàn diện hơn về hệ thống. Để thực hiện việc này, quá trình triển khai tham chiếu trout
sẽ triển khai HAL IDumpstateDevice
. HAL này sẽ thu thập thông tin về máy ảo lưu trữ thông qua GRPC-vsock
. Thông tin máy ảo lưu trữ được đóng gói bằng "tar" được đặt tên là dumpstate_board.bin
trong báo cáo lỗi, trong khi tệp báo lỗi được đặt tại dumpstate_board.txt
.
Cách định cấu hình các lệnh để thực thi:
- Sao chép thông tin chi tiết về cấu hình từ tệp bên dưới vào một tệp XML, ví dụ:
config.xml
.<dumpstateHalConfiguration version="1.0"> <services> <service name="coqos-virtio-blk" command="/bin/journalctl --no-pager -t coqos-virtio-blk"/> <service name="coqos-virtio-net" command="/bin/journalctl --no-pager -t coqos-virtio-net"/> <service name="coqos-virtio-video" command="/bin/journalctl --no-pager -t coqos-virtio-video"/> <service name="coqos-virtio-console" command="/bin/journalctl --no-pager -t coqos-virtio-console"/> <service name="coqos-virtio-rng" command="/bin/journalctl --no-pager -t coqos-virtio-rng"/> <service name="coqos-virtio-vsock" command="/bin/journalctl --no-pager -t coqos-virtio-vsock"/> <service name="coqos-virtio-gpu-virgl" command="/bin/journalctl --no-pager -t coqos-virtio-gpu-virgl"/> <service name="coqos-virtio-scmi" command="/bin/journalctl --no-pager -t coqos-virtio-scmi"/> <service name="coqos-virtio-input" command="/bin/journalctl --no-pager -t coqos-virtio-input"/> <service name="coqos-virtio-snd" command="/bin/journalctl --no-pager -t coqos-virtio-snd"/> <service name="dumpstate_grpc_server" command="/bin/journalctl --no-pager -t dumpstate_grpc_server"/> <service name="systemd" command="/bin/journalctl --no-pager -t systemd"/> <service name="systemctl" command="/bin/systemctl status"/> <service name="vehicle_hal_grpc_server" command="/bin/journalctl --no-pager -t vehicle_hal_grpc_server"/> </services> <systemLogs> <service name="dmesg" command="/bin/dmesg -kuPT"/> </systemLogs> </dumpstateHalConfiguration>
- Truyền đường dẫn của tệp XML mới đến máy chủ dumpstate khi khởi chạy. Ví dụ:
--config_file my_config.xml
Hệ thống chế độ xem mở rộng (EVS)
Hệ thống chế độ xem mở rộng (EVS) dùng để hiển thị video do camera lùi và camera toàn cảnh ghi lại. Trong AAOS ảo hoá, ngăn xếp EVS có thể truy cập vào luồng video từ thiết bị truyền trực tuyến V4L2 ảo hoá sử dụng trình điều khiển video VirtIO.
Chế độ nhà để xe
Để biết thêm thông tin, hãy xem phần Chế độ gara.
Việc chuyển vào và thoát khỏi Chế độ gara được kích hoạt bằng các thuộc tính AP_POWER_STATE_REQ
do HAL của xe gửi. Ở chế độ ảo hoá, chế độ Garage được kích hoạt từ phía máy chủ.
Máy ảo lưu trữ phải luôn bật để cung cấp thiết bị ảo cho máy ảo Android, cho đến khi Android tắt. Máy chủ VHAL trên máy ảo lưu trữ sẽ gửi tín hiệu tắt máy đến máy ảo khách AAOS.
Khi nhận được ứng dụng VHAL, máy ảo AAOS sẽ chuyển sang chế độ Garage và bắt đầu gửi tín hiệu nhịp tim để giữ cho máy ảo lưu trữ luôn hoạt động.
Hệ thống vệ tinh toàn cầu (GNSS)
Trong trout
1.0, chúng tôi đã thêm tính năng hỗ trợ ảo hoá GNSS qua virtio-console
. Phương thức triển khai này hỗ trợ việc trao đổi các phép đo thô và bản sửa lỗi vị trí từ máy chủ sang máy khách.
Định dạng trao đổi dữ liệu là CSV do ứng dụng GnssLogger sử dụng. Trong quá trình triển khai tham chiếu, vì không có trình điều khiển GNSS gốc, nên dữ liệu mô phỏng được cung cấp nhưng trình điều khiển gốc có thể được triển khai mà không cần thay đổi gì ở phía khách. Một tác nhân lưu trữ mô phỏng mẫu được cung cấp trong mã nguồn trout
.
Việc triển khai hiện tại dự kiến sẽ do môi trường hệ điều hành lưu trữ xử lý việc khởi chạy GNSS và GNSS hỗ trợ (AGNSS).

Đồ hoạ
Khi AAOS đang chạy dưới dạng máy ảo khách cùng với các hệ điều hành ô tô khác, Android có thể không có quyền truy cập trực tiếp vào GPU hoặc bộ điều khiển màn hình. Trong trường hợp này, bạn có thể sử dụng Mesa hoặc goldfish-opengl
và trình điều khiển virtio-gpu
trên máy ảo khách Android và thiết bị virtio-gpu
để truy cập vào GPU.
Trên máy ảo khách Android, Mesa hoặc goldfish-opengl
sẽ mã hoá các lệnh OpenGLES thành luồng Gallium hoặc luồng GLES được tạo tự động tương ứng. Trình điều khiển hạt nhân virtio-gpu
được dùng làm phương tiện truyền tải. Ở phía máy chủ, virglrenderer
(dành cho Mesa) và vulkan-cereal
(dành cho goldfish-opengl
) sẽ phát lại luồng lệnh đã giải mã trên trình điều khiển GPU hiện có. Nền tảng tham chiếu AAOS trout
chỉ hỗ trợ OpenGL ES có hỗ trợ Vulkan, dự kiến sẽ có trong bản phát hành trong tương lai.

Cảm biến
Khi AAOS đang chạy dưới dạng máy ảo khách cùng với các hệ điều hành ô tô khác, Android có thể không có quyền truy cập trực tiếp vào các cảm biến. Trong trường hợp này, trình điều khiển Virtio-SCMI trên máy ảo khách Android và thiết bị VirtIO-SCMI trên máy ảo lưu trữ được dùng để truy cập vào các cảm biến. Nền tảng tham chiếu ảo hoá AAOS cung cấp một HAL cảm biến chung và không phụ thuộc vào phần cứng có thể được dùng cho các SoC dựa trên ARM để truy cập vào cảm biến.
HAL cảm biến giao tiếp với trình điều khiển IIO SCMI trong hệ thống con IIO của nhân Linux, sử dụng Giao thức quản lý cảm biến SCMI do thông số kỹ thuật Giao diện quản lý và điều khiển hệ thống ARM (SCMI) cung cấp để khám phá và định cấu hình cảm biến, đọc dữ liệu cảm biến và được thông báo về các thay đổi về giá trị cảm biến.
Trình điều khiển IIO SCMI sử dụng Trình điều khiển VirtIO SCMI, sử dụng giao thức truyền tải VirtIO như được chỉ định trong thông số kỹ thuật virtio-scmi
để trao đổi thông điệp SCMI với thiết bị VirtIO SCMI trên máy ảo lưu trữ. Thiết bị VirtIO SCBI có quyền truy cập trực tiếp vào các cảm biến thông qua trình điều khiển cảm biến dành riêng cho SoC.

Vị trí HAL cảm biến
Quá trình triển khai tham chiếu của HAL cảm biến (sử dụng VirtIO SCMI) nằm tại device/google/trout/hal/sensors
.
Cấu hình HAL cảm biến
HAL cảm biến có thể cần sửa đổi dữ liệu cảm biến nhận được từ máy ảo lưu trữ để tuân thủ hệ thống toạ độ cảm biến ô tô Android. Bạn có thể tìm thấy giản đồ cấu hình cảm biến trong device/google/trout/hal/sensors/2.0/config/sensor_hal_configuration.xsd
.
Nhà sản xuất thiết bị gốc (OEM) có thể cung cấp cấu hình cảm biến, chẳng hạn như hướng và vị trí, trong sensor_hal_configuration.xml
và sao chép tệp tại /odm/etc/sensors/
hoặc /vendor/etc/sensors/
.
Dưới đây là cấu hình cảm biến mẫu:
<sensorHalConfiguration version="1.0" xmlns:xi="http://www.w3.org/2001/XInclude"> <modules> <module halName="android.hardware.sensors@2.0-Google-IIO-Subhal" halVersion="2.0"> <sensors> <sensor name="scmi.iio.accel" type="1"> <configuration> <!-- Attribute rotate denotes if HAL needs to modify the sensor data to comply with // the Android car sensor coordinate system --> <orientation rotate="true"> <!-- Attribute map denotes the indexes of data in sensor data received --> <!-- Attribute negate denotes if data needs to be negated --> <x map="0" negate="false"/> <y map="1" negate="true"/> <z map="2" negate="true"/> </orientation> <location> <!-- Attribute x, y, z denotes location of the sensor placement --> <x>10</x> <y>15</y> <z>20</z> </location> </configuration> </sensor> </sensors> </module> </modules> </sensorHalConfiguration>
HAL của xe
Việc triển khai HAL của xe bao gồm hai thành phần:
- Ứng dụng khách. Cung cấp các API mà Android sử dụng trong AAOS ảo hoá
- Máy chủ. Giao tiếp trực tiếp với phần cứng, chẳng hạn như bus xe (hoặc trình mô phỏng).
Trong quá trình ảo hoá, máy chủ VHAL chạy trên máy ảo lưu trữ. Máy khách và máy chủ VHAL giao tiếp thông qua GRPC-vsock
(để biết thêm thông tin, hãy xem device/google/trout/hal/vehicle/2.0/proto/VehicleServer.proto
). OEM có thể sử dụng một giao thức truyền tải khác với GRPC bằng cách ghi đè các API giao tiếp. Để biết ví dụ, hãy xem device/google/trout/hal/vehicle/2.0/GrpcVehicle{Client,Server}.cpp
.
Các hệ thống con khác
VirtIO đã cung cấp một giao diện được xác định rõ ràng cho các thành phần như Lưu trữ khối, Mạng, Bảng điều khiển, Đầu vào, Ổ cắm và Độ hỗn loạn. Đối với các hệ thống con này, AAOS sử dụng trình điều khiển như hiện có, chẳng hạn như virtio-blk
, virtio-input
, virtio-console
và virtio-net
.
Trong nền tảng tham chiếu AAOS ảo hoá, Wi-Fi được hỗ trợ bằng mac80211_hwsim
để bật mạng không dây VirtWifi
, sau đó sử dụng đường hầm virtio-net
để gửi lưu lượng truy cập mạng đến máy ảo lưu trữ có quyền truy cập trực tiếp vào mạng Wi-Fi thực tế.