এই নিবন্ধটি বর্ণনা করে যে কীভাবে দুটি পেরিফেরালগুলি (ব্লুটুথ এবং ওয়াই-ফাই) এএওএস এমুলেটরের সাথে সংযুক্ত করতে হয়। এই প্রক্রিয়াতে, ড্রাইভার সমর্থনের জন্য নির্দিষ্ট তিনটি ক্ষেত্র কী:
- অতিথি কার্নেল
- অতিথি অ্যান্ড্রয়েড
- লিনাক্স হোস্ট
প্রথমে, আপনি গেস্ট কার্নেলের প্রাসঙ্গিক USB ড্রাইভারগুলি সংকলন এবং সক্ষম করে তোলেন। এর পরে, অতিথি অ্যান্ড্রয়েডকে ড্রাইভার আনতে সঠিক HAL এবং পরিষেবাদি নির্বাচন করতে হবে। অবশেষে, লিনাক্স হোস্টকে ইউএসবি ড্রাইভারের অ্যাক্সেস পেতে হবে এবং তারপরে এটি কিউইএমইউতে স্থানান্তর করতে হবে।
দংলেস পরীক্ষিত
নিম্নলিখিত dongles পরীক্ষা করা হয়েছিল:
- ASUS USB-BT400 USB অ্যাডাপ্টার USBBT400
- এসএসবি দ্বারা ইউএসবি ওয়াই-ফাই ব্লুটুথ অ্যাডাপ্টার
অন্যান্য dongles কাজ করতে পারে, তবে অন্য কোনও পরীক্ষা করা হয়নি।
নেটিভ ইউএসবি সমর্থন
কিউএমইউ এমুলেটরটিতে ইউএসবি পাস করার বিকল্পগুলির সাথে আসে। AAOS সিস্টেম চিত্র ইতিমধ্যে একটি সংযুক্ত ফোন পরিচালনা করে। বিশদগুলির জন্য, অ্যান্ড্রয়েড ওপেন অ্যাকসেসরি (এওএ) দেখুন ।
যেহেতু ফোনটি এওএ সংযোগ স্থাপনের পরে vendorID
এবং productID
vendorID
মান পরিবর্তন করে, ফোনটি এওএ মোডে থাকা অবস্থায় নতুন ইউএসবি ইন্টারফেস (পাশাপাশি মূল ইউএসবি ইন্টারফেস) ডিভাইসটি দেখবে।
মান নির্ধারণ করতে 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
বিকল্পভাবে, শারীরিক বন্দর কিউইএমইউতে পাস করুন:
# 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.
এএওএস সিস্টেম চিত্রটি ফোনটিকে স্বীকৃতি দেয়, এওএ মোডে রাখে এবং এওএ মোড চলমান থাকলে এটি আবার চিনতে পারে।
ইউএসবি পাসথ্রু সমর্থন করার জন্য, আপনি এমুলেটর 30.5.0 ব্যবহার করছেন তা নিশ্চিত করুন:
024cephaa0 এমুলেটর 30.5.0 এ ASUS ডঙ্গলের সহায়তার গতির সামঞ্জস্যতা libusb
একটি libusb
আপগ্রেড এবং অস্থায়ী workaround অন্তর্ভুক্ত:
- 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
ব্লুটুথ সমর্থন
ব্লুটুথ পাসথ্রু সমর্থন করার জন্য, গুগল আওসুমার দ্বারা ASUS USB-BT400 USB অ্যাডাপ্টার USBBT400 এবং USB ওয়াই-ফাই ব্লুটুথ অ্যাডাপ্টার পরীক্ষা করেছে tested
প্রথমত, আপনাকে ডাঙলের জন্য কার্নেল সমর্থন যুক্ত করতে হবে। অ্যান্ড্রয়েড ব্লুটুথ স্ট্যাক বুঝতে, ব্লুটুথ দেখুন । এইচআইডিএলের জন্য, এমুলেটরটি সিমুলেটেড বাস্তবায়ন ব্যবহার করে। সুতরাং, একটি স্থানীয় লিনাক্স প্রয়োগের সাথে এটি পরিবর্তন করুন।
অতিথি কার্নেল
একটি ইউএসবি ব্লুটুথ ডঙ্গল সমর্থন করতে:
অনুপস্থিত
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
অতিথি অ্যান্ড্রয়েড
vendor.mk
ফাইলে লিনাক্স নেটিভ এইচআইডিএল এবং বেশ কয়েকটি অনুমতি অন্তর্ভুক্ত করুন: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
এইচআইডিএল স্যুইচআউট করার জন্য একটি একমুখী সম্পত্তি তৈরি করুন যাতে এটি লিনাক্স নেটিভ এইচআইডিএল বাস্তবায়ন ব্যবহার করে:
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
আসল ইউএসবি ডিভাইসের মতো সম্পূর্ণ বৈশিষ্ট্যগুলি পেতে একটি ব্লুটুথ কনফিগারেশন ফাইল যুক্ত করুন:
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
লিনাক্স হোস্ট
লিনাক্স হোস্টে:
ব্যবহারকারীর প্রক্রিয়া (যেমন কিউইএমইউ) কে পড়ার / লেখার অনুমতি থাকতে অনুমতি দেওয়ার জন্য
udev
সেটিংস আপডেট করুন:$ 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 সমর্থন
দ্বৈত ব্লুটুথ এবং ওয়াই-ফাই যাচাই করতে, গুগল ইউএসবি ওয়াই-ফাই ব্লুটুথ অ্যাডাপ্টার দিয়ে পরীক্ষা করেছে।
অতিথি কার্নেল
এই নির্দিষ্ট ইউএসবি ডংলে আরটিএল ৮৮১২ সিসি চিপ ব্যবহার করে, যা মূলধারার কার্নেল আপস্ট্রিমটি এখনও সমর্থন করে না। আপনি 8821cu তে একটি নতুন বিকাশ করা কার্নেল মডিউলটি খুঁজে পেতে পারেন।
তারপরে, 1575108 চেঞ্জলিস্টে , বাহ্যিক কার্নেল মডিউলগুলি সংকলিত করার জন্য স্বর্ণফিশ কার্নেল উত্সে একীভূত করা হয়েছিল।
শেষ পর্যন্ত, কার্নেল মডিউলটি সংকলন করে তবে কয়েকটি সিএফআই ক্র্যাশ করে। এটি ঠিক করতে আপনাকে কোডটি ম্যানুয়ালি প্যাচ করতে হবে। বিশদগুলির জন্য, অ্যান্ড্রয়েড কার্নেলে কন্ট্রোল ফ্লো ইন্টিগ্রিটি দেখুন।
এটি 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 চেঞ্জলিস্টে যান।
অতিথি অ্যান্ড্রয়েড
Wi-Fi স্ট্যাক সম্পর্কে আরও জানতে, Wi-Fi ওভারভিউ দেখুন । এমুলেটরটি Wi-Fi কাজ করার জন্য সেটিংস নিয়ে আসে with
লিনাক্স হোস্ট
লিনাক্স হোস্টে আপনাকে ব্যবহারের প্রক্রিয়া (উদাহরণস্বরূপ, কিউইএমইউ) পড়ার / লেখার অনুমতি থাকতে সক্ষম করতে udev
সেটিংস আপডেট করতে হবে।
# /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
ডিঙ্গেল কিউইএমইউতে পৌঁছানোর জন্য:
# 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