• 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
  • 相关阅读:
    树莓派ZeroW的Python中使用SQLite数据库
    树莓派Python读写配置文件--configparser库
    信号量示例——“生产者——消费者”实验
    互斥锁示例——模拟银行卡取钱
    管道通信(上)
    命名管道——进程通信案例
    文件I/O
    链表习题
    蓝桥杯ACM训练Day4——算法2-8~2-11:链表的基本操作
    C++——类模板几种常见的情况
  • 原文地址:https://www.cnblogs.com/ningci/p/16097048.html
Copyright © 2020-2023  润新知