O Google tem o compromisso de promover a igualdade racial para as comunidades negras. Saiba como.

Guia de integração do emulador USB Passthrough

Este artigo descreve como conectar dois periféricos (Bluetooth e Wi-Fi) ao emulador AAOS. Neste processo, três áreas específicas para suporte ao motorista são fundamentais:

  • Kernel convidado
  • Android Convidado
  • Host Linux

Primeiro, você compila e ativa os drivers USB relevantes no kernel do convidado. Em seguida, o Android Convidado deve selecionar o HAL e os serviços corretos para exibir os drivers. Finalmente, o host Linux deve obter acesso ao driver USB e, em seguida, transferi-lo para o QEMU .

Dongles testados

Os seguintes dongles foram testados:

Outros dongles podem funcionar, no entanto, nenhum outro foi testado.

Suporte nativo a USB

O QEMU vem com opções para passar USB para o emulador. A imagem do sistema AAOS já controla um telefone conectado. Para obter detalhes, consulte Android Open Accessory (AOA) .

Como o telefone altera os valores de vendorID e productID ao estabelecer uma conexão AOA, a nova interface USB (bem como a interface USB original) vê o dispositivo quando o telefone está no modo AOA.

Para determinar os valores para vendorID e productID antes e depois do modo AOA, use lsusb :

# Note Vendor ID and Product ID of your phone
$ lsusb
Bus 001 Device 079: ID 18d1:4ee1 Google Inc. Nexus/Pixel Device (MTP)
# Start up an emulator!
$ ./emulator @AVD_NAME -no-snapshot -qemu -device usb-ehci,id=ehci -device usb-host,bus=ehci.0,vendorid=0x18d1,productid=0x4ee1 -device usb-host,bus=ehci.0,vendorid=0x18d1,productid=0x2d00

Como alternativa, passe a porta física para QEMU:

# First plug something into the interested USB port and note the Bus and Device number.
$ lsusb
Bus 001 Device 012: ID 0bda:c820 Realtek Semiconductor Corp. 802.11ac NIC
# Now figure out where the Port number is.
$ lsusb -t
/:  Bus 01.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/12p, 480M
    |__ Port 4: Dev 12, If 1, Class=Wireless, Driver=btusb, 480M
    |__ Port 4: Dev 12, If 2, Class=Vendor Specific Class, Driver=, 480M
    |__ Port 4: Dev 12, If 0, Class=Wireless, Driver=btusb, 480M
# Launch the emulator
 ./emulator @AVD_NAME -no-snapshot -qemu -device usb-ehci,id=ehci -device usb-host,bus=ehci.0,hostbus=1,hostport=4
# Now, whatever you plug into the emulator, USB passthrough will happen on the fly.

A imagem do sistema AAOS reconhece o telefone, coloca-o no modo AOA e o reconhece novamente quando o modo AOA está em execução.

Para oferecer suporte a passagem USB, confirme se você está usando o emulador 30.5.0 :

# Check for the emulator version
$ emulator --version

O emulador 30.5.0 inclui uma atualização libusb e uma solução temporária para lidar com a compatibilidade de velocidade do suporte de dongle ASUS:

Suporte bluetooth

Para suportar a passagem de Bluetooth, o Google testou o adaptador USB ASUS USB-BT400 USBBT400 e o adaptador USB Wi-Fi Bluetooth da Auscomer.

Primeiro, você precisa adicionar suporte ao kernel para o dongle. Para entender a pilha Android Bluetooth, consulte Bluetooth . Para HIDL, o emulador usa implementação simulada. Portanto, troque isso por uma implementação nativa do Linux.

Kernel convidado

Para suportar um dongle Bluetooth USB:

  1. Adicione o btusb.ko ausente ao seu kernel:

    --- a/goldfish_defconfig.fragment
    +++ b/goldfish_defconfig.fragment
    @@ -1,6 +1,7 @@
     # CONFIG_CRYPTO_DEV_VIRTIO is not set
     CONFIG_BLK_DEV_MD=m
    +CONFIG_BT_HCIBTUSB=m
     CONFIG_CPUFREQ_DUMMY=m
    

Android Convidado

  1. No arquivo vendor.mk , inclua o HIDL nativo do Linux e várias permissões:

    PRODUCT_PACKAGES += \
        android.hardware.bluetooth@1.1-service.btlinux
    PRODUCT_COPY_FILES += \ frameworks/native/data/etc/android.hardware.usb.host.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.usb.host.xml
    
  2. Crie uma propriedade de caminho unilateral para alternar o HIDL de forma que ele use uma implementação HIDL nativa do Linux:

    selinux/common/domain.te
    
    get_prop(domain, qemu_prop)
    +get_prop(domain, vendor_build_prop)
    
    selinux/common/property_contexts
    
    qemu.cmdline            u:object_r:qemu_cmdline:s0
    +qemu.preferred.bt.service u:object_r:qemu_prop:s0
    
  3. Sempre que uma propriedade qemu.preferred.bt.service for definida como passthrough , você mudará a implementação HIDL:

    service btlinux-1.1 /vendor/bin/hw/android.hardware.bluetooth@1.1-service.btlinux
      class hal
      user bluetooth
      group bluetooth net_admin net_bt_admin
      capabilities NET_ADMIN NET_RAW SYS_NICE
      disabled
    
    on property:qemu.preferred.bt.service=passthrough
      stop vendor.bluetooth-1-1
      start btlinux-1.1
    
  4. Adicione um arquivo de configuração Bluetooth para obter todos os recursos, como em um dispositivo USB real:

    hal/bluetooth/bdroid_buildcfg.h
    
    #ifndef _BDROID_BUILDCFG_H
    #define _BDROID_BUILDCFG_H
    #define BTM_DEF_LOCAL_NAME "gCar Emulator"
    #define BTA_AV_SINK_INCLUDED TRUE
    /* Handsfree device */
    #define BTA_DM_COD {0x26, 0x04, 0x08}
    #endif
    
  5. Modifique o arquivo BoardConfig.mk para determinar onde o arquivo de configuração foi salvo:

    BoardConfig.mk
    
    # Bluetooth
    BOARD_HAVE_BLUETOOTH := true
    BOARD_BLUETOOTH_BDROID_BUILDCFG_INCLUDE_DIR := vendor/auto/embedded/hal/bluetooth
    

Host Linux

No host Linux:

  1. Atualize as configurações do udev para permitir que o processo do usuário (por exemplo, QEMU) tenha permissões de leitura / gravação:

    $ echo 'SUBSYSTEM=="usb", ATTRS{idVendor}=="0b05", ATTRS{idProduct}=="17cb", MODE="0666", GROUP="plugdev"' | sudo tee /etc/udev/rules.d/99-mynew.rules >/dev/null
    $ sudo udevadm control --reload
    $ sudo udevadm trigger
    
  2. Para executar o emulador, defina os seguintes parâmetros de linha de comando:

    # Start up an emulator!
    $ ./emulator @AVD_NAME -no-snapshot -prop qemu.preferred.bt.service=passthrough -qemu -device usb-ehci,id=ehci -device usb-host,bus=ehci.0,vendorid=0x0b05,productid=0x17cb
    # Start Bluetooth Passthrough
    

Suporte Wi-Fi

Para validar Bluetooth e Wi-Fi duplo, o Google testou com o Adaptador USB Wi-Fi Bluetooth.

Kernel convidado

Este dongle USB em particular usa o chip RTL8821CU, que o upstream do kernel principal ainda não suporta. Você pode encontrar um módulo de kernel desenvolvido recentemente em 8821cu .

Então, na lista de mudanças 1575108 , os módulos externos do kernel foram integrados ao código-fonte do kernel goldfish para compilá- lo.

Finalmente, o módulo do kernel é compilado, mas com alguns travamentos CFI. Você precisa corrigir o código manualmente para corrigir isso. Para obter detalhes, consulte Control Flow Integrity no kernel Android .

Pode ser útil habilitar CONFIG_CFI_PERMISSIVE e prosseguir com a depuração do restante da pilha primeiro:

0323b relevant80

Em qualquer caso, vá para a lista de alterações 1575109 para ver a correção adequada para as falhas de CFI.

Android Convidado

Para saber mais sobre a pilha de Wi-Fi, consulte Visão geral de Wi-Fi . O emulador vem com as configurações para fazer o Wi-Fi funcionar.

Host Linux

No host Linux, você deve atualizar as configurações do udev para permitir que o processo do usuário (por exemplo, QEMU) tenha permissões de leitura / gravação.

# /lib/udev/rules.d/40-usb_modeswitch.rules
$ ATTR{idVendor}=="0bda", ATTR{idProduct}=="1a2b", RUN+="usb_modeswitch '/%k'"
$ echo 'SUBSYSTEM=="usb", ATTRS{idVendor}=="0bda", ATTRS{idProduct}=="c820", MODE="0666", GROUP="plugdev"' | sudo tee /etc/udev/rules.d/99-mynew2.rules >/dev/null
$ sudo udevadm control --reload
$ sudo udevadm trigger

Para passar o dongle para QEMU:

# Start up an emulator!
$ ./emulator @AVD_NAME -no-snapshot -qemu -device usb-ehci,id=ehci -device usb-host,bus=ehci.0,vendorid=0x0bda,productid=0xc820

Port changelists

Transfira as seguintes changelists: