如要在 AAOS 中支援 VirtIO,大部分的變更都涉及 Android Common Kernel 中的 HAL 實作層級和以下層級。Android 架構會使用 AAOS 客戶 VM 核心中的 VirtIO 驅動程式,與不限於特定硬體的通用 HAL 進行通訊,而這類驅動程式會使用 VirtIO 通訊協定,與主機端的 VirtIO 裝置通訊。主機端的 VirtIO 裝置可以使用 SoC 專屬的裝置驅動程式存取實體硬體。
VirtIO 驅動程式與 VirtIO 裝置之間的通訊會透過 virtqueue 進行,這類緩衝區類似 DMA 環狀緩衝區,包含分散收集清單。多種傳輸方式 (例如 MMIO 或 PCI) 可用於在 VM 之間交換 VirtIO 訊息。
在某些情況下,vsock 會用於 VM 間的通訊。透過 vsock 介面連線至獨立 VM 上的對等互連代理程式,即可支援車用 HAL、音訊控制和 Dumpstate 通訊。GRPC-vsock 用於存取這些非標準化子系統。
Android 來源樹狀結構中的 GRPC 已修改為可與 vsock 搭配使用,且位址格式為 vsock:CID:PORT_NUMBER。

音訊
在虛擬化 AAOS 中,Android 客戶端 VM 可以使用 virtio-snd 存取音訊。virtio-snd 會將虛擬化 PCM 裝置提供給 Android VM,讓音訊 HAL 實作項目能透過 TinyALSA 程式庫與虛擬化音訊裝置互動。
預設音訊 HAL 實作位於 AOSP 的 /device/google/trout/hal/audio/6.0。原始設備製造商可以修改平台專用的 ro.vendor.trout.audiohal.{in,out}_period_{ms,count}。原始設備製造商 (OEM) 也可以在 /device/google/trout/aosp_trout_common.mk. 中覆寫音訊相關變數,實作自己的音訊 HAL。
音訊控制 HAL 會管理 AAOS 中的音訊焦點。舉例來說,系統播放緊急聲音時,可能需要將背景播放的音樂設為靜音。音訊控制 HAL 會通知正在播放音樂的應用程式在此情況下將音訊設為靜音。在虛擬化系統中,聲音可能來自其他 VM。在參考實作中,AAOS 客戶 VM 會執行音訊控制伺服器精靈,並使用 GRPC-vsock 接收來自其他 VM 的音訊焦點要求。
主機 VM 可以使用 device/google/trout/hal/audiocontrol/2.0/libandroid_audio_controller
將音訊控制要求傳送至 AAOS。libandroid_audio_controller 取得音訊焦點後,會持續將心跳訊號傳送至 AAOS,直到焦點釋出為止。
藍牙
藍牙實作方式是以以下設計為基礎。
藍牙免持設定檔
如要在 trout 上啟用藍牙免持聽筒設定檔 (HFP),VirtIO 音訊裝置規格已擴充為支援音訊控制。使用這種方法時,主機/管理程序端的 VirtIO 音訊裝置會提供與 HFP 相關的三種音訊控制項:
hfp_enablehfp_set_sampling_ratehfp_volume
當 AAOS 以客層 VM 形式執行時,AAOS 會使用 TinyAlsa 設定這些音訊控制項。如要啟用 HFP 用途,主機/管理程序會執行供應商專屬的轉送和校準作業。
藍牙實作方式如下圖所示。
Dumpstate
產生虛擬化 AAOS 的錯誤報告時,建議加入主機 VM 資訊,讓開發人員更全面瞭解系統。為達成此目的,trout 參考實作項目會實作 IDumpstateDevice HAL,透過 GRPC-vsock 收集主機 VM 資訊。以 `tar` 封裝的主機 VM 資訊在錯誤報告中名為 dumpstate_board.bin,而傾印的記錄則位於 dumpstate_board.txt。
如要設定要執行的指令,請按照下列步驟操作:
- 將下方檔案中的設定詳細資料複製到 XML 檔案中,例如:
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> - 啟動時,將新 XML 檔案的路徑傳遞至 dumpstate 伺服器。例如:
--config_file my_config.xml
擴大視野系統 (EVS)
擴大視野系統 (EVS) 可顯示後視和環景攝影機拍攝的影片。在虛擬化 AAOS 中,EVS 堆疊可存取虛擬化 V4L2 串流裝置的影片串流,該裝置使用 VirtIO 影片驅動程式。
車庫模式
詳情請參閱「車庫模式」。
車用 HAL 傳送的 AP_POWER_STATE_REQ 屬性會觸發進入和退出車庫模式。在虛擬化模式下,車庫模式會從主機端觸發。
主機 VM 應保持開啟電源,為 Android VM 提供虛擬裝置,直到 Android 關機為止。主機 VM 上的 VHAL 伺服器會將關機訊號傳送至 AAOS 客戶 VM。收到 VHAL 用戶端訊號後,AAOS VM 會進入車庫模式,並開始傳送心跳訊號,讓主機 VM 保持運作。
全球導航衛星系統 (GNSS)
trout 1.0 新增了透過 virtio-console 虛擬化 GNSS 的支援。這項實作方式支援從主機到訪客的原始測量值和位置修正值交換。
資料交換格式是 GnssLogger 應用程式使用的 CSV。在參考實作中,由於原生 GNSS 驅動程式無法使用,因此提供模擬資料,但實作原生驅動程式時,不需要進行任何客端變更。trout原始碼中提供模擬主機代理程式範例。
目前的實作方式是預期由主機 OS 環境處理 GNSS 初始化和輔助 GNSS (AGNSS)。

圖形
當 AAOS 與其他車輛作業系統一起以客體 VM 形式執行時,Android 可能無法直接存取 GPU 或螢幕控制器。在這種情況下,您可以使用 Mesa 或 goldfish-opengl,以及 Android 客戶 VM 和 virtio-gpu 裝置上的 virtio-gpu 驅動程式存取 GPU。
在 Android 客戶 VM 上,Mesa 或 goldfish-opengl 會將 OpenGLES 指令分別編碼為 Gallium 串流或自動產生的 GLES 串流。virtio-gpu
核心驅動程式會做為傳輸方式。在主機端,virglrenderer (適用於 Mesa) 和 vulkan-cereal (適用於 goldfish-opengl) 會在現有的 GPU 驅動程式上重播解碼的指令串流。AAOS 參考平台 trout「僅」支援 OpenGL ES ,預計在後續版本中支援 Vulkan。

感應器
如果 AAOS 與其他車輛作業系統一起以客體 VM 形式執行,Android 可能無法直接存取感應器。在本例中,Android 訪客 VM 上的 Virtio-SCMI 驅動程式和主機 VM 上的 VirtIO-SCMI 裝置,可用於存取感應器。AAOS 虛擬化參考平台提供與硬體無關的通用感應器 HAL,可用於 ARM 架構的 SoC,存取感應器。
感應器 HAL 會與 Linux 核心 IIO 子系統中的 IIO SCMI 驅動程式通訊,後者會使用 ARM 系統控制和管理介面 (SCMI) 規格提供的 SCMI 感應器管理通訊協定,探索及設定感應器、讀取感應器資料,以及接收感應器值變更通知。
IIO SCMI 驅動程式會使用 VirtIO SCMI 驅動程式,後者會使用 virtio-scmi 規格中指定的 VirtIO 傳輸通訊協定,與主機 VM 上的 VirtIO SCMI 裝置交換 SCMI 訊息。VirtIO SCMI 裝置可透過 SoC 專屬感應器驅動程式直接存取感應器。
感應器 HAL 位置
感應器 HAL 的參考實作 (使用 VirtIO SCMI) 位於 device/google/trout/hal/sensors。
感應器 HAL 設定
感應器 HAL 可能需要修改從主機 VM 收到的感應器資料,才能符合 Android 車輛感應器座標系統。感應器設定的結構定義位於 device/google/trout/hal/sensors/2.0/config/sensor_hal_configuration.xsd。
原始設備製造商可以在 sensor_hal_configuration.xml 中提供感應器設定 (例如方向和位置),並將檔案複製到 /odm/etc/sensors/ 或 /vendor/etc/sensors/。以下提供感應器設定範例:
<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
車用 HAL 實作包含兩個元件:
- Client. 提供 Android 在虛擬化 AAOS 中使用的 API
- 伺服器。直接與硬體通訊,例如車輛匯流排 (或模擬器)。
在虛擬化中,VHAL 伺服器會在主機 VM 上執行。VHAL 用戶端和伺服器會透過 GRPC-vsock 通訊 (詳情請參閱 device/google/trout/hal/vehicle/2.0/proto/VehicleServer.proto)。OEM 可以覆寫通訊 API,使用 GRPC 以外的傳輸通訊協定。如需範例,請參閱 device/google/trout/hal/vehicle/2.0/GrpcVehicle{Client,Server}.cpp。
其他子系統
VirtIO 已為 Block Storage、Network、Console、Input、Socket 和 Entropy 等元件提供明確定義的介面。對於這些子系統,AAOS 會直接使用驅動程式,例如 virtio-blk、virtio-input、virtio-console 和 virtio-net。
在虛擬化 AAOS 參考平台中,系統支援 Wi-Fi,可透過 mac80211_hwsim 啟用 VirtWifi 無線網路,然後使用 virtio-net 隧道將網路流量傳送至主機 VM,該 VM 可直接存取實際的 Wi-Fi 網路。