架构

在 AAOS 中支持 VirtIO 所需的大部分更改都涉及到 HAL 实现级别及以下在 Android Common Kernel 中的更改。Android 框架使用 AAOS 访客虚拟机内核中的 VirtIO 驱动程序与通用、与硬件无关的 HAL 通信,后者使用 VirtIO 协议与主机端的 VirtIO 设备通信。主机端的 VirtIO 设备可以使用 SoC 特定的设备驱动程序访问物理硬件。

VirtIO 驱动程序和 VirtIO 设备之间的通信通过 virtqueue 进行,virtqueue 是类似 DMA 的散点收集列表环形缓冲区。可以使用多种传输方式(例如 MMIOPCI)在虚拟机之间交换 VirtIO 消息。

在某些情况下,vsock 已用于虚拟机间通信。Vehicle HAL、Audio Control 和 Dumpstate 通信通过 vsock 接口连接到单独虚拟机上的对等代理来支持。GRPC-vsock 用于访问这些非标准化子系统。Android 源代码树中的 GRPC 已被修改为与 vsock 一起使用,地址格式为 vsock:CID:PORT_NUMBER

Virtualization architecture
图 1. 虚拟化架构

音频

在虚拟化 AAOS 中,Android 访客虚拟机可以使用 virtio-snd 访问音频。virtio-snd 向 Android 虚拟机提供虚拟化 PCM 设备,以便音频 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 会通知那些播放音乐的应用静音。在虚拟化系统中,声音可能来自其他虚拟机。在参考实现中,AAOS 访客虚拟机运行一个音频控制服务器守护程序,该守护程序使用 GRPC-vsock 接收来自其他虚拟机的音频焦点请求。主机虚拟机可以使用 device/google/trout/hal/audiocontrol/2.0/libandroid_audio_controller 向 AAOS 发送音频控制请求。当 libandroid_audio_controller 保持音频焦点时,它会持续向 AAOS 发送检测信号,直到焦点被释放。

Audio architecture
图 5. 音频架构

蓝牙

蓝牙实现基于下图所示的设计。

Bluetooth architecture
图 5. 蓝牙架构

蓝牙免提协议

要在 trout 上启用蓝牙免提协议 (HFP),VirtIO 声音设备规范已扩展为支持音频控制。使用这种方法,主机/虚拟机监控程序端的 VirtIO 声音设备提供以下三个与 HFP 相关的音频控制

  • hfp_enable
  • hfp_set_sampling_rate
  • hfp_volume

当 AAOS 作为访客虚拟机运行时,AAOS 使用 TinyAlsa 设置这些音频控制。要启用 HFP 用例,主机/虚拟机监控程序会相应地执行供应商特定的路由和校准。

蓝牙实现基于下图所示的设计。

Bluetooth architecture
图 5. 蓝牙架构

Dumpstate

为虚拟化 AAOS 生成错误报告时,最好包含主机虚拟机信息,以便开发人员更全面地了解系统。为了实现这一点,trout 参考实现实现了 IDumpstateDevice HAL,它通过 GRPC-vsock 收集主机虚拟机信息。打包为 `tar` 的主机虚拟机信息在错误报告中名为 dumpstate_board.bin,而转储日志位于 dumpstate_board.txt

要配置要执行的命令

  1. 从下面的文件中将配置详细信息复制到 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>
    
  2. 启动时将新 XML 文件的路径传递给 dumpstate 服务器。例如
    --config_file my_config.xml
    

扩展视图系统 (EVS)

扩展视图系统 (EVS) 用于显示后视摄像头和环视摄像头捕获的视频。在虚拟化 AAOS 中,EVS 堆栈可以访问来自使用 VirtIO-video 驱动程序的虚拟化 V4L2 流媒体设备的视频流。

车库模式

有关详细信息,请参阅车库模式

进入和退出车库模式由车辆 HAL 发送的 AP_POWER_STATE_REQ 属性触发。在虚拟化模式下,车库模式从主机端触发。主机虚拟机应保持通电状态,以便为 Android 虚拟机提供虚拟设备,直到 Android 关闭电源。主机虚拟机上的 VHAL 服务器向 AAOS 访客虚拟机发送关机信号。AAOS 虚拟机上的 VHAL 客户端收到信号后,进入车库模式并开始发送检测信号以保持主机虚拟机处于活动状态。

全球导航卫星系统 (GNSS)

trout 1.0 中,已添加对通过 virtio-console 进行 GNSS 虚拟化的支持。该实现支持主机到访客的原始测量和位置修正交换。

数据交换格式是 GnssLogger 应用使用的 CSV。在参考实现中,由于原生 GNSS 驱动程序不可用,因此提供了模拟数据,但可以在不进行任何访客端更改的情况下实现原生驱动程序。作为 trout 源代码的一部分,提供了一个示例模拟主机代理。

当前实现期望由主机操作系统环境处理 GNSS 初始化和辅助 GNSS (AGNSS)。

GNSS architecture
图 2. GNSS 架构

图形

当 AAOS 作为访客虚拟机与其他汽车操作系统一起运行时,Android 可能无法直接访问 GPU 或显示控制器。在这种情况下,可以使用 Mesagoldfish-opengl 和 Android 访客虚拟机上的 virtio-gpu 驱动程序以及 virtio-gpu 设备来访问 GPU。

在 Android 访客虚拟机上,Mesa 或 goldfish-opengl 分别将 OpenGLES 命令编码为 Gallium 流或自动生成的 GLES 流。virtio-gpu 内核驱动程序用作传输工具。在主机端,virglrenderer(对于 Mesa)和 vulkan-cereal(对于 goldfish-opengl)在现有 GPU 驱动程序之上重放解码后的命令流。AAOS 参考平台 trout 支持 OpenGL ES,并预期在未来版本中支持 Vulkan。

Graphics architecture
图 3. 图形架构

传感器

当 AAOS 作为访客虚拟机与其他汽车操作系统一起运行时,Android 可能无法直接访问传感器。在这种情况下,Android 访客虚拟机上的 Virtio-SCMI 驱动程序和主机虚拟机上的 VirtIO-SCMI 设备用于访问传感器。AAOS 虚拟化参考平台提供了一个通用的、与硬件无关的传感器 HAL,可用于基于 ARM 的 SoC 访问传感器。

传感器 HAL 与 Linux 内核 IIO 子系统中的 IIO SCMI 驱动程序通信,后者使用 ARM 系统控制和管理接口 (SCMI) 规范提供的 SCMI 传感器管理协议来发现和配置传感器、读取传感器数据以及接收传感器值更改的通知。

IIO SCMI 驱动程序使用 VirtIO SCMI 驱动程序,后者使用 virtio-scmi 规范中指定的 VirtIO 传输协议与主机虚拟机上的 VirtIO SCMI 设备交换 SCMI 消息。VirtIO SCMI 设备可以通过 SoC 特定的传感器驱动程序直接访问传感器。

Sensor architecture
图 4. 传感器架构

传感器 HAL 位置

传感器 HAL(使用 VirtIO SCMI)的参考实现位于 device/google/trout/hal/sensors

传感器 HAL 配置

传感器 HAL 可能需要修改从主机虚拟机接收的传感器数据,以符合 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

车辆 HAL 实现由两个组件组成

  • 客户端。提供虚拟化 AAOS 中 Android 使用的 API
  • 服务器。直接与硬件(例如车辆总线或模拟器)通信。

在虚拟化中,VHAL 服务器在主机虚拟机上运行。VHAL 客户端和服务器通过 GRPC-vsock 进行通信(有关详细信息,请参阅 device/google/trout/hal/vehicle/2.0/proto/VehicleServer.proto)。OEM 可以使用除 GRPC 以外的其他传输协议,方法是覆盖通信 API。有关示例,请参阅 device/google/trout/hal/vehicle/2.0/GrpcVehicle{Client,Server}.cpp

其他子系统

VirtIO 已经为组件(如块存储、网络、控制台、输入、套接字和熵)提供了明确定义的接口。对于这些子系统,AAOS 按原样使用驱动程序,例如 virtio-blkvirtio-inputvirtio-consolevirtio-net

在虚拟化 AAOS 参考平台中,Wi-Fi 通过 mac80211_hwsim 支持,以启用 VirtWifi 无线网络,然后该网络使用 virtio-net 隧道将网络流量发送到可以直接访问实际 Wi-Fi 网络的主机虚拟机。