仿真器USB直通集成指南

本文介紹如何將兩個外圍設備(藍牙和Wi-Fi)連接到AAOS仿真器。在此過程中,關鍵在於三個特定於驅動程序的區域:

  • 來賓內核
  • 來賓Android
  • Linux主機

首先,您在Guest內核中編譯並啟用相關的USB驅動程序。接下來,Guest Android必須選擇正確的HAL和服務來啟動驅動程序。最後,Linux主機必須能夠訪問USB驅動程序,然後將其傳輸到QEMU

加密狗測試

測試了以下加密狗:

其他加密狗可能也可以使用,但是沒有其他軟件經過測試。

本機USB支持

QEMU帶有將USB傳遞到仿真器的選項。 AAOS系統映像已處理已連接的電話。有關詳細信息,請參見Android Open Accessory(AOA)

由於電話在建立AOA連接時會更改vendorIDproductID值, vendorID當電話處於AOA模式時,新的USB接口(以及原始USB接口)會看到該設備。

要確定AOA模式之前和之後的vendorIDproductID的值,請使用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支持的速度兼容性:

藍牙支持

為了支持藍牙直通,Google測試了Auscomer的ASUS USB-BT400 USB適配器USBBT400和USB Wi-Fi藍牙適配器。

首先,您需要為加密狗添加內核支持。要了解Android藍牙堆棧,請參閱藍牙。對於HIDL,仿真器使用模擬的實現。因此,請使用本機Linux實現進行切換。

來賓內核

要支持USB藍牙加密狗,請執行以下操作:

  1. 將缺少的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

  1. 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
    
  2. 創建單向路徑屬性以切換出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
    
  3. 每當將屬性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
    
  4. 添加藍牙配置文件以獲取完整功能,例如在真實的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
    
  5. 修改BoardConfig.mk文件,以確定配置文件的保存位置:

    BoardConfig.mk
    
    # Bluetooth
    BOARD_HAVE_BLUETOOTH := true
    BOARD_BLUETOOTH_BDROID_BUILDCFG_INCLUDE_DIR := vendor/auto/embedded/hal/bluetooth
    

Linux主機

在Linux主機上:

  1. 更新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
    
  2. 要運行仿真器,請設置以下命令行參數:

    # 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並繼續調試其餘的堆棧可能會有所幫助:

第0323章

無論如何,請轉到更改列表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

端口更改列表

移植以下變更列表: