Android 启动的时候会启动SystemServer进程,在这个服务中启动(注册)USB服务。
启动USB服务
//http://aospxref.com/android-12.0.0_r3/xref/frameworks/base/services/java/com/android/server/SystemServer.java#2111
if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_USB_HOST)
|| mPackageManager.hasSystemFeature(
PackageManager.FEATURE_USB_ACCESSORY)
|| isEmulator) {
// Manage USB host and device support
t.traceBegin("StartUsbService");
// 启动USBService服务 String USB_SERVICE_CLASS ="com.android.server.usb.UsbService$Lifecycle";
mSystemServiceManager.startService(USB_SERVICE_CLASS); //启动USB服务
t.traceEnd();
}
其中mSystemServiceManager 是 SystemServiceManager类的对象。从上面的第9行(2111行)进入到下面
//http://aospxref.com/android-12.0.0_r3/xref/frameworks/base/services/core/java/com/android/server/SystemServiceManager.java#110
//className = "com.android.server.usb.UsbService$Lifecycle";
public SystemService startService(String className) {
// Java的反射机制,通过类名拿到该类的Class对象
// 这里拿到的是UsbService$Lifecycle 的对象 ,
// 这个类定义在http://aospxref.com/android-12.0.0_r3/xref/frameworks/base/services/usb/java/com/android/server/usb/UsbService.java#79
final Class<SystemService> serviceClass = loadClassFromLoader(className,
this.getClass().getClassLoader());
return startService(serviceClass);
}
// loadClassFromLoader 的定义
//http://aospxref.com/android-12.0.0_r3/xref/frameworks/base/services/core/java/com/android/server/SystemServiceManager.java#140
private static Class<SystemService> loadClassFromLoader(String className,
ClassLoader classLoader) {
try {
return (Class<SystemService>) Class.forName(className, true, classLoader);
} catch (ClassNotFoundException ex) {
throw new RuntimeException("Failed to create service " + className
+ " from class loader " + classLoader.toString() + ": service class not "
+ "found, usually indicates that the caller should "
+ "have called PackageManager.hasSystemFeature() to check whether the "
+ "feature is available on this device before trying to start the "
+ "services that implement it. Also ensure that the correct path for the "
+ "classloader is supplied, if applicable.", ex);
}
}
进入到下面的代码
// http://aospxref.com/android-12.0.0_r3/xref/frameworks/base/services/core/java/com/android/server/SystemServiceManager.java#163
public <T extends SystemService> T startService(Class<T> serviceClass) {
try {
// 获取类名,这里拿到的name 值 = "com.android.server.usb.UsbService$Lifecycle"
// 这里仅仅是为了打印日志
final String name = serviceClass.getName();
Slog.i(TAG, "Starting " + name);
Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "StartService " + name);
// Create the service.
// 判断 serviceClass 所表示的类是否是 SystemService 的子类
// 也就是判断UsbService$Lifecycle 是否是 SystemService 的子类
// 很显然是的,这里不会进if语句
if (!SystemService.class.isAssignableFrom(serviceClass)) {
throw new RuntimeException("Failed to create " + name
+ ": service must extend " + SystemService.class.getName());
}
final T service;
try {
// 获取 参数为Context 类 的 构造函数
Constructor<T> constructor = serviceClass.getConstructor(Context.class);
// 调用构造创建对象,这里创建了UsbService$Lifecycle的对象
// 实际上调用 http://aospxref.com/android-12.0.0_r3/xref/frameworks/base/services/usb/java/com/android/server/usb/UsbService.java#85
service = constructor.newInstance(mContext);
} catch (InstantiationException ex) {
throw new RuntimeException("Failed to create service " + name
+ ": service could not be instantiated", ex);
} catch (IllegalAccessException ex) {
throw new RuntimeException("Failed to create service " + name
+ ": service must have a public constructor with a Context argument", ex);
} catch (NoSuchMethodException ex) {
throw new RuntimeException("Failed to create service " + name
+ ": service must have a public constructor with a Context argument", ex);
} catch (InvocationTargetException ex) {
throw new RuntimeException("Failed to create service " + name
+ ": service constructor threw an exception", ex);
}
startService(service); // 接着往下看
return service;
} finally {
Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
}
}
代码运行到第40 行(192行),进入到下面的方法
//http://aospxref.com/android-12.0.0_r3/xref/frameworks/base/services/core/java/com/android/server/SystemServiceManager.java#199
public void startService(@NonNull final SystemService service) {
// Register it.
mServices.add(service); // 注册服务
// Start it.
long time = SystemClock.elapsedRealtime();
try {
service.onStart(); //启动服务
} catch (RuntimeException ex) {
throw new RuntimeException("Failed to start service " + service.getClass().getName()
+ ": onStart threw an exception", ex);
}
warnIfTooLong(SystemClock.elapsedRealtime() - time, service, "onStart");
}
进入启动服务代码:
// http://aospxref.com/android-12.0.0_r3/xref/frameworks/base/services/usb/java/com/android/server/usb/UsbService.java#90
// 这里是USBService 的内部类 Lifecycle 的方法
public void onStart() {
// Java的Lamda 表达式 91行到 95行之间 大括号中的代码是一个函数
// SystemServerInitThreadPool.submit 是将Lamda 表达是加入线程池
SystemServerInitThreadPool.submit(() -> {
mUsbService = new UsbService(getContext());
publishBinderService(Context.USB_SERVICE, mUsbService);
mOnStartFinished.complete(null);
}, "UsbService$Lifecycle#onStart");
}
上面的代码创建了一个线程。这个线程的代码如下:
mUsbService = new UsbService(getContext());
publishBinderService(Context.USB_SERVICE, mUsbService);
mOnStartFinished.complete(null);
接下来我们看一下UsbService 的构造函数做了什么。
// http://aosp.opersys.com/xref/android-12.0.0_r2/xref/frameworks/base/services/usb/java/com/android/server/usb/UsbService.java#165
public UsbService(Context context) {
mContext = context;
mUserManager = context.getSystemService(UserManager.class);
mSettingsManager = new UsbSettingsManager(context, this);
mPermissionManager = new UsbPermissionManager(context, this);
mAlsaManager = new UsbAlsaManager(context);
final PackageManager pm = mContext.getPackageManager();
if (pm.hasSystemFeature(PackageManager.FEATURE_USB_HOST)) {
mHostManager = new UsbHostManager(context, mAlsaManager, mPermissionManager);
}
if (new File("/sys/class/android_usb").exists()) {
// 这里创建 DeviceManager对象
mDeviceManager = new UsbDeviceManager(context, mAlsaManager, mSettingsManager,
mPermissionManager);
}
if (mHostManager != null || mDeviceManager != null) {
mPortManager = new UsbPortManager(context);
}
onSwitchUser(UserHandle.USER_SYSTEM);
// 接收到广播 调用 OnReceive
BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
final String action = intent.getAction();
if (DevicePolicyManager.ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED
.equals(action)) {
if (mDeviceManager != null) {
mDeviceManager.updateUserRestrictions();
}
}
}
};
// 注册广播
final IntentFilter filter = new IntentFilter();
filter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY);
filter.addAction(DevicePolicyManager.ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED);
mContext.registerReceiverAsUser(receiver, UserHandle.ALL, filter, null, null);
}
以手机作为 device 端 ,看一下UsbDeviceManager 的构造都干了哪些事。
// http://aosp.opersys.com/xref/android-12.0.0_r2/xref/frameworks/base/services/usb/java/com/android/server/usb/UsbDeviceManager.java#281
public UsbDeviceManager(Context context, UsbAlsaManager alsaManager,
UsbSettingsManager settingsManager, UsbPermissionManager permissionManager) {
mContext = context;
mContentResolver = context.getContentResolver();
PackageManager pm = mContext.getPackageManager();
mHasUsbAccessory = pm.hasSystemFeature(PackageManager.FEATURE_USB_ACCESSORY);
initRndisAddress();
boolean halNotPresent = false;
try {
IUsbGadget.getService(true);
} catch (RemoteException e) {
Slog.e(TAG, "USB GADGET HAL present but exception thrown", e);
} catch (NoSuchElementException e) {
halNotPresent = true;
Slog.i(TAG, "USB GADGET HAL not present in the device", e);
}
mControlFds = new HashMap<>();
FileDescriptor mtpFd = nativeOpenControl(UsbManager.USB_FUNCTION_MTP);
if (mtpFd == null) {
Slog.e(TAG, "Failed to open control for mtp");
}
mControlFds.put(UsbManager.FUNCTION_MTP, mtpFd);
FileDescriptor ptpFd = nativeOpenControl(UsbManager.USB_FUNCTION_PTP);
if (ptpFd == null) {
Slog.e(TAG, "Failed to open control for ptp");
}
mControlFds.put(UsbManager.FUNCTION_PTP, ptpFd);
// 初始化mHandler对象
if (halNotPresent) {
/**
* Initialze the legacy UsbHandler
*/
mHandler = new UsbHandlerLegacy(FgThread.get().getLooper(), mContext, this,
alsaManager, permissionManager);
} else {
/**
* Initialize HAL based UsbHandler
*/
mHandler = new UsbHandlerHal(FgThread.get().getLooper(), mContext, this,
alsaManager, permissionManager);
}
if (nativeIsStartRequested()) {
if (DEBUG) Slog.d(TAG, "accessory attached at boot");
startAccessoryMode();
}
BroadcastReceiver portReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
ParcelableUsbPort port = intent.getParcelableExtra(UsbManager.EXTRA_PORT);
UsbPortStatus status = intent.getParcelableExtra(UsbManager.EXTRA_PORT_STATUS);
mHandler.updateHostState(
port.getUsbPort(context.getSystemService(UsbManager.class)), status);
}
};
BroadcastReceiver chargingReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
int chargePlug = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
boolean usbCharging = chargePlug == BatteryManager.BATTERY_PLUGGED_USB;
mHandler.sendMessage(MSG_UPDATE_CHARGING_STATE, usbCharging);
}
};
BroadcastReceiver hostReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Iterator devices = ((UsbManager) context.getSystemService(Context.USB_SERVICE))
.getDeviceList().entrySet().iterator();
if (intent.getAction().equals(UsbManager.ACTION_USB_DEVICE_ATTACHED)) {
mHandler.sendMessage(MSG_UPDATE_HOST_STATE, devices, true);
} else {
mHandler.sendMessage(MSG_UPDATE_HOST_STATE, devices, false);
}
}
};
BroadcastReceiver languageChangedReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
mHandler.sendEmptyMessage(MSG_LOCALE_CHANGED);
}
};
// 注册广播
mContext.registerReceiver(portReceiver,
new IntentFilter(UsbManager.ACTION_USB_PORT_CHANGED));
mContext.registerReceiver(chargingReceiver,
new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
IntentFilter filter =
new IntentFilter(UsbManager.ACTION_USB_DEVICE_ATTACHED);
filter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED);
mContext.registerReceiver(hostReceiver, filter);
mContext.registerReceiver(languageChangedReceiver,
new IntentFilter(Intent.ACTION_LOCALE_CHANGED));
// 通过Linux Uevent机制监听USB状态变换
// Watch for USB configuration changes
mUEventObserver = new UsbUEventObserver();
mUEventObserver.startObserving(USB_STATE_MATCH);
mUEventObserver.startObserving(ACCESSORY_START_MATCH);
}
UsbDeviceManager的构造函数做了三件事。
第一件事,初始化mHandler对象。mHandler的初始化使用的是UsbHandlerLegacy对象或者是UsbHandlerHal取决于是否有该模式的hal层支持。
第二事,注册了各种广播接收器,例如端口变化,语言变化,等等。这里我把关于充电的广播接收器代码展示出来了。当我们把手机通过USB线连接到电脑端的时候,手机会充电,并且手机上会出现一个关于USB充电的通知。打开这个关于USB的通知,我们就可以切换USB的功能,例如MTP, PTP,等等。
第三件事,通过Linux Uevent机制监听USB状态变换。当手机通过USB线连接电脑时,USB状态会从DISCONNECTED变为CONNECTED,再变为CONFIGURED。当状态改变会处理usb状态更新操作。
看一下UsbHandlerLegacy 对象的创建。
// http://aosp.opersys.com/xref/android-12.0.0_r2/xref/frameworks/base/services/usb/java/com/android/server/usb/UsbDeviceManager.java#1480
UsbHandlerLegacy(Looper looper, Context context, UsbDeviceManager deviceManager,
UsbAlsaManager alsaManager, UsbPermissionManager permissionManager) {
super(looper, context, deviceManager, alsaManager, permissionManager);
try {
// 1. 读取oem覆盖配置
readOemUsbOverrideConfig(context);
// Restore default functions.
// 读取 属性的 值
// getSystemProperty 这个函数用于读取 系统属性的值
// 它有两个参数 参数1 : 属性名称, 参数 2 : 默认返回的值
// 返回 属性的 值
// 读取的是persist.sys.usb.config属性的值
mCurrentOemFunctions = getSystemProperty(getPersistProp(false),
UsbManager.USB_FUNCTION_NONE);
// ro.bootmode属性的值为normal或unknown,就表示正常启动
if (isNormalBoot()) {
// 读取sys.usb.config属性的值,这个属性表示当前设置的usb功能
mCurrentFunctionsStr = getSystemProperty(USB_CONFIG_PROPERTY,
UsbManager.USB_FUNCTION_NONE);
// 比较sys.usb.config属性与sys.usb.state属性的值
// sys.usb.state属性表示usb的实际功能
// 如果两个属性相等,表示usb设置的功能都起效了
mCurrentFunctionsApplied = mCurrentFunctionsStr.equals(
getSystemProperty(USB_STATE_PROPERTY, UsbManager.USB_FUNCTION_NONE));
} else {
mCurrentFunctionsStr = getSystemProperty(getPersistProp(true),
UsbManager.USB_FUNCTION_NONE);
mCurrentFunctionsApplied = getSystemProperty(USB_CONFIG_PROPERTY,
UsbManager.USB_FUNCTION_NONE).equals(
getSystemProperty(USB_STATE_PROPERTY, UsbManager.USB_FUNCTION_NONE));
}
// mCurrentFunctions代表当前要设置的usb功能,初始值为0
mCurrentFunctions = UsbManager.FUNCTION_NONE;
mCurrentUsbFunctionsReceived = true;
mUsbSpeed = UsbSpeed.UNKNOWN;
mCurrentGadgetHalVersion = UsbManager.GADGET_HAL_NOT_SUPPORTED;
// 读取一次usb状态,然后做一次更新操作
String state = FileUtils.readTextFile(new File(STATE_PATH), 0, null).trim();
updateState(state);
} catch (Exception e) {
Slog.e(TAG, "Error initializing UsbHandler", e);
}
}