让Android 11.0 支持exFAT文件系统,主要工作是kernel部分的nofuse移植和userspace的fuse移植,其他部分kernel和android都已实现,这个移植工作参考下面任何一篇文档都可以实现,我就不赘述了。
kernel中移植nofuse,代码下载解压后,更名exfat放到kernel/fs下, 修改kernel/fs下Kconfig、Makefile,以及kernel的config。
移植fuse,下载源码,并放到external/exfat下, 修改编译系统的.mk。
感谢各位分享!
https://blog.csdn.net/An_Times/article/details/106858104
https://blog.csdn.net/Rank_d/article/details/115675292
https://blog.csdn.net/gz0797/article/details/109669763
https://blog.csdn.net/mingchong2005/article/details/114088463
这里主要介绍碰到的几个问题,并且在其他文档没有提到的部分:
1. 编译问题,external/exfat下,提示exfat.h头文件找不到,试了几个方法无果,因为赶时间,不得已暂时将相关头文件在每个需要头文件的目录下放了一份
2. 编译错误, 普通的数据类型错误,修改完成即可。
3. fsck.exfat,mkfs.exfat,mount.exfat 没被打包到system.img里面,所以adb shell ls -Z /system/bin/*.exfat找不到它们,在log里面也会提示IsSupported 0。
因为android 11 out目录存在qssi和target两种目录,由不同的mk文件定义PRODUCT_PACKAGES输出到不同的目录和image,
对于
#exfat
PRODUCT_PACKAGES += \
mount.exfat \
mkfs.exfat \
fsck.exfat
之前是放在device/qcom/bengal/bengal.mk,编译的时候打包不了,
修改为build\target\product\base_system.mk,即可以正常打包到system.img
4.userdebug版本正常,user版本异常
出现的错误log为
5-09 09:25:11.537 582 613 E vold : public:179,33 shah: PublicVolume::doMount: IsSupported 0
05-09 09:25:11.537 582 613 E vold : public:179,33 shah: PublicVolume::doMount: unsupported filesystem exfat
05-09 09:25:11.537 1862 2426 E StorageManagerService: android.os.ServiceSpecificException: (code -5)
05-09 09:25:11.537 1862 2426 E StorageManagerService: at android.os.Parcel.createExceptionOrNull(Parcel.java:2387)
05-09 09:25:11.537 1862 2426 E StorageManagerService: at android.os.Parcel.createException(Parcel.java:2357)
05-09 09:25:11.537 1862 2426 E StorageManagerService: at android.os.Parcel.readException(Parcel.java:2340)
05-09 09:25:11.537 1862 2426 E StorageManagerService: at android.os.Parcel.readException(Parcel.java:2282)
05-09 09:25:11.537 1862 2426 E StorageManagerService: at android.os.IVold$Stub$Proxy.mount(IVold.java:1797)
05-09 09:25:11.537 1862 2426 E StorageManagerService: at com.android.server.StorageManagerService.mount(StorageManagerService.java:2252)
05-09 09:25:11.537 1862 2426 E StorageManagerService: at com.android.server.StorageManagerService.access$1800(StorageManagerService.java:212)
05-09 09:25:11.537 1862 2426 E StorageManagerService: at com.android.server.StorageManagerService$StorageManagerServiceHandler.handleMessage(StorageManagerService.java:782)
05-09 09:25:11.537 1862 2426 E StorageManagerService: at android.os.Handler.dispatchMessage(Handler.java:106)
05-09 09:25:11.537 1862 2426 E StorageManagerService: at android.os.Looper.loop(Looper.java:223)
05-09 09:25:11.537 1862 2426 E StorageManagerService: at android.os.HandlerThread.run(HandlerThread.java:67)
开始以为是selinux的策略问题,后来仔细分析log和调用流程,发现是adb shell cat /proc/filesystems没有exfat这个文件类型,
再定位到我只在\kernel\msm-4.19\arch\arm64\configs\vendor\bengal_defconfig 添加了CONFIG_EXFAT_FS=y,
如果要给user版本使用,还要在\kernel\msm-4.19\arch\arm64\configs\vendor\bengal-perf_defconfig添加这个开关。
最后,正常mount有这样的log:
05-09 12:34:12.011 1786 2858 I StorageManagerService: Mounted volume VolumeInfo{emulated;0}:
05-09 12:34:12.011 1786 2858 I StorageManagerService: type=EMULATED diskId=null partGuid= mountFlags=PRIMARY|VISIBLE
05-09 12:34:12.011 1786 2858 I StorageManagerService: mountUserId=0 state=MOUNTED
05-09 12:34:12.011 1786 2858 I StorageManagerService: fsType=null fsUuid=null fsLabel=null
05-09 12:34:12.011 1786 2858 I StorageManagerService: path=/storage/emulated internalPath=/data/media
05-09 12:34:12.012 1786 2858 I StorageSessionController: Notifying volume state changed for session with id: emulated;0
05-09 12:34:12.028 1786 2056 W BluetoothManagerService: MESSAGE_BIND_PROFILE_SERVICE
05-09 12:34:12.028 1786 2056 W BluetoothManagerService: Calling psc.bindService from MESSAGE_BIND_PROFILE_SERVICE
05-09 12:34:12.036 1786 2858 I StorageManagerService: Mounting volume VolumeInfo{public:179,33}:
05-09 12:34:12.036 1786 2858 I StorageManagerService: type=PUBLIC diskId=disk:179,32 partGuid= mountFlags=VISIBLE mountUserId=0
05-09 12:34:12.036 1786 2858 I StorageManagerService: state=UNMOUNTED
…
05-09 12:34:12.279 603 697 I vold : fsType= sdcardfs
05-09 12:34:12.279 603 697 I vold : Bind mounting /mnt/runtime/full/D4AB-F830 to /mnt/pass_through/0/D4AB-F830
05-09 12:34:12.282 1786 2858 I StorageSessionController: On volume mount VolumeInfo{public:179,33}:
05-09 12:34:12.282 1786 2858 I StorageSessionController: type=PUBLIC diskId=disk:179,32 partGuid= mountFlags=VISIBLE mountUserId=0
05-09 12:34:12.282 1786 2858 I StorageSessionController: state=CHECKING
05-09 12:34:12.282 1786 2858 I StorageSessionController: fsType=exfat fsUuid=D4AB-F830 fsLabel=disk
05-09 12:34:12.282 1786 2858 I StorageSessionController: path=/storage/D4AB-F830 internalPath=/mnt/media_rw/D4AB-F830