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
- AdbService –和UsbService并列, 由SystemServer启动
- 交互方式变更, 通过LocalService的AdbManagerInternal
registerTransport
注册adb监听. - adbService中adb开关的变化通过contentProvider监听, 而其他服务通过registerTransport监听adbService中的adb开关变化回调.
1
2LocalServices.getService(
AdbManagerInternal.class).registerTransport(new AdbTransport(this));
1.2. 新增adb权限
1 | <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 | protected static final String GADGET_HAL_FQ_NAME = |
平台并未采用usb gadget hal的方式. 采用的是传统的设置属性的方式
2. Host端变化
2.1. usbDeviceAdded 变化
usbDeviceAdded增加增加新的黑名单, 下面的设备插入后不会上报usbDeviceAdded广播(ACTION_USB_DEVICE_ATTACHED
), 不会上报状态(进行弹框等).
- 只上报一个接口
- 对应未插入外设的空hub
- 为鼠标HID设备
- 键盘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