0%

AndroidQ Usb差异对比

1. Device变化

1.1. adb重构

将adb调试相关的类抽出到新包com.android.server.adb中.

  • 包名变化
    com.android.server.usb ->com.android.server.adb
  • 目录文件变更
  • /frameworks/base/services/usb/java/com/android/server/usb ->
    /frameworks/base/services/core/java/com/android/server/adb

UsbDebuggingManager.java ->AdbDebuggingManager.java
从UsbService中抽出AdbService.java

原有的UsbDebuggingManager变为AdbDebuggingManager
新增: /frameworks/base/services/core/java/com/android/server/adb

  1. AdbService –和UsbService并列, 由SystemServer启动
  2. 交互方式变更, 通过LocalService的AdbManagerInternal registerTransport注册adb监听.
  3. adbService中adb开关的变化通过contentProvider监听, 而其他服务通过registerTransport监听adbService中的adb开关变化回调.
    1
    2
    LocalServices.getService(
    AdbManagerInternal.class).registerTransport(new AdbTransport(this));

1.2. 新增adb权限

1
2
3
4
<permission android:name="android.permission.MANAGE_DEBUGGING"
android:protectionLevel="signature|privileged" />
<!-- Permission to control Android Debug Bridge (ADB) -->
<uses-permission android:name="android.permission.MANAGE_DEBUGGING" />

allowDebugging denyDebugging clearDebuggingKeys方法中会鉴权, 还是UsbDeviceManager中操作.

1.3. port 重构

Expose UsbPort and UsbPortStatus as system API

This is needed by making the setup wizard use only system-api? 只有usb settings包用到了,没看到其他app使用.

新增文件
core/java/android/hardware/usb/ParcelableUsbPort.java

1.4. usb gadget hal方式切换usb function避免reset

注册监听android.hardware.usb.gadget@1.0::IUsbGadget服务的通知, 该服务启动时会回调onRegistration方法.
服务启动后, 根据启动状态设置preexisting标记, 如果之前未启动过, 会重设usb默认function. 之前启动过, 则不设置.
避免因service重启导致的usb属性被reset

This will overcome the occasional reset of the usb gadget hence the connection during phone bootup.

1
2
3
4
protected static final String GADGET_HAL_FQ_NAME =
"android.hardware.usb.gadget@1.0::IUsbGadget";
boolean ret = IServiceManager.getService()
.registerForNotifications(GADGET_HAL_FQ_NAME, "", serviceNotification);

平台并未采用usb gadget hal的方式. 采用的是传统的设置属性的方式

2. Host端变化

2.1. usbDeviceAdded 变化

usbDeviceAdded增加增加新的黑名单, 下面的设备插入后不会上报usbDeviceAdded广播(ACTION_USB_DEVICE_ATTACHED), 不会上报状态(进行弹框等).

  • 只上报一个接口
  1. 对应未插入外设的空hub
  2. 为鼠标HID设备
  3. 键盘HID设备

2.2. UsbSettingsManager重构

USB permission and resolve activity refactor.
Pure refactor of USB code for simple Arc logic injection.

从UsbProfileGroupSettingsManager.java中抽出services/usb/java/com/android/server/usb/UsbHandlerManager.java
专门负责resolve activity, 手机作为host使用时(通常是两台手机互联时), 解析弹出默认的activity行为.

从UsbUserSettingsManager.java中抽出services/usb/java/com/android/server/usb/UsbPermissionManager.java专门负责权限管理.
DevicePermission 和 AccessoryPermission(APP打开读取连接的device设备的权限和配件模式下打开配件的权限控制及授权框的管理等.)

2.3. Require permission to read USB device’s serial number

新增文件

  • core/java/android/hardware/usb/IUsbSerialReader.aidl
  • services/usb/java/com/android/server/usb/UsbSerialReader.java

对应连接的device设备或accessory(配件设备), 应用(SDK>=Q)包读取设备的SerialNumber时会先进行鉴权(DevicePermission和AccessoryPermission), 鉴权失败会报异常.

Serial number的来源:

  • 对应accessory(配件设备)
    来自/dev/usb_accessory设备节点中读取的ACCESSORY_GET_STRING_SERIAL
  • 对应Device设备
    对device文件进行usb_device_control_transfer通信USB_REQ_GET_DESCRIPTOR读出的serial_number字段.

app访问方式:
UsbDevice.getSerialNumber() –> IUsbSerialReader.getSerial