Android 11.0 支持exFAT文件系统

让Android 11.0 支持exFAT文件系统,主要工作是kernel部分的nofuse移植和userspacefuse移植,其他部分kernelandroid都已实现,这个移植工作参考下面任何一篇文档都可以实现,我就不赘述了。

kernel中移植nofuse代码下载解压后,更名exfat放到kernel/fs下, 修改kernel/fsKconfigMakefile,以及kernelconfig

移植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

 

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值