android原生在vold中检查到kernel上报的event信息(sd卡)会发给MountService,然后MountService通过localSocket发给vold,让vold去mount这张sd卡。在vold中这个通信机制,在在一个死循环,select函数中执行,也就是vold处理MountService发给来的信息是顺序的,如果线程卡住了,select函数也执行不下去,整个MountService给vold发信息,都会卡住等待。
一、问题原因,现象
好了问题出在哪呢,当vold去mount的时候先要check sd卡:
status_t PublicVolume::doMount() {
// TODO: expand to support mounting other filesystems
readMetadata();
if (mFsType != "vfat") {
LOG(ERROR) << getId() << " unsupported filesystem " << mFsType;
return -EIO;
}
if (vfat::Check(mDevPath)) {
LOG(ERROR) << getId() << " failed filesystem check";
return -EIO;
}
只有check过了,才会去mount。
而这个check是开了一个进程去执行一个linux原始的工具,而我们需要等待这个进程的一个结果。下面我们来看下代码:
status_t Check(const std::string& source) {
if (access(kFsckPath, X_OK)) {//检查这个进程是否有执行权限,没有直接不检查了
SLOGW("Skipping fs checks\n");
return 0;
}
int pass = 1;
int rc = 0;
do {
std::vector<std::string> cmd;
cmd.push_back(kFsckPath);
cmd