主要的修改:
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