Questa pagina descrive come connettere due periferiche (Bluetooth e Wi-Fi) all'emulatore AAOS. In questo processo, tre aree specifiche per l'assistenza al conducente sono fondamentali:
- Kernel guest
- Android ospite
- Host Linux
Per prima cosa, compili e abiliti i driver USB pertinenti nel kernel guest. Successivamente, l'Android ospite deve selezionare l'HAL e i servizi corretti per visualizzare autisti. Infine, l'host Linux deve avere accesso al driver USB e quindi trasferiscilo a QEMU.
Chiavette testate
Sono state testate le seguenti chiavette:
- Adattatore USB USB-BT400 ASUS USBBT400
- Adattatore USB Wi-Fi Bluetooth di Auscomer
Potrebbero funzionare anche altre chiavette, ma non ne sono state testate altre.
Supporto nativo USB
QEMU include delle opzioni per passare la connessione USB all'emulatore. Immagine di sistema AAOS gestisce già un telefono connesso. Per maggiori dettagli, vedi Accessorio Android Open (AOA).
Perché il telefono cambia i valori per vendorID
e productID
in seguito
connessione AOA, la nuova interfaccia USB (nonché quella originale
USB) rileva il dispositivo quando lo smartphone è in modalità AOA.
Per determinare i valori per vendorID
e productID
prima e dopo l'AOA
usa 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 di sistema AAOS riconosce lo smartphone, lo mette in modalità AOA e di nuovo quando è attiva la modalità AOA.
Per supportare il passthrough USB, verifica di utilizzare l'emulatore 30.5.0:
# Check for the emulator version
$ emulator --version
L'emulatore 30.5.0 include un upgrade di libusb
e una soluzione alternativa temporanea
compatibilità velocità di 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 Adattatore USB USB-BT400 ASUS USBBT400 e l'adattatore Bluetooth USB Wi-Fi di Auscomer.
Innanzitutto, devi aggiungere il supporto del kernel per la chiavetta. Per comprendere il funzionamento di Android Stack Bluetooth, vedi Bluetooth. Per HIDL, l'emulatore utilizza un'implementazione simulata. Quindi, cambia con un'implementazione Linux nativa.
Kernel guest
Per supportare un dongle Bluetooth USB:
Aggiungi l'oggetto
btusb.ko
mancante al 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 ospite
Nel file
vendor.mk
, includi il file HIDL nativo Linux e diversi 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 a senso unico per disattivare l'HIDL in modo che utilizzi una proprietà Implementazione HIDL nativa 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
, disattiverai 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, ad esempio un dispositivo USB reale:
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 si trova il file di configurazione viene salvato:BoardConfig.mk # Bluetooth BOARD_HAVE_BLUETOOTH := true BOARD_BLUETOOTH_BDROID_BUILDCFG_INCLUDE_DIR := vendor/auto/embedded/hal/bluetooth
Host Linux
Sull'host Linux:
Aggiorna le impostazioni di
udev
per consentire al processo utente (ad esempio, QEMU) di avere autorizzazioni 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, imposta 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 il Wi-Fi, Google ha eseguito un test con il Wi-Fi USB Adattatore Bluetooth.
Kernel guest
Questa chiavetta USB utilizza il chip RTL8821CU, che il kernel upstream non supporta ancora. Puoi trovare un kernel sviluppato all'indirizzo 8821cu.
Poi, nel elenco modifiche 1575108, i moduli del kernel esterni erano integrati nel kernel del pesce rosso per la compilazione.
Infine, il modulo kernel si compila ma con alcuni arresti anomali di CFI. Devi manualmente il codice per risolvere il problema. Per maggiori dettagli, vedi Controlla l'integrità del flusso nel kernel Android.
Potrebbe essere utile attivare CONFIG_CFI_PERMISSIVE
e procedere con
prima di eseguire 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 a elenco modifiche 1575109 per trovare la correzione corretta per gli arresti anomali di CFI.
Android ospite
Per scoprire di più sullo stack Wi-Fi, vedi Panoramica del Wi-Fi. L'emulatore include le impostazioni per il Wi-Fi.
Host Linux
Nell'host Linux, devi aggiornare le impostazioni di udev
per abilitare il 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 la chiavetta alla 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
Liste modifiche 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