【輸出文件】 Android 6 USB 模組解析
阿新 • • 發佈:2018-11-02
USB模組解析
- 簡介
主要完成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 主要函式簡介
- 主要流程解析
2.1 USB 狀態更新
2.2 USB function的下發
2.2.1 各功能簡介
UsbFunction 的下發,指的是使用者開啟手機特定功能時下發特定的USB function的過程,其中:
- 開啟 傳輸檔案(MTP) 功能:下發 ”mtp” function;
- 開啟 傳輸照片(PTP) 功能:下發 ”ptp” function;
- 開啟 僅充電 功能:下發 ”charging” function;
2.2.2 功能下發流程
- 呼叫介面UsbManager.class 中 setCurrentFunction(String function)
- UsbDeviceManager.class 中 setCurrentFunctions()
public void setCurrentFunctions(String functions) {
mHandler.sendMessage(MSG_SET_CURRENT_FUNCTIONS, functions);
}
- handleMessage中接受訊息,呼叫setEnabledFunctions
public void handleMessage(Message msg) {
... ...
case MSG_UPDATE_USER_RESTRICTIONS:
setEnabledFunctions(mCurrentFunctions, false);
break;
... ...
}
- 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;
}
}
- 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))
... ...
}
- private boolean setUsbConfig(String config){
... ...
//將要下發的function set到系統property:sys.usb.config
SystemProperties.set(USB_CONFIG_PROPERTY, config);
... ...
return waitForState(config);
}
-
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 ; }
- 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的屬性值
... ...
... ...
}