这几天测试的时候发现个很奇怪的问题 如果将TF卡插到读卡里然后在插到板子上 热插拔后都可以挂载上 但是使用U盘只有第一次插上去的时候能挂载上 拔下来后 在插上就挂载不上了 驱动里可以识别到U盘已经插入 研究了MountService和Vold 最后通过查看/proc/mounts文件发现 U盘第一次插上后是正常挂载 但是拔掉后没有卸载 多么纠结的事件 主要涉及文件system/vold/DirectVolume.cpp

分析log发现 拔掉带有TF卡的读卡器时 状态是这样的

4(Mounted) -> 5(Unmounting)

5(Unmounting) -> 1(Idle-Unmounted)

1(Idle-Unmounted) -> 0(No-Media)

而U盘拔掉状态是这样的

4(Mounted) ->0(No-Media)

拔掉带有TF卡的读卡器时最后执行了这样两个函数

先执行了

handlePartitionRemoved

然后执行了

handleDiskRemoved

拔掉U盘时最后执行了函数只执行了

handleDiskRemoved

而卸载的函数是在handlePartitionRemoved里执行的所以修改handleDiskRemoved函数

修改后如下

void DirectVolume::handleDiskRemoved(const char *devpath, NetlinkEvent *evt) {int major = atoi(evt->findParam("MAJOR"));int minor = atoi(evt->findParam("MINOR"));char msg[255];SLOGD("Volume %s %s disk %d:%d removed\n", getLabel(), getMountpoint(), major, minor);snprintf(msg, sizeof(msg), "Volume %s %s disk removed (%d:%d)",getLabel(), getMountpoint(), major, minor);mVm->getBroadcaster()->sendBroadcast(ResponseCode::VolumeDiskRemoved,msg, false);if(getState() == Volume::State_Mounted) {//add by hclydao for udiskif (Volume::unmountVol(true, false)) {SLOGE("Failed to unmount volume on bad removal (%s)", strerror(errno));// XXX: At this point we're screwed for now} else {SLOGD("Crisis averted");}} setState(Volume::State_NoMedia);
}

增加了中间的这个判断

 if(getState() == Volume::State_Mounted) {//add by hclydao for udiskif (Volume::unmountVol(true, false)) {SLOGE("Failed to unmount volume on bad removal (%s)", strerror(errno));// XXX: At this point we're screwed for now} else {SLOGD("Crisis averted");}}

重新编译vold 然后push到板子 重启 就可以了

初步测试是没问题了

android4.0 U盘热插拔后挂载不上bug解决相关推荐

  1. WPF .NET 4.0 OpenClipboard 失败 (异常来自 HRESULT:0x800401D0 (CLIPBRD_E_CANT_OPEN)) BUG解决

    WPF .NET 4.0 OpenClipboard 失败 (异常来自 HRESULT:0x800401D0 (CLIPBRD_E_CANT_OPEN)) BUG解决 参考文章: (1)WPF .NE ...

  2. 宝塔控制面板创建ftp后链接不上的解决方法

    宝塔控制面板创建ftp后链接不上的解决方法 参考文章: (1)宝塔控制面板创建ftp后链接不上的解决方法 (2)https://www.cnblogs.com/cncom/p/10772078.htm ...

  3. linux文件系统挂载不上,nfs文件系统在linux下挂载不上的解决办法

    问题一: # mount -t nfs -o 192.168.1.51:/mnt /mnt/ mount: can't find /mnt/ in /etc/fstab 这种情况说明我们的/mnt目录 ...

  4. Mac下移动硬盘/U盘热插拔后不能识别的问题解决

    mac下使用移动硬盘或U盘 一定要按规范操作完成,如果热插拔,下次再连接的时候会无法识别. 注意:这种情况下,在windows系统上大概率还是可以正常识别和使用的. 1. 想要在mac下直接恢复 方法 ...

  5. Adobe Acrobat 高亮工具使用后无法显示文字Bug解决办法

    经常使用Adobe Acrobat,但最近在使用9.0版时,对文字使用Highlight Tool高亮选中目标段落文字时发现,选中的文字被高亮部分颜色给遮住了.开始以为是透明度Opacity给的不正确 ...

  6. 全志A10 android4.0 windows+linux版固件生成器

    Android4.0固件生产工具说明                          by:xian 一.准备阶段 1.1 工具简介 该工具为全志A10方案中附带程序,默认只支持ubuntu10.0 ...

  7. Mac百度网盘打开后无法运行?解答来了

    我们在MAC电脑上使用百度网盘的时候可能会遇到BUG,从而导致百度网盘在Mac上打开后,是无法运行的.出现这种情况该怎么办?如何解决这个bug呢?下面跟随小编看看百度网盘打开后无法运行怎么办的解决办法 ...

  8. linux挂载u盘出错_linux挂载U盘、移动硬盘后无法更改权限

    话说最近在树莓派上搭建了一个owncloud,因为树莓派的存储空间有限,就插了个16G的U盘,然后设置成开机自动挂载.这里稍微注意一下的是U盘的格式最好不要NTFS,因为一般情况下NTFS格式的文件系 ...

  9. 阿里云云盘开通后格式化和挂载数据盘

    如果您已经为 ECS 实例配了数据盘,您需要先格式化数据盘并挂载文件系统后才能正常使用数据盘. 本文描述如何用一个新的数据盘创建一个单分区数据盘并挂载文件系统.本文仅适用于使用 fdisk 命令对一个 ...

最新文章

  1. There is no isNullOrEmpty for collections in Guawa
  2. 【可持久化线段树?!】rope史上最全详解
  3. SM66 does not have debug button in Q system
  4. 【jenkins】jenkins按分支build和email
  5. QT的foreach用法
  6. java 图类_Java集合类,一张图说清楚!
  7. Linux Shell笔记5 Linux的文件系统
  8. 前年的斐波那契蹲在地上看着你,笑而不语
  9. 【JavaScript回顾】闭包
  10. sklearn gridsearchcv_sklearn调包侠之PCA降维
  11. 浅谈css中一个元素如何在其父元素居中显示
  12. Qt的project文件的设置相关
  13. mysql pxc 原理_mysql PXC配置
  14. 小学计算机网络教室简介,陆桥实验小学计算机网络教室配备情况一览表(6页)-原创力文档...
  15. 为什么电子邮件的账号地址公司是统一的,电子邮件地址该怎么写?
  16. 阿里云服务器部署app服务器端-流程步骤
  17. 语音识别入门课——week5(GMM-HMM)
  18. 论文结尾标注的引用的参考文献批量导入Endnote
  19. 再探Struts框架
  20. 数据挖掘利器 selenium实战案例--论文数据挖掘与可视化分析(上)

热门文章

  1. Gartner预计2019年全球半导体收入将下滑9.6%;苹果中国用户正流向华为;Facebook将支付50亿美元与FTC和解...
  2. CAD C#二次开发 圆和圆弧转Polyline线
  3. 世界上第一台通用计算机的英语缩写,世界上第一台计算机诞生
  4. 计算机网络安全杨寅春,若干部分盲签名方案的密码学分析和改进
  5. Clion新UI体验,墙裂推荐,用起来真的好爽啊!
  6. 【爬虫】邪恶gif图出处爬虫
  7. 视频转换中的码率是什么意思?它的大小有什么作用?
  8. 一键U盘启动快捷方式
  9. 有病毒的u盘文件上传到服务器,还在被u盘病毒困扰?送你15个文件传输网站以及20+u盘工具...
  10. 第8章 - 异构系统的协同控制及最优控制 --> 最优控制