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) {
……
//ALSA是AdvancedLinux Sound Architecture的缩写,高级Linux声音架构的简称,它在Linux //操作系统上提供了音频和MIDI(MusicalInstrument 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()
3. MtpReceiver接收ACTION_USB_STATE
收到广播后调用handleUsbState()方法,启动MtpService
4. MtpService.java -- > onStartCommand()
在onStartCommand()中会调用manageServiceLocked,
new MtpServer
当切换不同模式,PC端显示是不一样的,charge only时PC端不显示手机信息,ptp会显示内部存储,mtp则显示内部存储和外部存储信息
代码可以看出当mMtpDisabled为false时,才会触发addStorageDevicesLocked(),当charge only模式时mMtpDisabled为true(Disable 禁用)
当mPtpMode是true时,addStorageLocked只会加载内部存储
Mtp模式时,addStorageLocked则会遍历mVolumeMap
在addStorageLocked方法中
MtpServer相当于一个服务器
MtpStorage对应一个"存储单元"
MtpDatabase充当着数据库的功能
需要说明的一点,pc端和手机内部显示不一致,这是Google 的 Design。会Reserve 一部分存储空间,为防止内部存储被拷贝满而影响手机正常使用