Android启动USB服务源码分析

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#163public <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#199public 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#1480UsbHandlerLegacy(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);
           }
        }
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

麦子zzy

谢谢支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值