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

 

posted @ 2022-04-03 19:28  宁次  阅读(1738)  评论(0编辑  收藏  举报