Sebagian besar perubahan yang diperlukan untuk mendukung VirtIO di AAOS melibatkan perubahan di tingkat implementasi HAL dan di bawahnya di Kernel Umum Android. Framework Android berkomunikasi dengan HAL generik yang tidak bergantung pada hardware menggunakan driver VirtIO di kernel VM tamu AAOS, yang berkomunikasi dengan perangkat VirtIO di sisi host menggunakan protokol VirtIO. Perangkat VirtIO di sisi host dapat mengakses HW fisik menggunakan driver perangkat khusus SoC.
Komunikasi antara driver VirtIO dan perangkat VirtIO terjadi dengan virtqueue, yang merupakan buffer ring seperti DMA dari daftar scatter gather.
Beberapa transportasi, seperti
MMIO
atau
PCI
dapat digunakan untuk bertukar pesan VirtIO antar-VM.
Dalam beberapa kasus, vsock digunakan untuk komunikasi antar-VM.
Komunikasi HAL Kendaraan (VHAL), Kontrol Audio, dan Dumpstate didukung menggunakan koneksi
ke agen peer di VM terpisah melalui antarmuka vsock.
gRPC melalui vsock digunakan untuk mengakses
subsistem yang tidak standar ini.
gRPC
di pohon sumber Android diubah agar berfungsi dengan vsock dengan format
alamat vsock:CID:PORT_NUMBER.

Gambar 1. Arsitektur virtualisasi.
Audio
Di AAOS yang divirtualisasikan, VM tamu Android dapat menggunakan virtio-snd untuk mengakses audio.
virtio-snd menyediakan perangkat PCM yang divirtualisasikan ke VM Android sehingga implementasi HAL audio dapat berinteraksi dengan perangkat suara yang divirtualisasikan dengan library TinyALSA.
Implementasi HAL audio default terletak di AOSP di /device/google/trout/hal/audio/6.0. OEM dapat mengubah ro.vendor.trout.audiohal.{in,out}_period_{ms,count} untuk platform mereka. OEM juga dapat mengimplementasikan HAL audio mereka sendiri dengan mengganti variabel terkait audio di
/device/google/trout/aosp_trout_common.mk.
HAL kontrol audio mengelola fokus audio di AAOS. Misalnya, saat sistem memutar suara darurat, musik yang diputar di latar belakang mungkin perlu dibisukan. HAL kontrol audio memberi tahu aplikasi yang memutar musik untuk dibisukan dalam situasi ini. Dalam sistem yang divirtualisasikan, suara dapat berasal dari VM lain. Dalam implementasi referensi, VM tamu AAOS memiliki daemon server kontrol audio yang berjalan, yang menggunakan gRPC melalui vsock untuk menerima permintaan fokus audio dari VM lain.
VM host dapat menggunakan device/google/trout/hal/audiocontrol/2.0/libandroid_audio_controller untuk mengirim permintaan kontrol audio ke AAOS. Saat libandroid_audio_controller memiliki fokus audio, aplikasi ini akan terus mengirim sinyal detak jantung ke AAOS hingga fokus dilepaskan.

Gambar 2. Arsitektur audio.
Bluetooth
Implementasi Bluetooth diilustrasikan dalam gambar berikut:

Gambar 3. Arsitektur Bluetooth.
Profil Handsfree Bluetooth
Untuk mengaktifkan Profil Handsfree Bluetooth (HFP) di trout, spesifikasi perangkat suara VirtIO telah diperluas untuk mendukung kontrol audio. Dengan menggunakan pendekatan ini, perangkat suara VirtIO di sisi host/hypervisor menyediakan tiga kontrol audio yang terkait dengan HFP:
hfp_enablehfp_set_sampling_ratehfp_volume
Saat AAOS berjalan sebagai VM tamu, AAOS menggunakan TinyALSA untuk menetapkan kontrol audio ini. Untuk mengaktifkan kasus penggunaan HFP, host/hypervisor melakukan pemilihan rute dan kalibrasi khusus vendor.
Implementasi Bluetooth didasarkan pada ilustrasi desain berikut:

Gambar 4. Arsitektur Bluetooth.
Dumpstate
Saat membuat laporan bug untuk AAOS yang divirtualisasikan, sebaiknya sertakan informasi VM host agar developer memiliki tampilan sistem yang lebih komprehensif. Untuk melakukannya, implementasi referensi trout mengimplementasikan IDumpstateDevice HAL, yang mengumpulkan informasi VM host melalui gRPC melalui vsock. Informasi VM host yang dikemas tar diberi nama dumpstate_board.bin dalam laporan bug, sedangkan log dumping berada di dumpstate_board.txt.
Untuk mengonfigurasi perintah yang akan dijalankan:
- Salin detail konfigurasi dari file berikut ke dalam file XML, misalnya,
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> - Teruskan jalur file XML baru ke server dumpstate saat meluncurkan, misalnya:
--config_file my_config.xml
Sistem Tampilan Diperluas
Sistem Tampilan Diperluas (EVS) menampilkan video yang diambil oleh kamera tampilan belakang dan tampilan sekitar. Di AAOS yang divirtualisasikan, stack EVS dapat mengakses streaming video dari perangkat streaming V4L2 yang divirtualisasikan yang menggunakan driver VirtIO-video.
Mode garasi
Mode Garasi dimasuki dan keluar dipicu oleh properti AP_POWER_STATE_REQ yang dikirim oleh VHAL. Dalam mode virtualisasi, Mode Garasi dipicu dari sisi host.
VM host harus tetap aktif untuk menyediakan perangkat virtual untuk VM Android, hingga Android dimatikan. Server VHAL di VM host mengirimkan sinyal penonaktifan ke VM tamu AAOS.
Setelah menerima sinyal klien VHAL, VM AAOS memasuki Mode Garasi dan mulai mengirim sinyal detak jantung agar VM host tetap aktif. Untuk mengetahui informasi selengkapnya, lihat
Mode Garasi.
Sistem satelit navigasi global (GNSS)
Di trout 1.0, dukungan disertakan untuk virtualisasi GNSS melalui virtio-console. Implementasi ini mendukung pertukaran pengukuran mentah dan perbaikan lokasi dari host ke tamu.
Format pertukaran data adalah CSV yang digunakan oleh aplikasi GNSSLogger. Dalam implementasi referensi, driver GNSS native tidak tersedia, sehingga data tiruan tersedia. Anda dapat mengimplementasikan driver native tanpa perubahan sisi tamu. Agen host tiruan sampel disediakan sebagai bagian dari kode sumber trout.
Implementasi ini mengharapkan inisialisasi GNSS dan GNSS Bantuan (AGNSS) ditangani oleh lingkungan OS host.

Gambar 5. Arsitektur GNSS.
Grafik
Saat AAOS berjalan sebagai VM tamu bersama dengan sistem operasi otomotif lainnya, Android mungkin tidak memiliki akses langsung ke GPU atau pengontrol tampilan. Dalam hal ini, Anda dapat mengakses GPU menggunakan
Mesa atau
goldfish-opengl
dan driver virtio-gpu di VM tamu Android dan perangkat virtio-gpu.
Di VM tamu Android, Mesa, atau goldfish-opengl mengenkode perintah OpenGLES ke dalam streaming Gallium atau streaming GLES yang dibuat otomatis. Driver kernel virtio-gpu digunakan sebagai transportasi. Di sisi host, virglrenderer (untuk Mesa) dan vulkan-cereal (untuk goldfish-opengl) memutar ulang streaming perintah yang didekode di atas driver GPU yang ada. Platform referensi AAOS trout hanya mendukung OpenGL ES dengan dukungan Vulkan, yang diperkirakan akan tersedia dalam rilis mendatang.

Gambar 6. Arsitektur grafik.
Sensor
Saat AAOS berjalan sebagai VM tamu bersama dengan sistem operasi otomotif lainnya, Android mungkin tidak memiliki akses langsung ke sensor. Dalam hal ini, Anda dapat mengakses sensor menggunakan driver Virtio-SCMI di VM tamu Android dan perangkat VirtIO-SCMI di VM host. Platform referensi virtualisasi AAOS menyediakan HAL Sensor generik dan tidak bergantung pada HW yang dapat Anda gunakan untuk SoC berbasis ARM guna mengakses sensor.
HAL Sensor berkomunikasi dengan driver IIO SCMI di subsistem IIO Kernel Linux, yang menggunakan Protokol Pengelolaan Sensor SCMI yang disediakan oleh ARM System Control and Management Interface (SCMI) spesifikasi untuk menemukan dan mengonfigurasi sensor, membaca data sensor, dan mendapatkan notifikasi perubahan nilai sensor.
Driver IIO SCMI menggunakan driver VirtIO SCMI, yang menggunakan protokol transportasi VirtIO dalam spesifikasi virtio-scmi untuk bertukar pesan SCMI dengan perangkat VirtIO SCMI di VM host. Perangkat VirtIO SCMI memiliki akses langsung ke sensor melalui driver sensor khusus SoC.
Gambar 7. Arsitektur sensor.
Lokasi HAL sensor
Implementasi referensi HAL sensor, yang menggunakan VirtIO SCMI, terletak di device/google/trout/hal/sensors.
Konfigurasi HAL sensor
HAL Sensor mungkin perlu mengubah data sensor yang diterima dari VM Host agar sesuai dengan sistem koordinat sensor mobil Android. Skema untuk konfigurasi sensor dapat ditemukan di device/google/trout/hal/sensors/2.0/config/sensor_hal_configuration.xsd.
OEM dapat memberikan konfigurasi sensor, seperti orientasi dan lokasi, di sensor_hal_configuration.xml dan menyalin file di /odm/etc/sensors/ atau /vendor/etc/sensors/. Konfigurasi sensor disediakan dalam contoh berikut:
<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 Kendaraan
Implementasi HAL Kendaraan (VHAL) terdiri dari dua komponen:
- Klien. Menyediakan API yang digunakan oleh Android di AAOS yang divirtualisasikan
- Server. Berkomunikasi langsung dengan hardware, seperti bus kendaraan (atau emulator).
Dalam virtualisasi, server VHAL berjalan di VM host. Klien dan server VHAL berkomunikasi melalui gRPC melalui vsock. Untuk mengetahui informasi selengkapnya, lihat device/google/trout/hal/vehicle/2.0/proto/VehicleServer.proto. OEM dapat menggunakan protokol transportasi lain selain gRPC dengan mengganti API komunikasi. Untuk contohnya, lihat device/google/trout/hal/vehicle/2.0/GrpcVehicle{Client,Server}.cpp.
Subsistem lainnya
VirtIO telah menyediakan antarmuka yang ditentukan dengan baik untuk komponen seperti Penyimpanan Blok, Jaringan, Konsol, Input, Socket, dan Entropi. Untuk subsistem ini, AAOS menggunakan driver apa adanya, seperti virtio-blk, virtio-input, virtio-console, dan virtio-net.
Di platform referensi AAOS yang divirtualisasikan, Wi-Fi didukung dengan mac80211_hwsim untuk mengaktifkan jaringan nirkabel VirtWifi, yang kemudian menggunakan tunnel virtio-net untuk mengirim traffic jaringan ke VM host, yang memiliki akses langsung ke jaringan Wi-Fi sebenarnya.