Android USB 整条通知链分析
以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设备拔出)
总结整条通知链:
硬件层(USB PHY/控制器):检测到USB设备物理连接状态的变化,触发中断。
内核处理层:内核中的USB控制器驱动处理中断,执行设备初始化或移除,之后生成 uevent 事件。
uevent 通知用户空间:内核通过 uevent 系统通知 vold 或 init 等守护进程处理设备(如存储挂载),并向 HAL 层传递相关事件。
HAL层处理:HAL 层通过 HIDL/AIDL 接口与内核交互,获取USB状态或进行模式切换(如从Host切换到Device模式),并将状态通知 Framework 层的 UsbService。
Framework层处理:UsbService 通过 HAL 获取USB设备的状态,并执行相应操作,如控制模式切换、处理存储挂载等,并发送广播通知应用层。
应用层响应:应用程序通过监听 UsbManager 的广播事件,获取USB插入拔出的通知,并作出相应的响应(如打开文件管理器、同步数据等)。
Android USB 整条通知链分析的更多相关文章
- android的几种“通知”方式简单实现(Notification&NotificationManager)
关于通知Notification相信大家都不陌生了,平时上QQ的时候有消息来了或者有收到了短信,手机顶部就会显示有新消息什么的,就类似这种.今天就稍微记录下几种Notification的用法.3.0以 ...
- android 同时发送几条通知
android 同时发送几条通知 ======= 下面是转载的文章. 同时发送几条通知把ID添加,接收的时候找到这个id就可以出来多条了. 还是不太明白或者编码实现不了的可以加我QQ. 博客很少上 ...
- Android入门(十五)通知
原文链接:http://www.orlion.ga/663/ 1.通知的基本用法 创建通知的步骤,首先需要一个NotificationManager来对通知进行管理,可以调用Context的getSy ...
- Linux内核通知链分析【转】
转自:http://www.cnblogs.com/jason-lu/articles/2807758.html Linux内核通知链分析 1. 引言 Linux是单内核架构(monolithic k ...
- android笔记:Notification通知的使用
通知(Notification),当某个应用程序希望向用户发出一些提示信息,而该应用程序又不在前台运行时,就可以借助通知来实现. 发出一条通知后,手机最上方的状态栏中会显示一个通知的图标,下拉状态栏后 ...
- android usb挂载分析---vold处理内核消息
android usb挂载分析---vold处理内核消息 分类: u盘挂载2012-03-29 22:25 3215人阅读 评论(0) 收藏 举报 androidactioniteratordiskd ...
- android usb挂载分析---MountService启动
android usb挂载分析---MountService启动 分类: android框架 u盘挂载2012-03-27 23:00 11799人阅读 评论(4) 收藏 举报 androidsock ...
- Android USB Host框架
Android 下的usb框架及功能点:https://blog.csdn.net/tianruxishui/article/details/379029591.Android framework中* ...
- Android USB配件模式
原文:http://android.eoe.cn/topic/android_sdk USB配件模式允许用户连接那些专门搭载Android设备的USB主机硬件.这些配件必须遵守Android配件开发工 ...
- [翻译]Android官方文档 - 通知(Notifications)
翻译的好辛苦,有些地方也不太理解什么意思,如果有误,还请大神指正. 官方文档地址:http://developer.android.com/guide/topics/ui/notifiers/noti ...
随机推荐
- python+selenium基础之XPATH定位(第一篇)
世界上最远的距离大概就是明明看到一个页面元素站在那里,但是我却定位不到!! selenium定位元素的方法有很多种,像是通过id.name.class_name.tag_name.link_text等 ...
- VirtualBox扩容CentOS-7虚拟机磁盘
1.背景描述 如上图所示,根路径"/"所在的文件系统已没有可用的磁盘空间,需要扩容磁盘. df -h 2.VirtualBox操作 2.1.查看当前虚拟磁盘的大小 如上图所示,点击 ...
- 【JavaScript】无框架翻页处理
这个业务太复杂了 输入框的东西要用接口查出来,居然不是用户手动输入 然后我就要做一个翻页的查询列表: <div form id="troublePartSearch" sty ...
- 甄嬛霸气照 —— Chinese Queen
- 失温急救处理方法——1.快速复温;2.心肺复苏;3.口服或静脉注射生理盐水(40 ~ 42 ℃ ,小剂量250 mL);4.口服或静脉注射抗血栓药物,如布洛芬
相关: https://haokan.baidu.com/v?pd=wisenatural&vid=14530104659934311010 参考: https://m.bjnews.com. ...
- 文本相似度 HanPL汉语言处理
@ 目录 前言 需求 简介 实操开始 1. 添加pom.xml依赖 2. 文本相似度工具类 3. 案例验证 4. 验证结果 总结 前言 请各大网友尊重本人原创知识分享,谨记本人博客:南国以南i. 提示 ...
- Next.js 中为什么 App Router 可能是未来,但 Pages Router 仍然重要?
Next.js 作为一个强大的 React 框架,为开发者提供了两种路由系统:App Router 和 Pages Router.这两种路由系统各有特色,适用于不同的场景.本文将深入探讨这两种路由系统 ...
- Docker 容器中镜像导出/导入
目录 [容器]镜像导出/导入 导出 导入 带标签 不带标签,后期修改 [仓库]镜像导出/导入 导出 导入 导入(完整命令) 创建一个简单的Docker镜像 利用docker ps -a命令查看要导出的 ...
- 四,分析Spring Boot底层机制(Tomcat 启动分析+Spring容器初始化+Tomcat如何关联 Spring 容器) 以及个人编写启动 Tomcat
四,分析Spring Boot底层机制(Tomcat 启动分析+Spring容器初始化+Tomcat如何关联 Spring 容器) 以及个人编写启动 Tomcat @ 目录 四,分析Spring Bo ...
- 浅谈下市面上流行的各种Linux操作系统
当前最流行的Linux操作系统之一是Ubuntu.它是一个基于Debian的开源操作系统,它的用户界面和易用性使得它成为许多用户的首选. 其他流行的Linux操作系统包括: Debian:一个稳定和可 ...