USB framework层源码分析(一)
因为之前做过一段时间的USB上层,想着不能光研究,不总结,在这里记录一下,让自己以后也能回忆一下青葱岁月。
和其他系统应用类似,USB的启动也是在SystemServer那边拉起来;需要注意的是startService是通过反射机制创建实例并启动Service的,这里不做赘述;
if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_USB_HOST)
|| mPackageManager.hasSystemFeature(
PackageManager.FEATURE_USB_ACCESSORY)
|| isEmulator) {
// Manage USB host and device support
traceBeginAndSlog("StartUsbService");
mSystemServiceManager.startService(USB_SERVICE_CLASS);
traceEnd();
}
之后在UsbService那边初始化USB的关键类,在我看来,比较重要的是以下几个类:
UsbDeviceManager.java //在我看来这是最重要的一个类了,它是USB上层和底层交互的具体实现类
UsbHostManager.java //当设备作为host端时的管理类
UsbPortManager.java //UsbPort相关信息的管理类,例如mode、powerRole、DataRole等
UsbManager.java //提供给外部调用Usb相关方法的管理类
UsbDeviceManager.java
这里简单介绍下host和device的区别,一般使用usb时我们的手机都是作为device端的,像我们连接电脑,去使用adb、mtp、共享网络等;但是我们也可以通过otg线(现在也有两边都是typec口的线)连接键盘、鼠标、以及别人的手机(emmm,有一次出去玩就靠这个从基友的手机上充电续命);
而UsbDeviceManager就是手机作为device端时的一个重要类;
原生的andoird设备usb启动流程如下: