zoukankan      html  css  js  c++  java
  • usb mtp激活流程【转】

    本文转载自:https://blog.csdn.net/kc58236582/article/details/46895901

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

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

    好了, 流程就分析完了. 

  • 相关阅读:
    Exp4 恶意代码分析 20155223
    20155223 Exp3 免杀原理与实践 实验报告
    20155223 Exp2 后门原理与实践
    网络对抗第一次实验——PC平台逆向破解(5)M
    苏黄的假期学习报告3
    我的假期学习报告2
    苏黄永郦的假期报告——1
    20155223 《信息安全系统设计基础》课程总结
    2017-2018-1 20155223 《信息安全系统设计基础》第14周学习总结
    2017-2018-1 20155223 实验五 通讯协议设计
  • 原文地址:https://www.cnblogs.com/zzb-Dream-90Time/p/9149312.html
Copyright © 2011-2022 走看看