Google cam kết thúc đẩy công bằng chủng tộc cho Cộng đồng người da đen. Xem cách thực hiện.

Hướng dẫn tích hợp qua USB giả lập

Bài viết này mô tả cách kết nối hai thiết bị ngoại vi (Bluetooth và Wi-Fi) với trình giả lập AAOS. Trong quá trình này, ba lĩnh vực cụ thể để hỗ trợ trình điều khiển là chìa khóa:

  • Hạt nhân khách
  • Khách Android
  • Máy chủ Linux

Đầu tiên, bạn biên dịch và kích hoạt các trình điều khiển USB có liên quan trong hạt nhân Khách. Tiếp theo, Khách Android phải chọn HAL và dịch vụ phù hợp để hiển thị trình điều khiển. Cuối cùng, máy chủ Linux phải có quyền truy cập vào trình điều khiển USB và sau đó chuyển nó sang QEMU .

Dongles đã được kiểm tra

Các khóa sau đã được kiểm tra:

Tuy nhiên, không có thiết bị bảo vệ nào khác có thể hoạt động.

Hỗ trợ USB gốc

QEMU đi kèm với các tùy chọn để chuyển USB vào trình giả lập. Hình ảnh hệ thống AAOS đã xử lý một điện thoại được kết nối. Để biết chi tiết, hãy xem Phụ kiện mở Android (AOA) .

Bởi vì điện thoại thay đổi giá trị cho vendorIDproductID khi thiết lập kết nối AOA, giao diện USB mới (cũng như giao diện USB gốc) thấy điện thoại khi điện thoại đang ở chế độ AOA.

Để xác định các giá trị cho vendorIDproductID trước và sau khi chế độ AOA, sử dụng 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

Ngoài ra, chuyển cổng vật lý đến 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.

Hình ảnh hệ thống AAOS nhận dạng điện thoại, đặt điện thoại ở chế độ AOA và nhận dạng lại điện thoại khi chế độ AOA đang chạy.

Để hỗ trợ chuyển qua USB, hãy xác nhận rằng bạn đang sử dụng Trình giả lập 30.5.0 :

# Check for the emulator version
$ emulator --version

Emulator 30.5.0 bao gồm nâng cấp libusb và giải pháp tạm thời để giải quyết khả năng tương thích tốc độ của hỗ trợ dongle ASUS:

Hỗ trợ Bluetooth

Để hỗ trợ truyền qua Bluetooth, Google đã thử nghiệm Bộ điều hợp USB ASUS USB-BT400 USBBT400 và Bộ điều hợp Bluetooth Wi-Fi USB của Auscomer.

Đầu tiên, bạn cần thêm hỗ trợ hạt nhân cho dongle. Để hiểu ngăn xếp Bluetooth của Android, hãy xem Bluetooth . Đối với HIDL, trình giả lập sử dụng triển khai mô phỏng. Do đó, hãy chuyển đổi điều đó bằng một triển khai Linux gốc.

Hạt nhân khách

Để hỗ trợ khóa USB Bluetooth:

  1. Thêm btusb.ko bị thiếu vào hạt nhân của bạn:

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

Khách Android

  1. Trong tệp vendor.mk , hãy bao gồm HIDL gốc Linux và một số quyền:

    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. Tạo thuộc tính đường dẫn một chiều để chuyển HIDL sao cho nó sử dụng triển khai HIDL gốc 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. Bất cứ khi nào thuộc tính qemu.preferred.bt.service được đặt thành chuyển passthrough , bạn sẽ chuyển sang triển khai 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. Thêm tệp cấu hình Bluetooth để có đầy đủ các tính năng, chẳng hạn như trên thiết bị USB thực:

    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. Sửa đổi tệp BoardConfig.mk để xác định nơi tệp cấu hình được lưu:

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

Máy chủ Linux

Trên máy chủ Linux:

  1. Cập nhật cài đặt udev để cho phép quy trình người dùng (ví dụ: QEMU) có quyền đọc / ghi:

    $ 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. Để chạy trình mô phỏng, hãy đặt các tham số dòng lệnh sau:

    # 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
    

Hỗ trợ Wi-Fi

Để xác thực Bluetooth và Wi-Fi kép, Google đã thử nghiệm với Bộ điều hợp Bluetooth Wi-Fi USB.

Hạt nhân khách

USB dongle cụ thể này sử dụng chip RTL8821CU, mà hạt nhân dòng chính ngược dòng chưa hỗ trợ. Bạn có thể tìm thấy một mô-đun hạt nhân mới được phát triển tại 8821cu .

Sau đó, trong changelist 1575108 , các mô-đun nhân bên ngoài được tích hợp vào nguồn nhân cá vàng để biên dịch nó.

Cuối cùng, mô-đun hạt nhân biên dịch nhưng với một số lỗi CFI. Bạn cần vá mã theo cách thủ công để khắc phục điều này. Để biết chi tiết, hãy xem Tính toàn vẹn của luồng điều khiển trong nhân Android .

Có thể hữu ích khi bật CONFIG_CFI_PERMISSIVE và tiếp tục gỡ lỗi phần còn lại của ngăn xếp trước:

--- a/goldfish_defconfig.fragment
+++ b/goldfish_defconfig.fragment
@@ -1,6 +1,7 @@
 CONFIG_CFI_CLANG=m
+CONFIG_CFI_PERMISSIVE=m

Trong mọi trường hợp, hãy truy cập danh sách thay đổi 1575109 để xem cách khắc phục sự cố CFI thích hợp.

Khách Android

Để tìm hiểu thêm về ngăn xếp Wi-Fi, hãy xem Tổng quan về Wi-Fi . Trình giả lập đi kèm với các cài đặt để làm cho Wi-Fi hoạt động.

Máy chủ Linux

Trên máy chủ Linux, bạn phải cập nhật cài đặt udev để cho phép quy trình người dùng (ví dụ: QEMU) có quyền đọc / ghi.

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

Để chuyển dongle sang 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

Danh sách thay đổi cổng

Chuyển các danh sách thay đổi sau: