Halaman ini menjelaskan cara menghubungkan dua periferal (Bluetooth dan Wi-Fi) ke emulator AAOS. Dalam proses ini, tiga bidang khusus untuk dukungan pengemudi adalah kuncinya:
- Kernel tamu
- Tamu Android
- tuan rumah Linux
Pertama, Anda mengkompilasi dan mengaktifkan driver USB yang relevan di kernel Tamu. Selanjutnya, Guest 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:
- Adaptor USB ASUS USB-BT400 USBBT400
- Adaptor Bluetooth Wi-Fi USB oleh Aucomer
Dongle lain mungkin berfungsi, namun tidak ada dongle lain yang diuji.
Dukungan USB asli
QEMU hadir dengan opsi untuk meneruskan USB ke emulator. Citra sistem AAOS sudah menangani telepon yang terhubung. Untuk mengetahui detailnya, lihat Aksesori Terbuka Android (AOA) .
Karena ponsel mengubah nilai vendorID
dan productID
saat membuat koneksi AOA, antarmuka USB baru (serta antarmuka USB asli) melihat perangkat saat ponsel berada 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
Alternatifnya, 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.
Citra sistem AAOS mengenali telepon, menempatkannya dalam mode AOA, dan mengenalinya lagi ketika mode AOA sedang berjalan.
Untuk mendukung USB passthrough, konfirmasikan 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:
- 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
dukungan Bluetooth
Untuk mendukung passthrough Bluetooth, Google menguji Adaptor USB ASUS USB-BT400 USBBT400 dan Adaptor Bluetooth Wi-Fi USB oleh Aucomer.
Pertama, Anda perlu menambahkan dukungan kernel untuk dongle. Untuk memahami tumpukan Bluetooth Android, lihat Bluetooth . Untuk HIDL, emulator menggunakan implementasi simulasi. Oleh karena itu, gantilah dengan implementasi Linux asli.
Kernel tamu
Untuk mendukung dongle USB Bluetooth:
Tambahkan
btusb.ko
yang 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
Dalam 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
Buat properti jalur satu arah untuk mengganti HIDL sehingga 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
Setiap kali properti
qemu.preferred.bt.service
diatur kepassthrough
, 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
Tambahkan file konfigurasi Bluetooth untuk mendapatkan fitur lengkap, seperti pada 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
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
tuan rumah Linux
Di host Linux:
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
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 upstream arus utama. Anda dapat menemukan modul kernel yang baru dikembangkan di 8821cu .
Kemudian, di changelist 1575108 , modul kernel eksternal diintegrasikan ke dalam sumber kernel ikan mas untuk dikompilasi.
Terakhir, modul kernel dikompilasi tetapi dengan beberapa kerusakan CFI. Anda perlu menambal kode secara manual untuk memperbaikinya. Untuk detailnya, lihat Integritas Aliran Kontrol di kernel Android .
Mungkin berguna untuk mengaktifkan CONFIG_CFI_PERMISSIVE
dan melanjutkan dengan men-debug sisa tumpukan terlebih dahulu:
--- a/goldfish_defconfig.fragment
+++ b/goldfish_defconfig.fragment
@@ -1,6 +1,7 @@
CONFIG_CFI_CLANG=m
+CONFIG_CFI_PERMISSIVE=m
Bagaimanapun, buka daftar perubahan 1575109 untuk melihat perbaikan yang tepat untuk kerusakan Keuangan.
Tamu Android
Untuk mempelajari lebih lanjut tentang tumpukan Wi-Fi, lihat Ikhtisar Wi-Fi . Emulator dilengkapi dengan pengaturan untuk membuat Wi-Fi berfungsi.
tuan rumah Linux
Di host Linux, Anda harus memperbarui pengaturan udev
untuk mengaktifkan proses pengguna (misalnya, QEMU) untuk 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 port
Port daftar perubahan berikut: