前言
前几天因工作需要在Android9.0上增加exfat格式u盘识别,查找相关资料之后只找到了Android4.4以及Android7.0的教程。fuse和no-fuse两种实现方法选其一即可,实际上Android9.0中已经几乎有全部的exfat的识别逻辑,只需要再集成部分内容,即可实现,在实现过程中,发现只用其中一种方法,貌似不行,于是结合起来,在保证少修改的前提下实现,现将Android9.0的实现方法记录如下:
参考链接如下:
- https://blog.csdn.net/huolinliang/article/details/86589976
- https://blog.csdn.net/qq_26338009/article/details/100554847
Kernel: v4.4.179
Device: rk3328
Platform Version: Android 9.0
详细步骤
判断是否已经支持exfat格式u盘,如果有此日志,就说明还不支持
从github上下载no-fuse驱动https://github.com/dorimanx/exfat-nofuse
//在将下载好的驱动放入kernel/fs/下,并重命名未exfat,此文件夹内还有ntfs、fat等文件夹 //编辑Kconfig和Makfile,将exfat编译进内核。 //Makefile +obj-y += exfat/ //Kconfig source "fs/fat/Kconfig" +source "fs/exfat/Kconfig" source "fs/ntfs/Kconfig"
如果编译不报错,那么dmesg和proc/filesystems下可以看如下信息,就说明no-fuse已经添加成功
在system/vold/fs/Exfat.cpp中(在Andrid7.0里没有,需要参照参考链接中添加),如果想要支持exFat,需要满足两个条件,一个是包含图中的两个可执行文件,一个/proc/filesystems/中包含exfat(第二个步骤我们已经实现了这个条件)
从github上下载fuse,编译出system/bin/mkfs.exfat和system/bin/fsck.exfat, https://github.com/Lurker00/Android-fs
//下载其中的jni/external/exfat 和 jni/external/fuse //拷贝exfat和fuse目录到android源码中external目录下 //修改exfat下的Android.mk
LOCAL_MODULE := mount.exfat LOCAL_SRC_FILES := main.c LOCAL_STATIC_LIBRARIES += libexfat_mount libexfat_fsck libexfat_mkfs libexfat_dump libexfat_label LOCAL_STATIC_LIBRARIES += libexfat libfuse include $(BUILD_EXECUTABLE) LINKS := fsck.exfat mkfs.exfat SYMLINKS := $(addprefix $(TARGET_OUT)/bin/,$(LINKS)) $(SYMLINKS): EXFAT_BINARY := $(LOCAL_MODULE) $(SYMLINKS): $(LOCAL_INSTALLED_MODULE) $(LOCAL_PATH)/Android.mk @echo "Symlink: $@ -> $(EXFAT_BINARY)" @mkdir -p $(dir $@) @rm -rf $@ $(hide) ln -sf $(EXFAT_BINARY) $@ ALL_DEFAULT_INSTALLED_MODULES += $(SYMLINKS)
在Android9.0上编译可能会有语法报错,修改exfat/Android.mk和fuse/Android.mk增加屏蔽警告
XFAT_CFLAGS := = \
-Wno-error=format-security \
-Wno-unused-result \
-D__ANDROID_O \
-Wno-unused-variable \
-Wno-sign-compare \
-Wno-pointer-sign \
-Wno-unused-function \
-Wno-unused-parameter \
-Wno-unused-variable \
-Wno-implicit-function-declaration \
-Wno-unused-result \
-Wno-address-of-packed-member \
-Wno-missing-field-initializers \
-Wno-pointer-arith
会在out目录system/bin下生成可执行文件mount.exfat,另外有两个指向它的软连接fsck.exfat和mkfs.exfat
检测是否已经实现成功,插上u盘有如下日志:
转载请注明出处:http://www.wolfnx.com/2020/06/14/Android9.0-exFat-Support
作者 : wolfnx
邮箱 : wolfnx@outlook.com
邮箱2 : lostnx@gmail.com