废话少说, 先上两张时序图 , 图片有点大, 建议用新窗口打开或者另存到本地查看


图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内核空间与用户的数据交换接口, 更改对应的值就相当与告诉内核做对应的事情了. 

好了, 流程就分析完了. 

更多相关文章

  1. Android热更新方案Robust——美团热更新(热修复)使用介绍
  2. eclipse报错:This Android(安卓)SDK requires Android(安卓)Devel
  3. ADT 不能在线更新问题
  4. ionic爬过的各种坑;(持续更新)
  5. ubuntu 10.10下面编译android 4.0 出错
  6. location of the android sdk has not been setup in the prefer
  7. [Android]安装使用SDK Manager更新时出现问题
  8. Android操作数据的动态更新ListView
  9. Android(安卓)App 版本更新

随机推荐

  1. mysql 正确清理binlog日志的两种方法
  2. MySQL交换分区的实例详解
  3. CentOS 6.6 源码编译安装MySQL 5.7.18教
  4. mysql5.7.18版本免安装配置教程
  5. MySql Error 1698(28000)问题的解决方法
  6. MySQL 修改密码实例详解
  7. mac安装mysql初始密码忘记怎么办
  8. MYSQL5.6.33数据库主从(Master/Slave)同
  9. Windows平台配置5.7版本+MySQL数据库服务
  10. CentOS 7中MySQL连接数被限制为214个的解