rk3399 安卓7 添加 exfat 格式U 盘支持

开发板是 IBOX3399卡片电脑:http://www.9tripod.com/showpro.php?id=93

安卓源码:https://gitlab.com/9tripod/x3399_nougat

主要的修改:

1,内核添加 exfat 文件系统支持
2,vold 添加 exfat 文件系统支持
3,需要 exfat 文件检查,格式化工具的支持,vold 中需要用到

参考:git clone https://gitee.com/rock_telp/android_add_exfat

1,内核 exfat 文件系统支持
复制 android_add_exfat\kernel-4.19\fs\exfat 到 kernel/fs/

2,exfat 相关工具 格式化 检查
复制 external下 exfat fuse 到 安卓源码 external下

3,安卓相关配置 主要是 vold 的修改和对应产品的配置相关

产品配置信息

device/rockchip/rk3399/device.mk

selinux 标签 非必需
device/rockchip/common/sepolicy/file_contexts

4,blkid 添加对 exfat 的识别支持

e2fsprogs

合入以下 patch
https://github.com/tytso/e2fsprogs/commit/1206f6d8c5ed47ba19cfc30a19dba51fcd2cd5cb.patch

5,修改错误

android_add_exfat\external\exfat\Android.mk

LOCAL_STATIC_LIBRARIES += libexfat libfuse

libfuse 不存在,实际编译的为 libfuse_static
LOCAL_STATIC_LIBRARIES += libexfat libfuse_static

vold 的修改对应不上,需要手动修改

参考 vfat 改成 exfat 并添加到 Android.mk vold 的编译中
vold/fs/Exfat.cpp

status_t Mount(const std::string& source, const std::string& target, int ownerUid, int ownerGid,
int permMask) {
int mountFlags = MS_NODEV | MS_NOSUID | MS_DIRSYNC | MS_NOATIME | MS_NOEXEC;
auto mountData = android::base::StringPrintf("uid=%d, gid=%d, fmask=%o, dmask=%o", ownerUid,
ownerGid, permMask, permMask);

if (mount(source.c_str(), target.c_str(), "exfat", mountFlags, mountData.c_str()) == 0) {
return 0;
PLOG(ERROR) << "Mount failed; attempting read-only";
mountFlags |= MS_RDONLY;
if (mount(source.c_str(), target.c_str(), "exfat", mountFlags, mountData.c_str()) == 0) {
return 0;
}
}
return -1;
}

修改完成重新刷机,插入U盘测试,查看 exfat 格式挂载:
x3399:/ # cat /proc/mounts |grep exfat
/dev/block/vold/public:8,1 /mnt/media_rw/public:8,1 exfat rw,dirsync,nosuid,nodev,noexec,noatime,uid=1023,gid=1023,fmask=0007,dmask=0007,allow_utime=0020,iocharset=utf8,namecase=0,errors=remount-ro 0 0

win11 使用下载软件版本:
AndroidTool_Release_v2.38

posted @ 2025-10-18 13:10  宁次  阅读(8)  评论(0)    收藏  举报