本頁說明如何連接兩個週邊裝置 (藍牙和 Wi-Fi) 發布至 AAOS 模擬器在這個過程中,需要提供駕駛人支援的三個面向 關鍵:
- 訪客核心
- 訪客 Android
- Linux 主機
首先,請在訪客核心中編譯並啟用相關的 USB 驅動程式。 接著,訪客 Android 必須選取正確的 HAL 和服務, 驅動程式。最後,Linux 主機必須取得 USB 驅動程式的存取權 傳輸至 QEMU。
測試連接器
以下是經過測試的連接器:
- ASUS USB-BT400 USB 變壓器 USBBT400
- Auscomer 提供的 USB Wi-Fi 藍牙轉接器
其他連接器或許也能使用,但不會測試其他連接器。
原生 USB 支援
QEMU 可選擇將 USB 傳輸線傳遞至模擬器。AAOS 系統映像檔 手機。詳情請參閱 Android Open Accessory (AOA)。
因為手機會在 vendorID
和 productID
建立 AOA 連線、新的 USB 介面 (以及原本的
USB 介面) 會在手機處於 AOA 模式時偵測到裝置。
在 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 直通式,請確認您使用的是模擬器 30.5.0:
# Check for the emulator version
$ emulator --version
模擬器 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 進行測試 ASUS USB-BT400 USB 變壓器 USBBT400 以及 Auscomer 提供的 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 核心中的流程完整性。
建議您啟用 CONFIG_CFI_PERMISSIVE
並前往
請先對堆疊的其餘部分進行偵錯:
--- a/goldfish_defconfig.fragment
+++ b/goldfish_defconfig.fragment
@@ -1,6 +1,7 @@
CONFIG_CFI_CLANG=m
+CONFIG_CFI_PERMISSIVE=m
不限情況下,請前往 變更清單 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
將 Dongle 傳遞至 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
通訊埠變更清單
匯入下列變更清單:
- 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