Questa pagina descrive come connettere due periferiche (Bluetooth e Wi-Fi) all'emulatore AAOS. In questo processo, tre aree specifiche del supporto al conducente sono fondamentali:
- Kernel ospite
- Ospite Android
- Ospite Linux
Innanzitutto, compili e abiliti i driver USB rilevanti nel kernel Guest. Successivamente, Guest Android deve selezionare l'HAL e i servizi corretti per visualizzare i driver. Infine, l'host Linux deve accedere al driver USB e quindi trasferirlo su QEMU .
Dongle testati
Sono stati testati i seguenti dongle:
- ASUS USB-BT400 Adattatore USB USBBT400
- Adattatore USB Wi-Fi Bluetooth di Auscomer
Altri dongle potrebbero funzionare, tuttavia nessun altro è stato testato.
Supporto USB nativo
QEMU viene fornito con opzioni per passare l'USB all'emulatore. L'immagine del sistema AAOS gestisce già un telefono connesso. Per i dettagli, consulta Accessorio Android Open (AOA) .
Poiché il telefono modifica i valori per vendorID
e productID
quando stabilisce una connessione AOA, la nuova interfaccia USB (così come l'interfaccia USB originale) vede il dispositivo quando il telefono è in modalità AOA.
Per determinare i valori per vendorID
e productID
prima e dopo la modalità AOA, utilizzare 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
In alternativa, passa la porta fisica a 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.
L'immagine del sistema AAOS riconosce il telefono, lo mette in modalità AOA e lo riconosce nuovamente quando la modalità AOA è in esecuzione.
Per supportare il passthrough USB, conferma di utilizzare l'emulatore 30.5.0 :
# Check for the emulator version
$ emulator --version
L'emulatore 30.5.0 include un aggiornamento libusb
e una soluzione temporanea per risolvere la compatibilità della velocità del supporto del 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
Supporto Bluetooth
Per supportare il passthrough Bluetooth, Google ha testato l'adattatore USB ASUS USB-BT400 USBBT400 e l'adattatore USB Wi-Fi Bluetooth di Auscomer.
Innanzitutto è necessario aggiungere il supporto del kernel per il dongle. Per comprendere lo stack Bluetooth di Android, consulta Bluetooth . Per HIDL, l'emulatore utilizza l'implementazione simulata. Pertanto, cambialo con un'implementazione Linux nativa.
Kernel ospite
Per supportare un dongle Bluetooth USB:
Aggiungi il
btusb.ko
mancante al tuo 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
Ospite Android
Nel file
vendor.mk
, includi l'HIDL nativo di Linux e diverse autorizzazioni: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
Crea una proprietà del percorso unidirezionale per disattivare l'HIDL in modo che utilizzi un'implementazione HIDL nativa di 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
Ogni volta che una proprietà
qemu.preferred.bt.service
è impostata supassthrough
, cambierai l'implementazione 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
Aggiungi un file di configurazione Bluetooth per ottenere funzionalità complete, come su un vero dispositivo USB:
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
Modifica il file
BoardConfig.mk
per determinare dove viene salvato il file di configurazione:BoardConfig.mk # Bluetooth BOARD_HAVE_BLUETOOTH := true BOARD_BLUETOOTH_BDROID_BUILDCFG_INCLUDE_DIR := vendor/auto/embedded/hal/bluetooth
Ospite Linux
Sull'host Linux:
Aggiorna le impostazioni
udev
per consentire al processo utente (ad esempio, QEMU) di avere permessi di lettura/scrittura:$ 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
Per eseguire l'emulatore, impostare i seguenti parametri della riga di 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
Supporto Wi-Fi
Per convalidare il doppio Bluetooth e Wi-Fi, Google ha eseguito un test con l'adattatore Bluetooth Wi-Fi USB.
Kernel ospite
Questo particolare dongle USB utilizza il chip RTL8821CU, che il kernel principale upstream non supporta ancora. Puoi trovare un modulo del kernel appena sviluppato su 8821cu .
Quindi, nella changelist 1575108 , i moduli del kernel esterno sono stati integrati nel sorgente del kernel goldfish per farlo compilare.
Alla fine, il modulo del kernel viene compilato ma con alcuni arresti anomali del CFI. È necessario applicare manualmente la patch al codice per risolvere questo problema. Per i dettagli, consulta Integrità del flusso di controllo nel kernel Android .
Potrebbe essere utile abilitare CONFIG_CFI_PERMISSIVE
e procedere prima con il debug del resto dello stack:
--- a/goldfish_defconfig.fragment
+++ b/goldfish_defconfig.fragment
@@ -1,6 +1,7 @@
CONFIG_CFI_CLANG=m
+CONFIG_CFI_PERMISSIVE=m
In ogni caso, vai all'elenco delle modifiche 1575109 per vedere la soluzione corretta per gli arresti anomali del CFI.
Ospite Android
Per ulteriori informazioni sullo stack Wi-Fi, consulta Panoramica Wi-Fi . L'emulatore viene fornito con le impostazioni per far funzionare il Wi-Fi.
Ospite Linux
Sull'host Linux, è necessario aggiornare le impostazioni udev
per consentire al processo utente (ad esempio, QEMU) di avere autorizzazioni di lettura/scrittura.
# /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
Per passare il dongle a 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
Elenchi di modifiche delle porte
Trasferisci i seguenti elenchi di modifiche:
- 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