发现系统启动后,同一个usb设备被挂载了多次,导致文件管理器相关应用显示出现问题。usb设备挂载的流程在android/system/vold/Volume.cpp中,由Volume::mountUdiskVol函数处理。在mount前判断该设备是否已被挂载,可解决该问题:
bool isUsbDeviceMounted(const char *path) {
char device[256];
char mount_path[256];
char rest[256];
FILE *fp;
char line[1024];
if (!(fp = fopen("/proc/mounts", "r"))) {
SLOGE("Error opening /proc/mounts (%s)", strerror(errno));
return false;
}
while(fgets(line, sizeof(line), fp)) {
line[strlen(line)-1] = '\0';
sscanf(line, "%255s %255s %255s\n", device, mount_path, rest);
if (!strcmp(device, path)) {
fclose(fp);
return true;
}
}
fclose(fp);
return false;
}
int Volume::mountUdiskVol() {
...
for (it = mUdiskPartition->begin(); it != mUdiskPartition->end();it++)
{
imajor =(*it)->imajor;
iminor =(*it)->iminor;
sprintf(devicePath, "/dev/block/vold/%d:%d", imajor,iminor);
if (isUsbDeviceMounted(devicePath))
continue;
...
}
...
}