在 AAOS 中支援 VirtIO 所需的大部分變更,都涉及 Android 通用核心中 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:CID:PORT_NUMBER
的地址格式 vsock
使用。

音訊
在虛擬化 AAOS 中,Android 訪客 VM 可使用 virtio-snd
存取音訊。virtio-snd
會將虛擬化 PCM 裝置提供給 Android VM,讓音訊 HAL 實作項目能夠透過 TinyALSA 程式庫與虛擬化音訊裝置互動。
預設的音訊 HAL 實作項目位於 AOSP 的 /device/google/trout/hal/audio/6.0
中。OEM 可以修改其平台的 ro.vendor.trout.audiohal.{in,out}_period_{ms,count}
。原始設備製造商 (OEM) 也可以覆寫 /device/google/trout/aosp_trout_common.mk.
中的音訊相關變數,實作自己的音訊 HAL
音訊控制 HAL 會在 AAOS 中管理音訊焦點。舉例來說,當系統播放緊急聲響時,可能需要將背景播放的音樂靜音。音訊控制 HAL 會在這種情況下通知播放音樂的應用程式將音量設為靜音。在虛擬化系統中,聲音可能來自其他 VM。在參考實作項目中,AAOS 來賓 VM 會執行音訊控制伺服器 Daemon,並使用 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_enable
hfp_set_sampling_rate
hfp_volume
當 AAOS 以客體 VM 執行時,會使用 TinyAlsa 設定這些音訊控制項。為了啟用 HFP 用途,主機/硬體抽象機器會依據供應商特定的轉送和校正作業。
藍牙實作是以下方設計圖示為依據。

Dumpstate
為虛擬化 AAOS 產生錯誤報告時,建議您加入主機 VM 資訊,讓開發人員更全面地瞭解系統。為達成此目標,trout
參考實作項目會實作 IDumpstateDevice
HAL,透過 GRPC-vsock
收集主機 VM 資訊。在 bugreport 中,`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 檔案的路徑傳遞至傾印狀態伺服器。例如:
--config_file my_config.xml
擴充檢視系統 (EVS)
延伸視圖系統 (EVS) 可用於顯示後視鏡頭和環景攝影機拍攝的影片。在虛擬化 AAOS 中,EVS 堆疊可從使用 VirtIO 影片驅動程式的虛擬化 V4L2 串流裝置存取影片串流。
車庫模式
詳情請參閱「車庫模式」。
進入和退出車庫模式是由車輛 HAL 傳送的 AP_POWER_STATE_REQ
屬性觸發。在虛擬化模式下,Garage 模式會由主機端觸發。主機 VM 應保持開機狀態,為 Android VM 提供虛擬裝置,直到 Android 關機為止。主機 VM 上的 VHAL 伺服器會將關機信號傳送至 AAOS 訪客 VM。收到信號 VHAL 用戶端後,AAOS VM 會進入 Garage 模式,並開始傳送心跳信號,以維持主機 VM 的活動狀態。
全球衛星導航系統 (GNSS)
在 trout
1.0 中,已新增對 virtio-console
上 GNSS 虛擬化的支援。實作方式可支援從主機端傳送至訪客端的原始測量資料和位置修正資料。
資料交換格式是 GnssLogger 應用程式使用的 CSV。在參考實作中,由於原生 GNSS 驅動程式無法使用,因此會提供模擬資料,但您可以實作原生驅動程式,而無須進行任何訪客端變更。trout
原始碼中提供範例模擬主機代理程式。
目前的實作方式預期 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 虛擬化參考平台提供通用且與硬體無關的 Sensor HAL,可讓以 ARM 為基礎的 SoC 存取感應器。
Sensor HAL 會與 Linux 核心 I/O 子系統中的 I/O SCMI 驅動程式通訊,該驅動程式會使用 ARM 系統控制和管理介面 (SCMI) 規格提供的 SCMI 感應器管理協定,用於探索及設定感應器、讀取感應器資料,以及接收感應器值變更的通知。
IIO SCMI 驅動程式會使用 VirtIO SCMI 驅動程式,而 VirtIO SCMI 驅動程式會使用 virtio-scmi
規格中指定的 VirtIO 傳輸通訊協定,與主機 VM 上的 VirtIO SCMI 裝置交換 SCMI 訊息。VirtIO SMMI 裝置可透過 SoC 專屬感應器驅動程式,直接存取感應器。

感應器 HAL 位置
使用 VirtIO SCMI 的感應器 HAL 參考實作項目位於 device/google/trout/hal/sensors
。
感應器 HAL 設定
感應器 HAL 可能需要修改從主機 VM 收到的感應器資料,以符合 Android 車輛感應器座標系統。您可以在 device/google/trout/hal/sensors/2.0/config/sensor_hal_configuration.xsd
中找到感應器設定的結構定義。
OEM 廠商可以在 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
Vehicle 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 已為區塊儲存空間、網路、主控台、輸入、Socket 和 Entropy 等元件提供完善的介面。針對這些子系統,AAOS 會使用原始驅動程式,例如 virtio-blk
、virtio-input
、virtio-console
和 virtio-net
。
在虛擬化的 AAOS 參考平台中,mac80211_hwsim
可支援 Wi-Fi,以啟用 VirtWifi
無線網路,然後使用 virtio-net
隧道將網路流量傳送至主機 VM,該 VM 可直接存取實際的 Wi-Fi 網路。