【输出文档】 Android 6 USB 模块解析

          USB模块解析

  1. 简介

主要完成USB 功能的切换和状态的更新。通过接受kernel发送过来的event消息来确定USB状态的切换并向外界发送广播消息。

 

1.1 UsbDeviceManager主要功能函数简介:

1.1.1 kernel层的event消息监控

/*

 * 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) {

            ... ...      

            String state = event.get("USB_STATE");

            String accessory = event.get("ACCESSORY");

            ... ...

                mHandler.updateState(state);

            ... ...

                startAccessoryMode();

        }

};

 

在UsbHandler初始化时注册:

 // Watch for USB configuration changes

 mUEventObserver.startObserving(USB_STATE_MATCH);

 mUEventObserver.startObserving(ACCESSORY_START_MATCH);

其中:

USB_STATE_MATCH ="DEVPATH=/devices/virtual/android_usb/android0" :

监听 /sys/deivces/virtual/android_usb/anroid0下的uevent节点的值,此节点上报USB_STATE相关的消息。

ACCESSORY_START_MATCH = "DEVPATH=/devices/virtual/misc/usb_accessory";

监听 /sys/devices/virtual/misc/usb_accessory 下的uvent节点的值,次节点上报USB_ACCESSORY相关的消息。

 

1.1.2 UsbDeviceManager构造函数

   

 public UsbDeviceManager(Context context, UsbAlsaManager alsaManager) {

        ... ...

        //初始化mUsbAlsaManager 对象,主要负责USB audio和USB MIDI功能

        mUsbAlsaManager = alsaManager;

        ... ...

        //是否支持USB_ACCESSORY功能

        mHasUsbAccessory = pm.hasSystemFeature(PackageManager.FEATURE_USB_ACCESSORY);



        //通过系统属性ro.serialno的值对应的配置RNDIS以太网的地址信息。

        initRndisAddress();

       

        //处理OEM 厂商对USB FUBCTIONS下发的修改

        readOemUsbOverrideConfig();

        ... ...

        //

        boolean secureAdbEnabled = SystemProperties.getBoolean("ro.adb.secure", false);

        boolean dataEncrypted = "1".equals(SystemProperties.get("vold.decrypt"));

        if (secureAdbEnabled && !dataEncrypted) {

            mDebuggingManager = new UsbDebuggingManager(context);

        }

}

 

1.1.3 systemReady()

public void systemReady() {

... ...

        //初始化mNotificationManager,用于在USB链接状态或者USB FUNCTION变化时对应的Notification处理。

mNotificationManager = (NotificationManager)

                mContext.getSystemService(Context.NOTIFICATION_SERVICE);

... ...

   //初始化大容量存储相关:

   // Android默认能开启大容量存储的设置是primary的存储空间

        boolean massStorageSupported = false;

        final StorageManager storageManager = StorageManager.from(mContext);

        final StorageVolume primary = storageManager.getPrimaryVolume();

        massStorageSupported = primary != null && primary.allowMassStorage();

        mUseUsbNotification = !massStorageSupported;

        ... ...

        // 读取Setting应用关于adb 是否enable 的配置,对应于“设置”->“开发者选项”

        //“USB调试”选项

      

            Settings.Global.putInt(mContentResolver,

                    Settings.Global.ADB_ENABLED, mAdbEnabled ? 1 : 0);

        ... ...

        mHandler.sendEmptyMessage(MSG_SYSTEM_READY);

        //MSG_SYSTEM_READY 会在handleMessage中分别调用

        // updateUsbNotification():更新USB 相关的Notification

        //updateAdbNotification()

        //updateUsbStateBroadcast() : 发送USB 链接状态的信息

        //updateUsbFunctions() : 更新Audio和MIDI 相关配置信息

}

 

1.1.4 handleMessage()

 

handleMessage(){

     switch (msg.what) {

         case MSG_UPDATE_STATE:

         //更新USB_STATE消息

         //1.如果当前的functions中包含accessory就主动更新accessory状态信息

         //2.如果USB链接断开,主动修改下发的function(某些特定的function如rndis

            必须在USB线链接状态下才可以下发)

         //3.更新USB链接消息,包括:1.发送UsbStateBroadcast ;2.更新audio 和midi

         ... ...



         case MSG_ENABLE_ADB:

         // 设置应用更新adb调试模式时触发 boolean mAdbEnabled 的更新,

         // mAdbEnabled :直接影响下发的function中是否包含function:adb

             setAdbEnabled(msg.arg1 == 1);

             ... ...



         case MSG_SET_CURRENT_FUNCTIONS:

         //function的下发

             String functions = (String)msg.obj;

             setEnabledFunctions(functions, false);

         ... ...

              

          case MSG_UPDATE_USER_RESTRICTIONS:

          //重新下发当前的function来更新当前用户的状态信息

              setEnabledFunctions(mCurrentFunctions, false);

                    break;



            case MSG_SET_USB_DATA_UNLOCKED:

            // 下拉菜单中 “仅充电模式”的开关

                setUsbDataUnlocked(msg.arg1 == 1);

                break;



            case MSG_SYSTEM_READY:

            // system ready时调用

               updateUsbNotification();

               updateAdbNotification();

               updateUsbStateBroadcast();

               updateUsbFunctions();

               break;



            case MSG_BOOT_COMPLETED:

            //boot completed时

               mBootCompleted = true;

            // 初始化accessory配置

               getCurrentSettings().accessoryAttached(mCurrentAccessory);

            // 初始化mAdbEnabled 的值

               mDebuggingManager.setAdbEnabled(mAdbEnabled);

               

            case MSG_USER_SWITCHED:

            // 多用户切换时

            //主要控制mtp 和ptp function的下发,对应的影响到当前手机的MTP和PTP

            //功能对于当前用户是否使能



            case MSG_BATTERY_CHANGED:

1.2 UsbService 主要函数简介

UsbService管理所有的USB 相关的状态,包括主机本身的状态和USB 链接设备的状态。

1.3 UsbHostManager 主要函数简介

 

  1. 主要流程解析

2.1 USB 状态更新

2.2 USB function的下发

2.2.1 各功能简介

UsbFunction 的下发,指的是用户开启手机特定功能时下发特定的USB function的过程,其中:

  1. 开启 传输文件(MTP) 功能:下发 ”mtp”  function;
  2. 开启 传输照片(PTP) 功能:下发 ”ptp”  function;
  3. 开启 仅充电 功能:下发 ”charging”  function;

 

2.2.2 功能下发流程

  1. 调用接口UsbManager.class 中 setCurrentFunction(String function)

 

  1. UsbDeviceManager.class 中 setCurrentFunctions()
public void setCurrentFunctions(String functions) {

    mHandler.sendMessage(MSG_SET_CURRENT_FUNCTIONS, functions);

}

 

  1. handleMessage中接受消息,调用setEnabledFunctions
public void handleMessage(Message msg) {

... ...

case MSG_UPDATE_USER_RESTRICTIONS:

    setEnabledFunctions(mCurrentFunctions, false);

    break;

... ...

}

 

  1. setEnabledFunctions() 主要作用是:
  1.对将要下发function进行fix,保证下发的functions符合下发规范;

  2.处理下发functions失败的状况;

private void setEnabledFunctions(String functions, boolean forceRestart){

   ... ...

   //对将要下发function进行fix,保证下发的functions符合下发规范

   final String fixed_functions = fixFuntions(functions);

   ... ...

   //下发rndis和accessory时,为了避免较长时间耗时导致ANR,需要重新起一个线程

   if (fixed_functions!=null&&

     (UsbManager.containsFunction(fixed_functions ,UsbManager.USB_FUNCTION_RNDIS)||

UsbManager.containsFunction(fixed_functions ,UsbManager.USB_FUNCTION_ACCESSORY))){

       new Thread() {

         public void run() {

            if(!trySetEnabledFunctions(fixed_functions, setforceRestart)){

               //如果下发失败,则主动下发默认的functions

               trySetEnabledFunctions(getDefaultFunctions(), false);

         }

        }.start();

       return;

  }

}

 

  1. trySetEnabledFunctions()
trySetEnabledFunctions(String functions, boolean forceRestart){

... ...

//处理OEM需求对function的修改

  functions = applyOemOverrideFunction(functions);

... ...

// 处理下发的function对系统属性persist.sys.usb.config的修改

  setUsbPersistConfig(functions);

... ...

//下发function时,将先下发UsbManager.USB_FUNCTION_NONE,USB将软断开

  if(!setUsbConfig(UsbManager.USB_FUNCTION_NONE)){

    //Do not insist setting new configuration , set back when closing failed.

    setUsbConfig(mCurrentFunctions);

     return false;

  }

//下发UsbManager.USB_FUNCTION_NONE成功后将再次下发需要下发的functions

//仅有在USB 断开的状况下,下发新的functions时才会生效

  if (!setUsbConfig(functions))

... ...

}

 

  1. private boolean setUsbConfig(String config){
 ... ...

   //将要下发的function set到系统property:sys.usb.config

   SystemProperties.set(USB_CONFIG_PROPERTY, config);

 ... ...

   return waitForState(config);

 }

  1. private boolean waitForState(String state){
       ... ...
    
       //在set操作中将等待2S,2S内未下发成功则返回false
    
       for (int i = 0; i < 40; i++) {
    
          value = SystemProperties.get(USB_STATE_PROPERTY);
    
           if (state.equals(value)) return true;
    
           SystemClock.sleep(50);
    
       }
    
       ... ...
    
       Return false ;
    
      }
  1. USB 优化

3.1 USB function下发流程优化

 

private String fixFuntions(String functions) {

... ...

  if (functions != null){

switch (functions){

  case UsbManager.USB_FUNCTION_RNDIS:

  //处理下发rndis function

  //调用functionsCompatiableSupported

  case UsbManager.USB_FUNCTION_ENABLE_SERIAL:

  //开启serial,下发function serial

  //调用functionsCompatiableSupported

  case UsbManager.USB_FUNCTION_DISABLE_SERIAL:

  //关闭serial

  // 当前已下发的function中去除”serial”

  case UsbManager.USB_FUNCTION_ADB:

  //处理adb

  //根据mAdbEnabled 来增加/去除”adb”

  case UsbManager.USB_FUNCTION_CHARGING:

  //处理charging

  //调用functionsCompatiableSupported

}

  }else{

   //functions = null 时下发默认的function

  }

}

3.1.1 在setEnabledFunctions中,在将functions下发到trySetEnabledFunctions中时,先由fixfunction进行处理:

private String functionsCompatiableSupported (String function,String functionsArray){

//function : 将要下发的function

//functionArray : 需要和function一起下发到propery:sys.usb.config的属性值

... ...



... ...

}

3.2下发function后重启仍然生效

3.3 仅充电 模式优化

猜你喜欢

转载自blog.csdn.net/pirionFordring/article/details/83419610