Android9.0支持exFat格式u盘识别

前言

前几天因工作需要在Android9.0上增加exfat格式u盘识别,查找相关资料之后只找到了Android4.4以及Android7.0的教程。fuse和no-fuse两种实现方法选其一即可,实际上Android9.0中已经几乎有全部的exfat的识别逻辑,只需要再集成部分内容,即可实现,在实现过程中,发现只用其中一种方法,貌似不行,于是结合起来,在保证少修改的前提下实现,现将Android9.0的实现方法记录如下:

参考链接如下:

  1. https://blog.csdn.net/huolinliang/article/details/86589976
  2. https://blog.csdn.net/qq_26338009/article/details/100554847

Kernel: v4.4.179

Device: rk3328

Platform Version: Android 9.0

详细步骤

  1. 判断是否已经支持exfat格式u盘,如果有此日志,就说明还不支持

    1

  2. 从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"
  3. 如果编译不报错,那么dmesg和proc/filesystems下可以看如下信息,就说明no-fuse已经添加成功

    1

  4. 在system/vold/fs/Exfat.cpp中(在Andrid7.0里没有,需要参照参考链接中添加),如果想要支持exFat,需要满足两个条件,一个是包含图中的两个可执行文件,一个/proc/filesystems/中包含exfat(第二个步骤我们已经实现了这个条件)

    1

  5. 从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

    1

    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)
  6. 在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
  1. 会在out目录system/bin下生成可执行文件mount.exfat,另外有两个指向它的软连接fsck.exfat和mkfs.exfat

    1

  2. 检测是否已经实现成功,插上u盘有如下日志:

    1

转载请注明出处:http://www.wolfnx.com/2020/06/14/Android9.0-exFat-Support

作者 : wolfnx
邮箱 : wolfnx@outlook.com
邮箱2 : lostnx@gmail.com

Click Me