Google berkomitmen untuk mendorong terwujudnya keadilan ras bagi komunitas Kulit Hitam. Lihat caranya.

Panduan Integrasi Passthrough USB Emulator

Artikel ini menjelaskan cara menghubungkan dua periferal (Bluetooth dan Wi-Fi) ke emulator AAOS. Dalam proses ini, tiga area khusus untuk dukungan pengemudi adalah kuncinya:

  • Kernel tamu
  • Tamu Android
  • Host Linux

Pertama, Anda mengkompilasi dan mengaktifkan driver USB yang relevan di kernel Tamu. Selanjutnya, Tamu Android harus memilih HAL dan layanan yang tepat untuk memunculkan driver. Terakhir, host Linux harus mendapatkan akses ke driver USB dan kemudian mentransfernya ke QEMU .

Dongle diuji

Dongle berikut telah diuji:

Dongle lain mungkin berfungsi, namun tidak ada yang lain yang diuji.

Dukungan USB asli

QEMU hadir dengan opsi untuk meneruskan USB ke emulator. Gambar sistem AAOS sudah menangani telepon yang terhubung. Untuk detailnya, lihat Android Open Accessory (AOA) .

Karena ponsel mengubah nilai vendorID dan productID setelah membuat koneksi AOA, antarmuka USB baru (serta antarmuka USB asli) melihat perangkat saat ponsel dalam mode AOA.

Untuk menentukan nilai vendorID dan productID sebelum dan sesudah mode AOA, gunakan 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

Atau, teruskan port fisik ke 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.

Gambar sistem AAOS mengenali telepon, menempatkannya dalam mode AOA, dan mengenalinya lagi ketika mode AOA sedang berjalan.

Untuk mendukung passthrough USB, pastikan Anda menggunakan Emulator 30.5.0 :

# Check for the emulator version
$ emulator --version

Emulator 30.5.0 menyertakan peningkatan libusb dan solusi sementara untuk mengatasi kompatibilitas kecepatan dukungan dongle ASUS:

Dukungan Bluetooth

Untuk mendukung passthrough Bluetooth, Google menguji ASUS USB-BT400 USB Adapter USBBT400 dan USB Wi-Fi Bluetooth Adapter dari Auscomer.

Pertama, Anda perlu menambahkan dukungan kernel untuk dongle. Untuk memahami tumpukan Bluetooth Android, lihat Bluetooth . Untuk HIDL, emulator menggunakan implementasi simulasi. Oleh karena itu, alihkan itu dengan implementasi Linux asli.

Kernel tamu

Untuk mendukung dongle USB Bluetooth:

  1. Tambahkan btusb.ko hilang ke kernel Anda:

    --- 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
    

Tamu Android

  1. Di file vendor.mk , sertakan HIDL asli Linux dan beberapa izin:

    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. Buat properti jalur satu arah untuk mengganti HIDL yang menggunakan implementasi HIDL asli 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
    
  3. Setiap kali properti qemu.preferred.bt.service disetel ke passthrough , Anda akan mengganti implementasi 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. Tambahkan file konfigurasi Bluetooth untuk mendapatkan fitur lengkap, seperti di perangkat USB asli:

    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. Ubah file BoardConfig.mk untuk menentukan di mana file konfigurasi disimpan:

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

Host Linux

Di host Linux:

  1. Perbarui pengaturan udev untuk memungkinkan proses pengguna (misalnya QEMU) memiliki izin baca / tulis:

    $ 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. Untuk menjalankan emulator, setel parameter baris perintah berikut:

    # 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
    

Dukungan Wi-Fi

Untuk memvalidasi Bluetooth ganda dan Wi-Fi, Google mengujinya dengan Adaptor Bluetooth Wi-Fi USB.

Kernel tamu

Dongle USB khusus ini menggunakan chip RTL8821CU, yang belum didukung oleh kernel jalur utama. Anda dapat menemukan modul kernel yang baru dikembangkan di 8821cu .

Kemudian, dalam daftar perubahan 1575108 , modul kernel eksternal diintegrasikan ke dalam sumber kernel ikan mas untuk mengkompilasinya.

Akhirnya, modul kernel dikompilasi tetapi dengan beberapa CFI lumpuh. Anda perlu menambal kode secara manual untuk memperbaikinya. Untuk detailnya, lihat Integritas Alur Kontrol di kernel Android .

Mungkin berguna untuk mengaktifkan CONFIG_CFI_PERMISSIVE dan melanjutkan dengan CONFIG_CFI_PERMISSIVE -debug sisa tumpukan terlebih dahulu:

0323b E5E5E580

Bagaimanapun, buka daftar perubahan 1575109 untuk melihat perbaikan yang tepat untuk CFI crash.

Tamu Android

Untuk mempelajari lebih lanjut tentang tumpukan Wi-Fi, lihat Ringkasan Wi-Fi . Emulator dilengkapi dengan pengaturan untuk membuat Wi-Fi berfungsi.

Host Linux

Di host Linux, Anda harus memperbarui pengaturan udev untuk mengaktifkan proses pengguna (misalnya, QEMU) agar memiliki izin baca / tulis.

# /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

Untuk meneruskan dongle ke 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

Daftar perubahan pelabuhan

Masukkan daftar perubahan berikut: