Esta página descreve como conectar dois periféricos (Bluetooth e Wi-Fi) ao emulador AAOS. Neste processo, três áreas específicas do suporte ao driver são fundamentais:
- Kernel convidado
- Android convidado
- Hospedeiro Linux
Primeiro, você compila e habilita os drivers USB relevantes no kernel convidado. Em seguida, o Guest Android deve selecionar o HAL e os serviços corretos para exibir os drivers. Finalmente, o host Linux deve obter acesso ao driver USB e depois transferi-lo para o QEMU .
Dongles testados
Os seguintes dongles foram testados:
- Adaptador USB ASUS USB-BT400 USBBT400
- Adaptador USB Wi-Fi Bluetooth da Auscomer
Outros dongles podem funcionar, porém nenhum outro foi testado.
Suporte USB nativo
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 Acessório Android Open (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 de 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
Alternativamente, passe a porta física para o 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 à passagem USB, confirme que você está usando o Emulator 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 resolver a compatibilidade de velocidade do suporte do dongle ASUS:
- https://android-review.googlesource.com/c/platform/external/qemu/+/1573247
- https://android-review.googlesource.com/c/platform/external/qemu/+/1580924
- https://android-review.googlesource.com/c/platform/external/libusb/+/1580923
Suporte Bluetooth
Para suportar a passagem 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 de kernel para o dongle. Para entender a pilha Bluetooth do Android, 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 USB Bluetooth:
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
No arquivo
vendor.mk
, inclua o HIDL nativo do Linux e diversas 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
Crie uma propriedade de caminho unidirecional 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
Sempre que uma propriedade
qemu.preferred.bt.service
for definida comopassthrough
, você mudará a implementação do 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
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
Modifique o arquivo
BoardConfig.mk
para determinar onde o arquivo de configuração será salvo:BoardConfig.mk # Bluetooth BOARD_HAVE_BLUETOOTH := true BOARD_BLUETOOTH_BDROID_BUILDCFG_INCLUDE_DIR := vendor/auto/embedded/hal/bluetooth
Hospedeiro Linux
No host Linux:
Atualize as configurações
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
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 duplos, o Google testou o adaptador USB Wi-Fi Bluetooth.
Kernel convidado
Este dongle USB específico usa o chip RTL8821CU, que o upstream do kernel principal ainda não suporta. Você pode encontrar um módulo de kernel recentemente desenvolvido em 8821cu .
Então, na changelist 1575108 , os módulos externos do kernel foram integrados à fonte do kernel goldfish para compilá-lo.
Finalmente, o módulo do kernel compila, mas com algumas falhas de CFI. Você precisa corrigir o código manualmente para corrigir isso. Para obter detalhes, consulte Integridade do fluxo de controle no kernel do Android .
Pode ser útil ativar CONFIG_CFI_PERMISSIVE
e prosseguir com a depuração do restante da pilha primeiro:
--- a/goldfish_defconfig.fragment
+++ b/goldfish_defconfig.fragment
@@ -1,6 +1,7 @@
CONFIG_CFI_CLANG=m
+CONFIG_CFI_PERMISSIVE=m
De qualquer forma, vá para changelist 1575109 para ver a correção adequada para as falhas de CFI.
Android convidado
Para saber mais sobre a pilha Wi-Fi, consulte Visão geral do Wi-Fi . O emulador vem com as configurações para fazer o Wi-Fi funcionar.
Hospedeiro Linux
No host Linux, você deve atualizar as configurações 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 o 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
Listas de alterações de portas
Porte as seguintes listas de alterações:
- https://android-review.googlesource.com/c/kernel/common-modules/virtual-device/+/1575107
- https://android-review.googlesource.com/c/kernel/common-modules/virtual-device/+/1575108
- https://android-review.googlesource.com/c/kernel/common-modules/virtual-device/+/1575109