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盘,如果有此日志,就说明还不支持

    Android9.0支持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已经添加成功
    Android9.0支持exFat格式u盘识别_第2张图片

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

    Android9.0支持exFat格式u盘识别_第3张图片

  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
    

    Android9.0支持exFat格式u盘识别_第4张图片

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

    1

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

    Android9.0支持exFat格式u盘识别_第5张图片

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

作者 : wolfnx
邮箱 : [email protected]
邮箱2 : [email protected]

你可能感兴趣的:(kernel,rk3328,Android,Framework,linux,android,exfat,usb)