توضح هذه المقالة كيفية توصيل جهازين طرفيين (Bluetooth و Wi-Fi) بمحاكي AAOS. في هذه العملية ، هناك ثلاثة مجالات خاصة بدعم السائق هي المفتاح:
- نواة الضيف
- ضيف Android
- مضيف Linux
أولاً ، تقوم بتجميع وتمكين برامج تشغيل USB ذات الصلة في نواة الضيف. بعد ذلك ، يجب على Guest Android تحديد HAL والخدمات المناسبة لإحضار برامج التشغيل. أخيرًا ، يجب أن يتمكن مضيف Linux من الوصول إلى برنامج تشغيل USB ثم نقله إلى QEMU .
تم اختبار الدونجلز
تم اختبار الدونجل التالي:
- محول ASUS USB-BT400 USBBT400
- محول بلوتوث واي فاي يو اس بي من Auscomer
قد تعمل الدونجل الأخرى ، ومع ذلك ، لم يتم اختبار أي أجهزة أخرى.
دعم USB الأصلي
تأتي QEMU مع خيارات لتمرير USB إلى المحاكي. تتعامل صورة نظام AAOS مع هاتف متصل بالفعل. للحصول على التفاصيل ، راجع ملحق Android المفتوح (AOA) .
نظرًا لأن الهاتف يغير قيم productID
vendorID
productID
عند إنشاء اتصال AOA ، فإن واجهة USB الجديدة (بالإضافة إلى واجهة USB الأصلية) ترى الجهاز عندما يكون الهاتف في وضع AOA.
لتحديد قيم vendorID
و productID
قبل وبعد وضع AOA، واستخدام 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 :
024 سيفا 0 يتضمن Emulator 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
دعم البلوتوث
لدعم عبور Bluetooth ، اختبرت Google محول ASUS USB-BT400 USB USBBT400 ومحول USB Wi-Fi Bluetooth من Auscomer.
أولاً ، تحتاج إلى إضافة دعم kernel للدونجل. لفهم مكدس Android Bluetooth ، راجع Bluetooth . بالنسبة لـ HIDL ، يستخدم المحاكي التنفيذ المحاكي. لذلك ، قم بتبديل ذلك باستخدام تطبيق Linux أصلي.
نواة الضيف
لدعم دونجل USB Bluetooth:
أضف
btusb.ko
المفقود إلى kernel الخاص بك:--- 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
، قم بتضمين HIDL الأصلي لنظام Linux والعديد من الأذونات: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 بحيث يستخدم تطبيق HIDL أصلي في 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
عندما يتم تعيين خاصية
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
أضف ملف تكوين 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
قم بتعديل ملف
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
للتحقق من صحة Bluetooth المزدوجة و Wi-Fi ، اختبرت Google باستخدام محول Bluetooth Wi-Fi USB.
نواة الضيف
يستخدم دونجل USB هذا شريحة RTL8821CU ، والتي لا يدعمها تيار kernel الرئيسي حتى الآن. يمكنك العثور على وحدة kernel مطورة حديثًا على 8821cu .
بعد ذلك ، في قائمة التغيير 1575108 ، تم دمج وحدات النواة الخارجية في مصدر نواة السمكة الذهبية لتجميعها .
أخيرًا ، تجمع وحدة kernel ولكن مع بعض أعطال CFI. تحتاج إلى تصحيح الكود يدويًا لإصلاح ذلك. للحصول على تفاصيل ، راجع Control Flow Integrity في Android kernel .
قد يكون من المفيد تمكين CONFIG_CFI_PERMISSIVE
والمضي قدمًا في تصحيح أخطاء بقية المكدس أولاً:
على أي حال ، انتقل إلى قائمة التغيير 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
قوائم التغيير في الميناء
نقل قوائم التغيير التالية:
- 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