android系统中区分UDisk和SDCard

为了满足项目需求,需要将UDisk和SDCard的挂载目录名称进行区分。系统默认使用UUID作为目录名,但这种命名方式在上层应用中不友好。通过修改`system/vold/PublicVolume.cpp`文件中的`doMount`函数,可以实现自定义挂载名。通过检查设备ID的major值来判断是UDisk还是SDCard,并据此调整稳定的名称(stable name)。这种方式基于内核mmc驱动的特性进行判断。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

因项目要求,需要将UDisk和SDCard挂载的名称区分开来,系统默认是将这些可移动存储设备的UUID作为其挂载的目录名称的,如下所示:

818D-1319这些都是相应的移动存储器的UUID,这个目录名称在上层APP使用时让人会觉得很抓疯,所以这里通过本文的方法来修改这个挂载目录名。

打开system/vold/PublicVolume.cpp这个文件,在doMount这个函数里有如下一段代码:

std::string stableName = getId();
if(!mFsUuid.empty()) {
    stableName = mFsUuid;
}

这里就是设备可移动存储设备的挂载名称的,这里失获取相应的设备ID并判断UUID如果不为空则使用设备的UUID作为stable name

所以在这里通过判断是UDisk还是SDCard来修改相应的stable name就可以了

我这里通过判断相应移动设备的major来区分是UDisk还是SDCard的,相应代码如下

std::string stableName = "udisk";
int mj = major(mDevice);

if((mj == 179) || (mj >= 240 && mj <= 254)) {
    stableName = "external_sd";
}

为什么这里要这样判断呢,我们来看看内核里mmc的驱动

Linux读取U盘或者移动硬盘序列号并获取U盘或者移动硬盘分区名。基本原理如下: 当有外置 USB 插入的时候,会产生 /proc/scsi/usb-storage 目录,并在其中产生数字文件(形如 1 2 3 4),此文件存储了设备相关信息。 相应的 /sys/class/scsi_device/ 目录中会有 scsi 设备的目录(ide 硬盘默认无子目录,sata硬盘默认有子目录),以数字开头(形如 1:0:0:0 2:0:0:0) 这个数字与前面 /proc/scsi/usb-storage目录中的相对应,子目录表示sata硬盘。比如 /sys/class/scsi_device/2:0:0:0/device/block 中有USB设备,从该目录下得到U盘或者移动硬盘的分区名,比如sda1。 该demo实现了上述过程,先检查 /proc/scsi/usb-storage 目录,看是否有u盘或者移动硬盘接入,如果有则读取u盘或者移动硬盘的序列号,然后在/sys/class/scsi_device/目录下逐级查找,直到找到u盘或者移动硬盘的分区。 完整代码,可直接编译测试,嵌入式环境下也是适应的。 在linux测试如下,id表示序列号,sdb1表示是分区名称: # ./a.out udisk dev num:0 udisk id:055CE21B ret:0 dev num:0 found dir:0:0:0:1 found dev dir:0:0:0:1,full path:/sys/class/scsi_device/0:0:0:1 sub founction found dir:sda found sd device dir:sda,full path:/sys/class/scsi_device/0:0:0:1/device/block/sda found dir:0:0:0:2 found dev dir:0:0:0:2,full path:/sys/class/scsi_device/0:0:0:2 sub founction found dir:sdb found sd device dir:sdb,full path:/sys/class/scsi_device/0:0:0:2/device/block/sdb found sd sub device dir:sdb1 found dir:0:0:0:0 found dev dir:0:0:0:0,full path:/sys/class/scsi_device/0:0:0:0 sub funciton Open Directory /sys/class/scsi_device/0:0:0:0/device/block Error:No such file or directory get name return:0,disk name:sdb1 # 因为有的USB设备会有好几个,比如把CDU盘集成到一起,就会出现上面的情况,有多个子目录去查找。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值