目前比較好的在線查閱源碼的網址推薦: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