解剖Android USB MTP 的激活流程


廢話少說, 先上兩張時序圖 , 圖片有點大, 建議用新窗口打開或者另存到本地查看


圖1: UsbSettings的流程


圖2: property屬性的觸發事件流程


好, 開始分析

從圖1開始, 當用戶從Setting UI里面點了一下那個MTP的選擇框后,引起一系列的操作,

說白了,這里繞那么多個圈, 無非就是想發個消息通知UsbHandler而已, 然后就等待狀態更新, 真正干活的就是圖2.


這也不復雜,就是為后面更新persist.sys.usb.config這個property組裝合適的value,  這個value就是functions這個變量, 純字符串, 以逗號分割各個功能. 假如只有mtp, 那么functions就是"mtp", 假如adb和mtp都有, 那么function就是"adb,mtp" .

所以從圖2步驟1到3都是內部邏輯為了得到更准確的functions的值, 最后執行property_set(). 

有同學會很奇怪, peroperty_set()不久是更新一個全局持久化的特殊變量而已嗎? 怎么會觸發而外的邏輯呢?

既然特殊,那當然有特殊的地方. 


值得注意的是步驟6-7的通訊方式是通過LOCAL socket來實現的, 文件是/dev/socket/property_service , 在init程序初始話的時候創建的


在android啟動初始化的時候,在init.rc文件里面會有一段

# Used to set USB configuration at boot and to switch the configuration
# when changing the default configuration
on property:persist.sys.usb.config=*
    setprop sys.usb.config $persist.sys.usb.config

沒錯,就是它, 這個注冊了一個觸發器, 意思是當系統使用property更新persist.sys.usb.config的值的話,就同時更新sys.usb.config為同樣的值

在init.rc其他地方也同樣有sys.usb.config的觸發器, 如:

# Used to disable USB when switching states
on property:sys.usb.config=none
    stop adbd
    write /sys/class/android_usb/android0/enable 0
    write /sys/class/android_usb/android0/bDeviceClass 0
    setprop sys.usb.state $sys.usb.config


# adb only USB configuration
# This should only be used during device bringup
# and as a fallback if the USB manager fails to set a standard configuration
on property:sys.usb.config=adb
    write /sys/class/android_usb/android0/enable 0
    write /sys/class/android_usb/android0/idVendor 18d1
    write /sys/class/android_usb/android0/idProduct D002
    write /sys/class/android_usb/android0/functions $sys.usb.config
    write /sys/class/android_usb/android0/enable 1
    start adbd
    setprop sys.usb.state $sys.usb.config


# USB accessory configuration
on property:sys.usb.config=accessory
    write /sys/class/android_usb/android0/enable 0
    write /sys/class/android_usb/android0/idVendor 18d1
    write /sys/class/android_usb/android0/idProduct 2d00
    write /sys/class/android_usb/android0/functions $sys.usb.config
    write /sys/class/android_usb/android0/enable 1
    setprop sys.usb.state $sys.usb.config


# USB accessory configuration, with adb
on property:sys.usb.config=accessory,adb
    write /sys/class/android_usb/android0/enable 0
    write /sys/class/android_usb/android0/idVendor 18d1
    write /sys/class/android_usb/android0/idProduct 2d01
    write /sys/class/android_usb/android0/functions $sys.usb.config
    write /sys/class/android_usb/android0/enable 1
    start adbd
    setprop sys.usb.state $sys.usb.config

所以, 真正的操作就看sys.usb.config更新為什么值了.

這些操作都是往/sys/class/android_usb/android0/下面對應的文件寫數據.

這些都是android內核空間與用戶的數據交換接口, 更改對應的值就相當與告訴內核做對應的事情了. 

好了, 流程就分析完了. 


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com