1. 程式人生 > >【輸出文件】 Android 6 USB 模組解析

【輸出文件】 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 僅充電 模式優化