Google은 흑인 공동체를 위한 인종 간 평등을 진전시키기 위해 노력하고 있습니다. Google에서 어떤 노력을 하고 있는지 확인하세요.

아키텍처

AAOS에서 VirtIO를 지원하는 데 필요한 대부분의 변경사항에는 Android 공통 커널의 HAL 구현 수준 이하의 변경사항이 포함됩니다. Android 프레임워크는 VirtIO 프로토콜을 사용하여 호스트 측에서 VirtIO 기기와 통신하는 AAOS 게스트 VM 커널의 VirtIO 드라이버를 사용하여 하드웨어 제약이 없는 일반 HAL과 통신합니다. 호스트 측의 VirtIO 기기는 SoC 관련 기기 드라이버를 사용하여 실제 HW에 액세스할 수 있습니다.

VirtIO 드라이버와 VirtIO 기기 간의 통신은 분산 수집 목록의 DMA와 유사한 링 버퍼인 virtqueue를 통해 이루어집니다. MMIOPCI와 같은 여러 전송을 사용하여 VM 간에 VirtIO 메시지를 교환할 수 있습니다.

경우에 따라 vsock가 VM 간 통신에 활용되어 왔습니다. 차량 HAL, 오디오 제어, Dumpstate 통신은 vsock 인터페이스를 통해 별도의 VM에서 피어 에이전트 연결을 사용하여 지원됩니다. GRPC-vsock은 이러한 표준화되지 않은 하위 시스템에 액세스하는 데 사용됩니다. Android 소스 트리의 GRPC는 주소 형식이 vsock:CID:PORT_NUMBERvsock과 호환되도록 수정되었습니다.

가상화 아키텍처
그림 1. 가상화 아키텍처

그래픽

AAOS가 다른 자동차 운영체제와 함께 게스트 VM으로 실행되는 경우 Android에서는 GPU나 디스플레이 컨트롤러에 직접 액세스하지 못할 수 있습니다. 이 경우 Android 게스트 VM 및 virtio-gpu 기기의 Mesavirtio-gpu 드라이버를 사용하여 GPU에 액세스할 수 있습니다.

Android 게스트 VM에서 Mesa는 Gallium3D 프레임워크를 사용하여 셰이더를 TGSI 중간 표현으로 컴파일하고 API를 상태 객체로 변환합니다. 그러면 Gallium3D는 컴파일된 상태 객체와 그리기 호출을 Mesa Virgl에 제출하고 Mesa Virgl은 virtio-gpu를 전송 프로토콜로 사용하여 명령어와 셰이더를 호스트 VM에 전송합니다.

호스트 측에서 virglrenderervirtio-gpu 명령어 스트림을 수신하고 OpenGL ES 명령어로 스트림을 변환합니다. 또한 셰이더를 TGSI 형식에서 GLSL 형식으로 변환하여 기존 GPU 드라이버 위에서 재생합니다.

AAOS 참조 플랫폼 trout는 현재 향후 출시에서 예상되는 Vulkan 지원과 함께 OpenGL ES만 지원합니다.

그래픽 아키텍처
그림 2. 그래픽 아키텍처

센서

AAOS가 다른 자동차 운영체제와 함께 게스트 VM으로 실행되는 경우 Android에서는 센서에 직접 액세스하지 못할 수 있습니다. 이 경우 Android 게스트 VM의 Virtio-SCMI 드라이버와 호스트 VM의 VirtIO-SCMI 기기를 사용하여 센서에 액세스합니다. AAOS 가상화 참조 플랫폼은 ARM 기반 SoC에서 센서에 액세스하는 데 사용할 수 있는 일반적이고 HW 제약이 없는 센서 HAL을 제공합니다.

센서 HAL은 ARM 시스템 제어 및 관리 인터페이스(SCMI) 사양에서 제공하는 SCMI 센서 관리 프로토콜을 사용하여 센서를 검색 및 구성하고 센서 데이터를 읽고 센서값 변경사항 알림을 받는 Linux 커널 IIO 하위 시스템의 IIO SCMI 드라이버와 통신합니다. IIO SCMI 드라이버는 virtio-scmi 사양에 지정된 대로 VirtIO 전송 프로토콜을 사용하여 호스트 VM의 VirtIO SCMI 기기와 SCMI 메시지를 교환하는 VirtIO SCMI 드라이버를 사용합니다. VirtIO SCMI 기기는 SoC 관련 센서 드라이버를 통해 센서에 직접 액세스할 수 있습니다.

센서 아키텍처
그림 3. 센서 아키텍처

센서 HAL 위치

VirtIO SCMI를 사용하는 센서 HAL의 참조 구현은 device/google/trout/hal/sensors에 있습니다.

센서 HAL 구성

센서 HAL은 Android 자동차 센서 좌표계를 준수하기 위해 호스트 VM에서 수신한 센서 데이터를 수정해야 할 수도 있습니다. 센서 구성 스키마는 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>

오디오

가상화된 AAOS에서 Android 게스트 VM은 virtio-snd를 사용하여 오디오에 액세스할 수 있습니다. virtio-snd는 오디오 HAL 구현이 TinyALSA 라이브러리를 사용하여 가상화된 사운드 기기와 상호작용할 수 있도록 가상화된 PCM 기기를 Android VM에 제공합니다.

기본 오디오 HAL 구현은 /device/google/trout/hal/audio/6.0의 AOSP에 있습니다. OEM은 플랫폼의 ro.vendor.trout.audiohal.{in,out}_period_{ms,count}를 수정할 수 있고 /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에 하트비트를 계속 전송합니다.

오디오 아키텍처
그림 4. 오디오 아키텍처

블루투스

AAOS가 다른 자동차 운영체제와 함께 게스트 VM으로 실행되는 경우 Android에서는 블루투스 컨트롤러에 직접 액세스하지 못할 수 있습니다. 이 경우 Android 게스트 VM의 VirtIO-Console 드라이버와 호스트 VM의 VirtIO-Console 기기를 사용하여 가상 COM 포트를 열고 HCI 패킷을 블루투스 컨트롤러에 전송하여 이벤트를 수신할 수 있습니다. 이러한 설계로 인해 일반적이고 HW 제약이 없는 블루투스 HAL을 Android 블루투스 스택에서 사용할 수 있습니다. 호스트 VM은 블루투스 컨트롤러의 초기화 및 펌웨어 다운로드와 같은 HW 관련 작업을 처리할 수 있습니다.

블루투스 구현은 아래 설계 그림에 기반합니다.

블루투스 아키텍처
그림 5. 블루투스 아키텍처

차량 HAL

차량 HAL 구현은 다음 두 요소로 구성됩니다.

  • 클라이언트. 가상화된 AAOS에서 Android에 사용되는 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를 예로 들 수 있습니다.

확장 뷰 시스템

확장 뷰 시스템(EVS)은 후방 카메라와 서라운드 뷰 카메라로 캡처한 동영상을 표시하는 데 사용됩니다. 가상화된 AAOS에서 EVS 스택은 VirtIO-video 드라이버를 사용하는 가상화된 V4L2 스트리밍 기기의 동영상 스트림에 액세스할 수 있습니다.

차고 모드

자세한 내용은 차고 모드란 무엇인가요?를 참고하세요.

차고 모드 전환 및 종료는 차량 HAL에서 보낸 AP_POWER_STATE_REQ 속성으로 트리거됩니다. 가상화 모드에서 차고 모드는 호스트 측에서 트리거됩니다. 호스트 VM은 Android의 전원이 꺼질 때까지 Android VM용 가상 기기가 제공되도록 계속 켜져 있어야 합니다. 호스트 VM의 VHAL 서버는 AAOS 게스트 VM에 종료 신호를 보냅니다. 신호 VHAL 클라이언트를 수신하면 AAOS VM이 차고 모드로 전환되고 호스트 VM을 활성 상태로 유지하기 위해 하트비트 신호를 전송하기 시작합니다.

Dumpstate

가상화된 AAOS의 버그 신고를 생성할 때 호스트 VM 정보를 포함하여 개발자가 시스템을 더 포괄적으로 파악할 수 있도록 하는 것이 중요합니다. 이를 위해 trout 참조 구현은 GRPC-vsock을 통해 호스트 VM 정보를 수집하는 IDumpstateDevice HAL을 구현합니다. tar 패키지 호스트 VM 정보는 버그 신고에서 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
    

기타 하위 시스템

VirtIO는 이미 블록 스토리지, 네트워크, 콘솔, 입력, 소켓, 엔트로피와 같은 구성요소의 잘 정의된 인터페이스를 제공합니다. 이러한 하위 시스템에서 AAOS는 virtio-blk, virtio-input, virtio-console, virtio-net과 같은 드라이버를 있는 그대로 사용합니다.

가상화된 AAOS 참조 플랫폼에서 Wi-Fi는 mac80211_hwsim으로 지원되어 VirtWifi 무선 네트워크를 사용 설정하고 virtio-net 터널을 사용하여 네트워크 트래픽을 실제 Wi-Fi 네트워크에 직접 액세스할 수 있는 호스트 VM에 전송합니다.