安卓源码修改之禁用USB存储弹窗
代码查找
在我们插入或者拔出USB外设存储时候,系统都会弹出一个Notification提示设备状态,我们可以根据这点定位相关的源码位置
dumpsys notification <== 查看notification相关的dump信息
从打印的信息中,我们发现有较多的com.android.systemui信息包含在其中.因此我们优先找到对应包名下的源代码
/framework/base/package/systemui/...
- 查看此路径下的src文件夹中,我们发现有一个usb文件夹,打开即可发现重要的文件StorageNotification.java,相关的USB挂在通知就是在此进行管理
源码分析
定位
android/frameworks/base/packages/SystemUI/src/com/android/systemui/usb/StorageNotification.java
几个重要的类
NotificationManager 通知栏管理器 StorageManager 存储管理器 StorageEventListener 存储事件监听者 BroadcastReceiver 广播接收器 MoveCallback 貌似是回调
运行流程
onstart()
- 获取通知栏管理器
- 获取存储管理器
- 注册相应监听者
- 注册相应广播监听器
- 检测磁盘设备
- 扫描可用设备,处理分发设备挂载信息
- 注册MoveCallback,设备移除监听
- 更新设备状态 <== 只对公共设备处理,设备没问题,等待用户处理,有问题提示用户重新插入
扫面磁盘onDiskScannedInternal
- 磁盘数目大于0,但是可用设备0,提示用户系统不支持设备,提示格式化处理
- 设备检测无误,可以下序操作
处理设备挂在信息onVolumeStateChangedInternal
- 个人设备信息,不做处理
- 公共设备信息,处理发送通知及提示音
- 未挂载状态
- 检查中
- 成功挂载,挂载只读状态(发送设备打开Dialog)
- 正常移除
- 异常移除
- …
小记
- NotificationManager通过binder通信获取服务,更新通知栏状态
- StorageManager也是通过binder通信机制实现
- MoveCallBack可能是设备插入后拔出调用的相关逻辑
当存储设备状态发生改变时候,会调用对应的StorageEventListener监听者,执行器内部逻辑,检测无误,最终调用 onVolumeStateChangedInternal方法
- onVolumeStateChanged
- onVolumeRecordChanged
- onVolumeForgotten
- onDiskScanned
添加U盘插入后的逻辑可以在成功挂在后进行,在这里禁用MStar的多媒体弹窗即可
*