关于 vold 的详细分析可以参考
这篇文章
此文主要是用来记录工作中添加 NTFS 格式支持时遇到的一些问题。文章是基于 intel 的 CherryTrail T4 平台的 Android 6.0 版本来分析的,其他平台上大致流程应该也差不多。
(由于Ntfs.cpp/Ntfs.h文件是从MTK平台porting过来的,这里就不贴出了)
-
Public Volume & Private Volume
从 6.0 开始,Google 将 Volume 分成了 Public Volume(TF卡,U盘等一系列Mbr分区的disk) 和 Private Volume(Gpt分区的扩展存储)
关于两种 Volume 的区分和创建相关代码逻辑在 vold 源码目录下的 Disk.cpp 中。
if (table == Table::kMbr) {
const char* type = strtok(nullptr, kSgdiskToken);
LOG(ERROR) << "readPartitions disk type is " << type;// add linqihan
switch (strtol(type, nullptr, 16)) {
case 0x06: // FAT16
case 0x07: // add by linqihan, for NTFS or ExFat
case 0x0b: // W95 FAT32 (LBA)
case 0x0c: // W95 FAT32 (LBA)
case 0x0e: // W95 FAT16 (LBA)
createPublicVolume(partDevice);
break;
}
} else if (table == Table::kGpt) {
const char* typeGuid = strtok(nullptr, kSgdiskToken);
const char* partGuid = strtok(nullptr, kSgdiskToken);
if (!strcasecmp(typeGuid, kGptBasicData)) {
createPublicVolume(partDevice);
} else if (!strcasecmp(typeGuid, kGptAndroidExpand)) {
createPrivateVolume(partDevice, partGuid);
}
}
通过添加相应的case,NTFS格式的U盘现在可以被识别并且创建出相应的 Public Volume。
U盘和 TF卡相应的 Block 块文件在设备中的 /dev/block/vold/ 目录下,当且仅当设备识别出该硬件并且创建出相应的 disk 和 volume 时,该路径下才会有相应的文件
以 U 盘为例: