整体的逻辑流程
对应的代码和log 分析如下:
1,UsbDeviceManager.java 中监听 kernel 上报的 UEvent 事件,
这里 USB UEVENT: {SUBSYSTEM=misc, MAJOR=10, SEQNUM=2022, ACTION=change, ACCESSORY=START, DEVNAME=usb_accessory, MINOR=41, DEVPATH=/devices/virtual/misc/usb_accessory}
215 /*
216 * Listens for uevent messages from the kernel to monitor the USB state
217 */
218 private final class UsbUEventObserver extends UEventObserver {
219 @Override
220 public void onUEvent(UEventObserver.UEvent event) {
221 if (DEBUG) Slog.v(TAG, "USB UEVENT: " + event.toString());
222
223 String state = event.get("USB_STATE");
224 String accessory = event.get("ACCESSORY");
225 if (state != null) {
226 mHandler.updateState(state);
227 } else if ("START".equals(accessory)) {
228 if (DEBUG) Slog.d(TAG, "got accessory start");
229 startAccessoryMode();
230 }
231 }
232 }
2,进入startAccessoryMode
410 private void startAccessoryMode() {
411 if (!mHasUsbAccessory) return;
412
413 mAccessoryStrings = nativeGetAccessoryStrings();
414 boolean enableAudio = (nativeGetAudioMode() == AUDIO_MODE_SOURCE);
415 // don't start accessory mode if our mandatory strings have not been set
416 boolean enableAccessory = (mAccessoryStrings != null &&
417 mAccessoryStrings[UsbAccessory.MANUFACTURER_STRING] != null &&
418 mAccessoryStrings[UsbAccessory.MODEL_STRING] != null);
419
420 long functions = UsbManager.FUNCTION_NONE;
421 if (enableAccessory) {
422 functions |= UsbManager.FUNCTION_ACCESSORY;
423 }
424 if (enableAudio) {
425 functions |= UsbManager.FUNCTION_AUDIO_SOURCE;
426 }
427
428 if (functions != UsbManager.FUNCTION_NONE) {
429