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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章