Auf dieser Seite wird beschrieben, wie Sie zwei Peripheriegeräte (Bluetooth und WLAN) verbinden. mit dem AAOS-Emulator. Dabei gibt es drei Bereiche, sind entscheidend:
- Gast-Kernel
- Gast-Android
- Linux-Host
Zuerst kompilieren und aktivieren Sie die entsprechenden USB-Treiber im Gast-Kernel. Als Nächstes muss Gast-Android den richtigen HAL und die richtigen Dienste auswählen, Treiber. Schließlich muss der Linux-Host Zugriff auf den USB-Treiber erhalten und und übertrage es an QEMU.
Dongles getestet
Die folgenden Dongle wurden getestet:
- USB-BT400-USB-Adapter USBBT400 von ASUS
- USB-WLAN-Bluetooth-Adapter von Auscomer
Andere Dongles könnten funktionieren, es wurden jedoch keine anderen getestet.
Native USB-Unterstützung
QEMU bietet Optionen zum Weiterleiten von USB an den Emulator. Das AAOS-System-Image ein verbundenes Smartphone handhabt. Weitere Informationen finden Sie unter Android Open Accessory (AOA)
Weil die Telefonnummer die Werte für vendorID
und productID
ändert,
die eine AOA-Verbindung herstellt, die neue USB-Schnittstelle (sowie die ursprüngliche
USB-Schnittstelle) das Gerät erkennt, wenn sich das Telefon im AOA-Modus befindet.
Um die Werte für vendorID
und productID
vor und nach AOA zu ermitteln
verwenden, verwenden Sie 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
Alternativ können Sie den physischen Port an QEMU übergeben:
# 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.
Das AAOS-Systemimage erkennt das Smartphone, versetzt es in den AOA-Modus und erkennt wenn der AOA-Modus ausgeführt wird.
Damit USB-Passthrough unterstützt wird, prüfen Sie, ob Sie den Emulator 30.5.0 verwenden:
# Check for the emulator version
$ emulator --version
Der Emulator 30.5.0 enthält ein libusb
-Upgrade und eine vorübergehende Problemumgehung für
Adressgeschwindigkeitskompatibilität der Unterstützung für ASUS-Dongles:
- 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
Bluetooth-Unterstützung
Zur Unterstützung von Bluetooth-Passthrough hat Google USB-BT400-USB-Adapter USBBT400 von ASUS und den USB-WLAN-Bluetooth-Adapter von Auscomer.
Zuerst müssen Sie die Kernel-Unterstützung für den Dongle hinzufügen. Um die Android-Funktionen zu verstehen Bluetooth-Stack (siehe Bluetooth). Bei HIDL verwendet der Emulator eine simulierte Implementierung. Stellen Sie daher mit einer nativen Linux-Implementierung.
Gast-Kernel
So unterstützen Sie einen USB-Bluetooth-Dongle:
Fügen Sie Ihrem Kernel das fehlende
btusb.ko
hinzu:--- 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
Gast-Android
Füge in der Datei
vendor.mk
das native Linux-HIDL und mehrere Berechtigungen: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
Erstellen Sie eine einseitige Pfadeigenschaft, um das HIDL so zu vertauschen, dass ein Native HIDL-Implementierung unter 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
Wenn eine Eigenschaft
qemu.preferred.bt.service
aufpassthrough
gesetzt ist, wechseln Sie die HIDL-Implementierung: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
Fügen Sie eine Bluetooth-Konfigurationsdatei hinzu, um alle Funktionen nutzen zu können, z. B. ein echtes USB-Gerät:
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
Ändern Sie die Datei
BoardConfig.mk
, um zu ermitteln, wo die Konfigurationsdatei gespeichert:BoardConfig.mk # Bluetooth BOARD_HAVE_BLUETOOTH := true BOARD_BLUETOOTH_BDROID_BUILDCFG_INCLUDE_DIR := vendor/auto/embedded/hal/bluetooth
Linux-Host
Auf dem Linux-Host:
Aktualisieren Sie die
udev
-Einstellungen, damit der Nutzerprozess (z. B. QEMU) Folgendes ausführen kann: Lese-/Schreibberechtigungen:$ 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
Legen Sie die folgenden Befehlszeilenparameter fest, um den Emulator auszuführen:
# 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
WLAN-Unterstützung
Um die doppelte Bluetooth- und WLAN-Kompatibilität zu prüfen, hat Google das USB-WLAN mit Bluetooth-Adapter.
Gast-Kernel
Dieser spezielle USB-Dongle nutzt den RTL8821CU-Chip, den der Mainline-Kernel Upstream noch nicht unterstützt wird. Sie finden einen neu entwickelten Kernel, bei 8821cu.
Dann, in Änderungsliste 1575108, Die externen Kernel-Module waren in den Goldfischkernel integriert. um sie zu kompilieren.
Schließlich wird das Kernelmodul kompiliert, allerdings mit einigen CFI-Abstürzen. Erforderliche Schritte Patchen Sie den Code manuell, um dieses Problem zu beheben. Weitere Informationen finden Sie unter Ablaufintegrität im Android-Kernel steuern
Es kann hilfreich sein, CONFIG_CFI_PERMISSIVE
zu aktivieren und mit der
Fehlerbehebung für den Rest des Stacks:
--- a/goldfish_defconfig.fragment
+++ b/goldfish_defconfig.fragment
@@ -1,6 +1,7 @@
CONFIG_CFI_CLANG=m
+CONFIG_CFI_PERMISSIVE=m
Gehen Sie in jedem Fall zu Änderungsliste 1575109 um die richtige Fehlerbehebung für die CFI-Abstürze zu finden.
Gast-Android
Weitere Informationen zum WLAN-Stack findest du unter WLAN-Übersicht. Der Emulator wird mit den Einstellungen geliefert, die eine WLAN-Funktion ermöglichen.
Linux-Host
Auf dem Linux-Host müssen Sie die Einstellungen von udev
aktualisieren, um den Nutzerprozess zu aktivieren
(z. B. QEMU), um Lese-/Schreibberechtigungen zu erhalten.
# /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
So übergeben Sie den Dongle an 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
Änderungslisten für den Hafen
Folgende Änderungslisten mitnehmen:
- 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