本文介绍如何将两个外围设备(蓝牙和Wi-Fi)连接到AAOS仿真器。在此过程中,关键在于三个特定于驱动程序的区域:
- 来宾内核
- 来宾Android
- Linux主机
首先,您在Guest内核中编译并启用相关的USB驱动程序。接下来,Guest Android必须选择正确的HAL和服务来启动驱动程序。最后,Linux主机必须访问USB驱动程序,然后将其传输到QEMU 。
加密狗测试
测试了以下加密狗:
- 华硕USB-BT400 USB适配器USBBT400
- Auscomer的USB Wi-Fi蓝牙适配器
其他加密狗可能也可以使用,但是没有其他软件经过测试。
本机USB支持
QEMU带有将USB传递到仿真器的选项。 AAOS系统映像已处理已连接的电话。有关详细信息,请参见Android Open Accessory(AOA) 。
由于电话在建立AOA连接时会更改vendorID
和productID
值, vendorID
当电话处于AOA模式时,新的USB接口(以及原始USB接口)可以看到设备。
要确定AOA模式之前和之后的vendorID
和productID
的值,请使用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
或者,将物理端口传递给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.
AAOS系统映像可以识别电话,将其置于AOA模式,然后在AOA模式运行时再次识别它。
要支持USB直通,请确认您使用的是Emulator 30.5.0 :
# Check for the emulator version
$ emulator --version
Emulator 30.5.0包括libusb
升级和临时解决方法,以解决ASUS dongle支持的速度兼容性:
- 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
蓝牙支持
为了支持蓝牙直通,Google测试了Auscomer的ASUS USB-BT400 USB适配器USBBT400和USB Wi-Fi蓝牙适配器。
首先,您需要为加密狗添加内核支持。要了解Android蓝牙堆栈,请参阅蓝牙。对于HIDL,仿真器使用模拟的实现。因此,请使用本机Linux实现对其进行切换。
来宾内核
要支持USB蓝牙加密狗,请执行以下操作:
将缺少的
btusb.ko
添加到您的内核中:--- 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
在
vendor.mk
文件中,包括Linux本机HIDL和几个权限: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
创建单向路径属性以切换出HIDL,使其使用Linux本机HIDL实现:
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
每当将属性
qemu.preferred.bt.service
设置为passthrough
,您都将切换出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
添加蓝牙配置文件以获取完整功能,例如在真实的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
修改
BoardConfig.mk
文件,以确定配置文件的保存位置:BoardConfig.mk # Bluetooth BOARD_HAVE_BLUETOOTH := true BOARD_BLUETOOTH_BDROID_BUILDCFG_INCLUDE_DIR := vendor/auto/embedded/hal/bluetooth
Linux主机
在Linux主机上:
更新
udev
设置以允许用户进程(例如QEMU)具有读/写权限:$ 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
要运行仿真器,请设置以下命令行参数:
# 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
Wi-Fi支持
为了验证双蓝牙和Wi-Fi,Google使用USB Wi-Fi蓝牙适配器进行了测试。
来宾内核
该特定的USB软件狗使用RTL8821CU芯片,上游主线内核尚不支持该芯片。您可以在8821cu上找到新开发的内核模块。
然后,在变更列表1575108中,将外部内核模块集成到goldfish内核源代码中进行编译。
最后,内核模块可以编译,但是会发生一些CFI崩溃。您需要手动修补代码以解决此问题。有关详细信息,请参阅Android内核中的Control Flow Integrity 。
启用CONFIG_CFI_PERMISSIVE
并继续调试其余的堆栈可能会有所帮助:
无论如何,请转到更改列表1575109以查看CFI崩溃的正确修复程序。
来宾Android
要了解有关Wi-Fi堆栈的更多信息,请参阅Wi-Fi概述。该仿真器随附有使Wi-Fi正常工作的设置。
Linux主机
在Linux主机上,必须更新udev
设置以使用户进程(例如QEMU)具有读/写权限。
# /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
要将加密狗传递给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
端口变更列表
移植以下变更列表: