توضّح هذه الصفحة طريقة توصيل جهازَين ملحقَين (البلوتوث وWi-Fi). إلى محاكي AAOS. تتضمّن هذه العملية ثلاثة جوانب خاصة بدعم السائق أساسية:
- نواة الضيوف
- وضع "Android للضيوف"
- مضيف Linux
أولاً، عليك تجميع برامج تشغيل USB ذات الصلة وتمكينها في نواة الضيف. بعد ذلك، يجب على Android للضيوف تحديد طبقة تجريد الأجهزة (HAL) والخدمات المناسبة لإظهار السائقين. أخيرًا، يجب أن يتمكن مضيف Linux من الوصول إلى برنامج تشغيل USB ثم نقله إلى QEMU.
تم اختبار المفاتيح الإلكترونية
تم اختبار المفاتيح الإلكترونية التالية:
- محوّل USB USB-BT400 من ASUS USBBT400
- محوّل بلوتوث Wi-Fi بمنفذ USB من Auscomer
قد يصلح استخدام مفاتيح إلكترونية أخرى، ولكن لم يتم اختبار أي مفاتيح أخرى.
التوافق الأصلي مع USB
تتوفّر أداة QEMU مع خيارات لتمرير USB إلى المحاكي. صورة نظام AAOS يتعامل حاليًا مع هاتف متصل. للحصول على التفاصيل، يمكنك مراجعة ملحق Android المفتوح (AOA):
لأنّ الهاتف يغيّر قيم 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، تأكَّد من استخدام المحاكي 30.5.0:
# Check for the emulator version
$ emulator --version
يتضمن المحاكي 30.5.0 ترقية لـ libusb
وحل بديل مؤقت
توافق سرعة العنوان مع دعم جهاز دونجل 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
دعم البلوتوث
لإتاحة عبور البلوتوث، اختبرت Google محوّل USB USB-BT400 من ASUS USBBT400 وUSB Wi-Fi Bluetooth Adapter من Auscomer.
أولاً، تحتاج إلى إضافة دعم kernel للمفتاح الإلكتروني. لفهم نظام Android، حزمة البلوتوث، يُرجى الاطّلاع على البلوتوث. وبالنسبة إلى HIDL، يستخدم المحاكي عملية تنفيذ مُحاكية. لذلك، قم بتبديل من خلال تنفيذ نظام تشغيل Linux أصلي.
نواة الضيوف
لإتاحة استخدام مفتاح البلوتوث الخارجي:
أضِف السمة
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 للضيوف"
في ملف
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
أضف ملف تهيئة بلوتوث للحصول على الميزات الكاملة، مثل جهاز 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
للتحقّق من اتصال البلوتوث وشبكة Wi-Fi، اختبرت Google هذا الاتصال من خلال منفذ USB Wi-Fi. محوّل بلوتوث
نواة الضيوف
وتستخدم وحدة USB دونجل هذه الشريحة RTL8821CU، وهي النواة الرئيسية والتحميل لا يدعمها بعد. يمكنك العثور على نواة مطورة حديثًا على 8821cu.
بعد ذلك، في قائمة التغييرات 1575108 تم دمج وحدات النواة الخارجية في نواة السمك الذهبي والمصدر لتجميعها.
في النهاية، يتم تجميع وحدة النواة (kernel) ولكن مع بعض أعطال CFI. عليك إجراء ما يلي: تصحيح التعليمات البرمجية يدويًا لإصلاح ذلك. للحصول على التفاصيل، يمكنك مراجعة التحكّم في سلامة التدفق في نواة Android
قد يكون من المفيد تفعيل 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
قوائم تغييرات المنافذ
انقل قوائم التغييرات التالية:
- 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