Google は、黒人コミュニティに対する人種平等の促進に取り組んでいます。取り組みを見る

エミュレータUSBパススルー統合ガイド

この記事では、2つの周辺機器(BluetoothとWi-Fi)をAAOSエミュレーターに接続する方法について説明します。このプロセスでは、ドライバーサポートに固有の3つの領域が重要です。

  • ゲストカーネル
  • ゲストAndroid
  • Linuxホスト

まず、ゲストカーネルで関連するUSB​​ドライバーをコンパイルして有効にします。次に、ゲストAndroidは、ドライバーを起動するために適切なHALとサービスを選択する必要があります。最後に、LinuxホストはUSBドライバーにアクセスして、それをQEMUに転送する必要があります。

テストされたドングル

次のドングルがテストされました。

他のドングルは機能する可能性がありますが、他のドングルはテストされていません。

ネイティブUSBサポート

QEMUには、USBをエミュレーターに渡すオプションが付属しています。 AAOSシステムイメージは、接続された電話をすでに処理しています。詳細については、 Android Open Accessory(AOA)を参照してください。

電話機はAOA接続の確立時にvendorIDproductID値を変更するため、電話機がAOAモードの場合、新しいUSBインターフェイス(および元のUSBインターフェイス)はデバイスを認識します。

AOAモードの前後のvendorIDproductID値を決定するには、 vendorIDを使用し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

Emulator 30.5.0には、ASUSドングルサポートの速度互換性に対処するためのlibusbアップグレードと一時的な回避策が含まれています。

Bluetoothのサポート

Bluetoothパススルーをサポートするために、GoogleはAuscomerによるASUS USB-BT400USBアダプターUSBBT400およびUSBWi-FiBluetoothアダプターをテストしました。

まず、ドングルのカーネルサポートを追加する必要があります。 AndroidのBluetoothスタックを理解するために、参照のBluetoothを。 HIDLの場合、エミュレーターはシミュレートされた実装を使用します。したがって、ネイティブLinux実装に切り替えてください。

ゲストカーネル

USB Bluetoothドングルをサポートするには:

  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. LinuxネイティブHIDL実装を使用するように、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.servicepassthroughに設定されているqemu.preferred.bt.serviceは常に、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. Bluetooth構成ファイルを追加して、実際の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サポート

デュアルBluetoothとWi-Fiを検証するために、GoogleはUSB Wi-FiBluetoothアダプターでテストしました。

ゲストカーネル

この特定のUSBドングルは、RTL8821CUチップを使用しますが、メインラインカーネルアップストリームはまだサポートしていません。新しく開発されたカーネルモジュールは8821cuにあります。

次に、 チェンジリスト1575108で、外部カーネルモジュールが金魚カーネルソースに統合され、コンパイルされました。

最後に、カーネルモジュールはコンパイルされますが、いくつかのCFIがクラッシュします。これを修正するには、コードに手動でパッチを適用する必要があります。詳細については、 Androidカーネルのコントロールフローの整合性を参照してください。

CONFIG_CFI_PERMISSIVEを有効にして、最初にスタックの残りの部分のデバッグを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

ドングルを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

ポートチェンジリスト

次のチェンジリストを移植します。