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

这几天测试的时候发现个很奇怪的问题 如果将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 udisk
        if (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 udisk
        if (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到板子 重启 就可以了

初步测试是没问题了

时间: 2024-11-09 17:46:26

android4.0 U盘热插拔后挂载不上bug解决的相关文章

openwrt U盘热插拔自动挂载

添加USB相关支持 Kernel modules -> USB Support -> <*> kmod-usb-core. ##默认已经选了 Kernel modules -> USB Support -> <*> kmod-usb-ohci. ##默认已选 old usb1.0 Kernel modules -> USB Support -> <*> kmod-usb-uhci. ## usb1.1 Kernel modules -

Ubuntu系统制作U盘启动项以及针对U盘挂载后显示&quot;只读系统&quot;的解决措施

1)Linux系统制作U盘启动项在公司的一台ubuntu机器上插入U盘,然后将机器上的一个ubuntu的iso镜像做成U盘启动.制作方法如下:首先执行命令 sudo usb-creator-gtk 2)针对U盘挂载后显示"只读系统"的解决措施 Ubuntu下挂载了一个U盘,进入U盘路径后,显示该U盘是只读文件系统,不能在里面进行新建,复制,删除等写操作.下面简单介绍下解决办法(此在方法在ubuntu以及fedora上验证可用,其他的版本的linux应该也可以借鉴):-  插上U盘- 

Ubuntu12.04编译Android4.0.1源码全过程-----附wubi安装ubuntu编译android源码硬盘空间不够的问题解决

本文转至  http://blog.csdn.net/yanzi1225627/article/details/9263097 昨晚在编译源码,make一段时间之后报错如下: [html] view plaincopyprint? # A fatal error has been detected by the Java Runtime Environment: # #  SIGSEGV (0xb) at pc=0x40362d33, pid=12195, tid=2835454784 # # 

QT210 android2.3 和android4.0 烧写编译日记

QT210下载烧录编译android2.3过程 工作环境:ubuntu12.04.5 | QT210开发板光盘 | QT210开发板 android2.3编译环境:gcc version 4.4.7  | java version 6 | java version 5 | git version 1.7.9.5 tips by chsry:浅灰色是终端窗口运行保存的部分命令和信息,ubuntu14.04无法编译QT210 android2.3(无法安装java6) 安装好ubuntu12.04.

kali 2.0 U盘安装错误Your installation cd-rom couldn&#39;t be mounted

1.kali 2.0前天(2015.08.11)发布了.果断下载下来换掉本机的1.0版本. 2.用U盘安装的过程中,出现cd-rom无法挂载.提示错误Your installation CD-ROM couldn't be mounted. 3.在谷歌搜索后,参考国外的http://serverfault.com/questions/685302/unattended-installation-of-ubuntu-from-usb-drive-not-mounted-correctly 4.经过

1虚拟机下U盘或磁盘挂载,Ubuntu下的网络配置,图形化界面和命令界面之间的切换,软件源配置

 一设置磁盘挂载(磁盘默认挂载到了/media目录下了) A:插入移动硬盘 B:对虚拟机进行设置(虚拟机->可移动设备àtoshibaExternal USB 3.0(这个是我的移动硬盘插上去之后显示的一项)à连接) 有时候出现以下现象 C:检测存储设备名称 sudofdisk –l E:挂载存储设备sdb1到挂载点/mnt目录下 sudomount /dev/sdb1 /mnt F:访问/mnt cd/mnt G:卸载/mnt sudo umount /mnt 二虚拟机下U盘或磁盘挂载,步

如何在openwrt上实现 U盘的自动挂载

U盘的自动挂载,分为两种场景 1.路由器先上电,然后插上U盘并自动挂载 2.路由器先插上U盘,然后上电并自动挂载 上述场景的实现,需要如下几个步骤: 1.支持如下模块: USB驱动模块:USB OHCI/USB 2.0/USB UHCI 文件系统支持:VFAT,ntfs-3g, 字符集支持:cp437/CP936/utf-8/iso8859-1 网络文件服务:samba server 2.使用hotplug机制,放入挂载脚本文件:/etc/hotplug.d/block/30-block_mou

Android4.0(Phone)拨号启动过程分析(二)

接上:Android4.0(Phone)拨号启动过程分析(一) InCallScreen处理来电和拨号的界面,接通电话也是这个界面,接下来分析InCallScreen类是如何处理拨号流程的: @Override protected void onCreate(Bundle icicle) { Log.i(LOG_TAG, "onCreate()... this = " + this); Profiler.callScreenOnCreate(); super.onCreate(icic

android4.0蓝牙使能的详细解析

此博客是转载过来的哦... 给自己博客定几个部分: (1)写在前面的话:一些写博客时的废话. (2)内容简介:把文章的主要内容或者核心部分作一个框架性的概括,以方便大家阅读. (3)正文:这个不需要解释了.   写在前面的话:这是csdn上的第一篇博客,希望自己能够坚持写下去,也希望能够得到大家的支持.本文可能会涉及大量的源码注释,在文字方面可能不够尽如人意,希望真正想理解该过程的同学们能够耐心看下去. 内容简介:本文详细分析了android4.0中蓝牙使能的过程,相比较android2.3,4