這幾天測試的時候發現個很奇怪的問題 如果將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到板子 重啓 就可以了
初步測試是沒問題了