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到板子 重啓 就可以了

初步測試是沒問題了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章