由于工作需要,想实现exFAT格式的U盘和SD卡自动挂载,但目前看到的文章基本都是采用MTK平台,要不就是android4.x,太老了。而且我试了下没有可以挂载成功的,通过一加开源源码修改了一份exFAT的移植方案。基于android7.0 高通平台。
采用noFuse方式添加exFAT文件系统,并实现SD卡自动挂载。
Kernel部分:
- 在kernel/fs下新增exFAT驱动
- 修改kernel/fs中Makefile文件,使exFAT目录参与编译。
obj-y += exfat/
修改后在exFAT源码中随便添加个编译报错试一下是否参与了编译。Kernel部分修改完成。
System/vold部分
这部分实现exFAT格式的SD卡自动挂载功能
if (table == Table::kMbr) {
const char* type = strtok(nullptr, kSgdiskToken);
LOG(WARNING) << "mbr type = " << type;
// switch (strtol(type, nullptr, 16)) {
// case 0x06: // FAT16
// case 0x0b: // W95 FAT32 (LBA)
// case 0x0c: // W95 FAT32 (LBA)
// case 0x0e: // W95 FAT16 (LBA)
// createPublicVolume(partDevice);
// break;
// }
createPublicVolume(partDevice);
}
原生代码只支持FAT32这里要将switch判断去掉,让其创建volume;也可以加一个case,但我不确定要加那些case所以就注释掉了
3. 修改PublicVolume.cpp
在doMount方法中添加exFAT分支,根据方法中FAT32文件系统的代码添加判断即可。
else if (mFsType == "exfat") {
if (exfat::Check(mDevPath)) {
LOG(ERROR) << getId() << " failed filesystem check";
return -EIO;
}
}
else if (mFsType == "exfat") {
if (exfat::Mount(mDevPath, mRawPath, false, false, false,
AID_MEDIA_RW, AID_MEDIA_RW, 0007, true)) {
PLOG(ERROR) << getId() << " exfat: failed to mount " << mDevPath;
return -EIO;
}
else
LOG(VERBOSE) << "exfat: mount succeed " << mDevPath;
}
4. 修改Android.mk文件
添加Exfat.cpp 参与编译
External部分
修改external/e2fsprogs/lib/blkid/probe.c和external/e2fsprogs/lib/blkid/probe.h 这两个文件。因为SD卡插入后要进行文件系统检查,这里增加blkid命令对exFAT的支持。
这部分是参考https://blog.csdn.net/huolinliang/article/details/86589976 这篇文章。
Device部分
修改fstab.qcom文件,将sd卡的type修改为auto
/devices/platform/*usb* auto vfat defaults voldmanaged=usb:auto /devices/platform/fe320000.dwmmc/mmc_host* auto auto defaults voldmanaged=sdcard1:auto
system\sepolicy部分
以上部分修改完成后,功能可以实现,但是有selinux报错,可以先设置setenforce 0 进行调试。
高通平台Android7.0自动挂载exFAT格式SD卡和U盘_android 7 u盘挂载事件-CSDN博客 标签:case,U盘,exFAT,修改,auto,挂载,SD From: https://www.cnblogs.com/wanglongjiang/p/18029936