android 11 添加 exfat格式 U盘 挂载支持
目前比较好的在线查阅源码的网址推荐:http://aospxref.com 支持 7 8 9 10 11 12
从 android 的源码中看,在安卓9 以后就添加好了 vold 相关的实现,支持 exfat 的分区类型探测和挂载
http://aospxref.com/android-9.0.0_r61/xref/system/vold/fs/Exfat.cpp
格式探测实现,google 采用的方案 简单直接:
static const char* kMkfsPath = "/system/bin/mkfs.exfat";
static const char* kFsckPath = "/system/bin/fsck.exfat";
status_t Check(const std::string& source) { std::vector<std::string> cmd; cmd.push_back(kFsckPath); cmd.push_back(source); int rc = ForkExecvp(cmd, nullptr, sFsckUntrustedContext);
就是执行
/system/bin/fsck.exfat /dev/block/vold/public:179,1 根据返回的结果 ,来判断是不是某种类型的磁盘。
Mount Format 类似的实现比较简单,不在过多介绍。
查找内核支持的文件系统
http://aospxref.com/android-9.0.0_r61/xref/system/vold/Utils.cpp
static const char* kProcFilesystems = "/proc/filesystems"; bool FindValue(const std::string& raw, const std::string& key, std::string* value) { auto qual = key + "=\""; auto start = raw.find(qual); if (start > 0 && raw[start - 1] != ' ') { start = raw.find(qual, start + 1); } if (start == std::string::npos) return false; start += qual.length(); auto end = raw.find("\"", start); if (end == std::string::npos) return false; *value = raw.substr(start, end - start); return true; }
先看一下内核本身支持的格式:
/ # cat /proc/filesystems nodev sysfs nodev rootfs nodev ramfs nodev bdev nodev proc nodev cpuset nodev cgroup nodev cgroup2 nodev tmpfs nodev devtmpfs nodev configfs nodev debugfs nodev tracefs nodev sockfs nodev bpf nodev pipefs nodev devpts ext3 ext2 ext4 vfat msdos iso9660 nodev sdcardfs fuseblk nodev fuse nodev fusectl nodev overlay nodev incremental-fs udf f2fs nodev selinuxfs nodev binder nodev pstore nodev functionfs
如果内核本身不支持,怎么挂载?
目前看来需要2个支持,1,内核文件格式支持 2,mkfs.exfat fsck.exfat 的2个 可执行文件
好消息是,我已经测试过了,在 kernel 4.14.219 也能使用,有个编译问题自己解决下。
1,内核文件系统支持
https://github.com/dorimanx/exfat-nofuse
下载放到 kernel/fs/exfat-nofuse 下改名为 kernel/fs/exfat
修改配置
fs/Kconfig
source "fs/exfat/Kconfig"
fs/Makefile
obj-$(CONFIG_EXFAT_FS) += exfat/
修改你的 deconfig 添加 CONFIG_EXFAT_FS=y
2,mkfs.exfat fsck.exfat 支持 经测试,支持 android 9 10 11
https://github.com/exfatprogs/exfatprogs
放到 external 下 先使用 mm 编译会生成 system/bin/mkfs.exfat
添加打包安卓文件系统 修改 device/xxx/xxx/device.mk
添加配置
PRODUCT_PACKAGES += mkfs.exfat fsck.exfat
最终效果,就是能成功挂载U盘
cat /proc/mounts |grep exfat /dev/block/vold/public:179,2 /mnt/media_rw/BC65-4F75 exfat rw,dirsync,nosuid,nodev,noexec,noatime,gid=1023,fmask=0007,dmask=0007,allow_utime=0020,iocharset=utf8,namecase=0,errors=remount-ro 0 0