USB连接

USB连接


USB相关的主要类:

frameworks\base\services\usb\java\com\android\server\usb\UsbService.java

frameworks\base\services\usb\java\com\android\server\usb\UsbDeviceManager.java


注册USB设备监听

在UsbService启动流程中,已经讲到在Lifecycle的onStart()方法中new UsbService对象

publicUsbService(Context context) {

       ……

       //ALSAAdvancedLinux Sound Architecture的缩写,高级Linux声音架构的简称,它在Linux        //操作系统上提供了音频和MIDIMusicalInstrument Digital Interface,音乐设备数字化接口)       //的支持

       mAlsaManager = new UsbAlsaManager(context);

    ……

       if (newFile("/sys/class/android_usb").exists()) {

               //new UsbDeviceManager对象

        mDeviceManager = newUsbDeviceManager(context, mAlsaManager);

    }

}

 

接下来看下UsbDeviceManager的构造方法

 

publicUsbDeviceManager(Context context, UsbAlsaManager alsaManager) {

       ……

       mHandler = newUsbHandler(FgThread.get().getLooper());

       ……

}


在UsbHandler的构造方法中startObserving

 

//设置默认USB模式为chargeonly

mCurrentFunctions= SystemProperties.get(USB_CONFIG_PROPERTY,

                       UsbManager.USB_FUNCTION_NONE);


mUEventObserver.startObserving(USB_STATE_MATCH);

mUEventObserver.startObserving(ACCESSORY_START_MATCH);

mUEventObserver.startObserving(MTP_STATE_MATCH);


    /*
     * Listens for uevent messages from the kernel to monitor the USB state
     */
    private final UEventObserver mUEventObserver = new UEventObserver() {
        @Override
        public void onUEvent(UEventObserver.UEvent event) {
            if (DEBUG) Slog.v(TAG, "USB UEVENT: " + event.toString());

            String state = event.get("USB_STATE");
            String accessory = event.get("ACCESSORY");
            if (state != null) {
                mHandler.updateState(state);
            } else if ("START".equals(accessory)) {
                if (DEBUG) Slog.d(TAG, "got accessory start");
                startAccessoryMode();
            }
        }
    };

USB连接流程分析

1.     UEventObserver监听到USB连接后,调用updateState

 

State的状态是CONNECTED


发送MSG_UPDATE_STATE


调用updateUsbNotification()和updateUsbStateBroadcastIfNeeded()方法

updateUsbNotification()弹出通知

2.     updateUsbStateBroadcastIfNeeded()

USB连接_第1张图片

3.     MtpReceiver接收ACTION_USB_STATE

收到广播后调用handleUsbState()方法,启动MtpService



4.     MtpService.java -- > onStartCommand()

在onStartCommand()中会调用manageServiceLocked,

new MtpServer

USB连接_第2张图片

USB连接_第3张图片

USB连接_第4张图片

当切换不同模式,PC端显示是不一样的,charge only时PC端不显示手机信息,ptp会显示内部存储,mtp则显示内部存储和外部存储信息

代码可以看出当mMtpDisabled为false时,才会触发addStorageDevicesLocked(),当charge only模式时mMtpDisabled为true(Disable 禁用)

USB连接_第5张图片

当mPtpMode是true时,addStorageLocked只会加载内部存储

Mtp模式时,addStorageLocked则会遍历mVolumeMap

 

在addStorageLocked方法中



MtpServer相当于一个服务器

MtpStorage对应一个"存储单元"

MtpDatabase充当着数据库的功能


USB连接_第6张图片

需要说明的一点,pc端和手机内部显示不一致,这是Google Design。会Reserve 一部分存储空间,为防止内部存储被拷贝满而影响手机正常使用


USB连接_第7张图片

你可能感兴趣的:(USB)