以Android13 为例:在Android 13中,USB插入拔出事件的通知链从硬件层到应用层,依次经过硬件、内核、HAL、Framework、以及应用广播等多个模块,整个流程涉及的具体文件和逻辑如下:

1. 硬件层(USB PHY / 控制器)

文件:

/drivers/usb/phy/phy-generic.c (USB PHY驱动)

/drivers/usb/dwc3/dwc3-core.c(如果是 USB 3.x 控制器)

说明:

USB PHY 负责检测物理层面的USB插入或拔出,并触发相应的中断,通知内核USB状态发生变化。

2. 内核处理层(USB子系统)

文件:

/drivers/usb/core/port.c

/drivers/usb/core/hub.c

/drivers/usb/gadget/(USB Gadget模式)

/drivers/usb/host/(USB Host模式)

说明:

USB控制器会通过中断机制通知内核,内核USB子系统根据中断进行处理,包括设备的初始化、枚举以及模式选择(Host/Gadget)。处理完成后,内核生成一个 uevent 事件发送到用户空间。

3. 用户空间通知:uevent

文件:

/drivers/base/core.c (kobject_uevent_env函数负责生成 uevent)

/sys/class/usb_device/(用于管理USB设备的sysfs路径)

说明:

内核通过 uevent 将USB设备的插入或拔出事件发送到用户空间,通知 udev 或其他守护进程(如vold),以便进一步处理。

4. HAL 层(Hardware Abstraction Layer)

文件:

hardware/interfaces/usb/1.0/IUsb.hal(HIDL定义接口)

hardware/interfaces/usb/1.0/default/Usb.cpp(HIDL实现)

hardware/interfaces/usb/aidl/android/hardware/usb/IUsb.aidl(AIDL定义接口)

hardware/interfaces/usb/aidl/default/Usb.cpp(AIDL实现)

说明:

HAL层负责将底层内核的USB状态提供给上层的 UsbService。通过 getPortStatus() 等接口,HAL可以报告当前USB设备的状态和角色(如Host/Gadget),并支持角色切换(通过 switchRole())。

5. Framework层(系统服务)

文件:

frameworks/base/services/usb/java/com/android/server/usb/UsbService.java

frameworks/base/services/usb/java/com/android/server/usb/UsbDeviceManager.java

frameworks/base/services/usb/java/com/android/server/usb/UsbHostManager.java

说明:

UsbService 是Framework层的核心服务,负责从HAL获取USB设备的状态,并根据USB设备的插入或拔出执行不同的处理流程。UsbDeviceManager和UsbHostManager根据设备是否处于Gadget或Host模式,分别管理对应的设备行为。

Framework层还负责触发广播通知应用层,并根据需要切换设备模式(如充电模式、MTP、PTP等)。

6. 应用层广播通知

文件:

frameworks/base/core/java/android/hardware/usb/UsbManager.java

frameworks/base/core/java/android/content/Intent.java

说明:

当USB设备插入或拔出时,系统会通过广播(Intent)将此事件通知应用层。应用程序可以监听这些广播,并执行相应的逻辑。

常见的广播事件:

UsbManager.ACTION_USB_DEVICE_ATTACHED(USB设备插入)

UsbManager.ACTION_USB_DEVICE_DETACHED(USB设备拔出)

总结整条通知链:

  1. 硬件层(USB PHY/控制器):检测到USB设备物理连接状态的变化,触发中断。

  2. 内核处理层:内核中的USB控制器驱动处理中断,执行设备初始化或移除,之后生成 uevent 事件。

  3. uevent 通知用户空间:内核通过 uevent 系统通知 vold 或 init 等守护进程处理设备(如存储挂载),并向 HAL 层传递相关事件。

  4. HAL层处理:HAL 层通过 HIDL/AIDL 接口与内核交互,获取USB状态或进行模式切换(如从Host切换到Device模式),并将状态通知 Framework 层的 UsbService。

  5. Framework层处理:UsbService 通过 HAL 获取USB设备的状态,并执行相应操作,如控制模式切换、处理存储挂载等,并发送广播通知应用层。

  6. 应用层响应:应用程序通过监听 UsbManager 的广播事件,获取USB插入拔出的通知,并作出相应的响应(如打开文件管理器、同步数据等)。

Android USB 整条通知链分析的更多相关文章

  1. android的几种“通知”方式简单实现(Notification&NotificationManager)

    关于通知Notification相信大家都不陌生了,平时上QQ的时候有消息来了或者有收到了短信,手机顶部就会显示有新消息什么的,就类似这种.今天就稍微记录下几种Notification的用法.3.0以 ...

  2. android 同时发送几条通知

     android 同时发送几条通知 ======= 下面是转载的文章.  同时发送几条通知把ID添加,接收的时候找到这个id就可以出来多条了. 还是不太明白或者编码实现不了的可以加我QQ. 博客很少上 ...

  3. Android入门(十五)通知

    原文链接:http://www.orlion.ga/663/ 1.通知的基本用法 创建通知的步骤,首先需要一个NotificationManager来对通知进行管理,可以调用Context的getSy ...

  4. Linux内核通知链分析【转】

    转自:http://www.cnblogs.com/jason-lu/articles/2807758.html Linux内核通知链分析 1. 引言 Linux是单内核架构(monolithic k ...

  5. android笔记:Notification通知的使用

    通知(Notification),当某个应用程序希望向用户发出一些提示信息,而该应用程序又不在前台运行时,就可以借助通知来实现. 发出一条通知后,手机最上方的状态栏中会显示一个通知的图标,下拉状态栏后 ...

  6. android usb挂载分析---vold处理内核消息

    android usb挂载分析---vold处理内核消息 分类: u盘挂载2012-03-29 22:25 3215人阅读 评论(0) 收藏 举报 androidactioniteratordiskd ...

  7. android usb挂载分析---MountService启动

    android usb挂载分析---MountService启动 分类: android框架 u盘挂载2012-03-27 23:00 11799人阅读 评论(4) 收藏 举报 androidsock ...

  8. Android USB Host框架

    Android 下的usb框架及功能点:https://blog.csdn.net/tianruxishui/article/details/379029591.Android framework中* ...

  9. Android USB配件模式

    原文:http://android.eoe.cn/topic/android_sdk USB配件模式允许用户连接那些专门搭载Android设备的USB主机硬件.这些配件必须遵守Android配件开发工 ...

  10. [翻译]Android官方文档 - 通知(Notifications)

    翻译的好辛苦,有些地方也不太理解什么意思,如果有误,还请大神指正. 官方文档地址:http://developer.android.com/guide/topics/ui/notifiers/noti ...

随机推荐

  1. hbuilderx打正式包所需的私钥证书的创建方法

    现在使用uniapp作为底层框架来开发app应用已经成为了很多公司的事实标准,而uniapp的开发工具hbuilderx云打包的时候,需要私钥证书和证书profile文件. 而且还需要将打包好的ipa ...

  2. 关于在windows系统下使用Linux子系统

    今天意外刷到一个短视频,介绍了如何在windows下方便的使用系统自带的Linux子系统,本人抱着好奇的心理,也因为最近碰到了只使用windows操作系统解决不了的问题,还有想到以后测试项目大概率也要 ...

  3. 【Java】MuliThread 多线程

    程序Program 是完成特定人,用某种语言编写的一组指令集合,即一段静态代码,静态对象 进程Process 是程序的一次执行过程,可以是一个正在执行的程序 - 程序是静态的,进程是动态的 - 进程是 ...

  4. python高性能计算:cython入门代码

    三种实现的对比: (1)纯python x.py def is_prime(num): for j in range(2, num): if (num%j)==0: return False retu ...

  5. 除了Ubuntu以外的Linux系统可以安装Tensorflow/Pytorch的GPU版本吗???

    废话: 平时没事有用到的Linux系统有Centos/Redhat/Ubuntu/UOS/Deepin,其中Ubuntu系统主要是用来工作生产的,UOS就是看看国家队的进展如何,Deepin就是看看民 ...

  6. Gradle工程编译报错:Cause: org.jetbrains.plugins.gradle.tooling.util.ModuleComponentIdentifierImpl.getModuleIdentifier()Lorg/gradle/api/artifacts/ModuleIdentifier;

    1.背景 从git上拉取代码后,编译报错如下: Cause: org.jetbrains.plugins.gradle.tooling.util.ModuleComponentIdentifierIm ...

  7. vue之element图标库使用与第三方阿里云图标库使用

    1.背景 2.element图标库使用 假设要做一个如下效果 代码如下: <!-- 输入框--> <el-form label-width="0px" class ...

  8. 组长:你熟悉过React,开发个Next项目模板吧,我:怎么扯上关系的?

    组长:你熟悉过React,开发个Next项目模板吧,我:怎么扯上关系的? 最近工作安排我开发一个Next.js项目模板,心里默笑,React用得少得都快忘光了,现在得搞Next?虽然我曾是React的 ...

  9. vs code 快速配置

    1. 基本操作 打开工程文件: ctrl + p 在文件搜索内容: ctrl + shift + f 进入设置: ctrl + shift + p, 然后输入 user setting 添加插件: c ...

  10. 2021 CCPC 威海

    gym 知乎 确定了我先写缺省源,gjk 正开,zsy 倒开的策略 先读了 EFGH,发现是概率.博弈.计数,只能做 H,感觉我已经到点了.队友签了 AJ zsy 说 M 是多项式快速幂并准备开冲,看 ...