硬件环境:NanoPC-T3 Plus
代码链接:https://github.com/gk969/android-ntfs
下述修改项从git diff信息修改而来,行首+表示增加行,-表示删除行。
project build/
diff –git a/target/product/core_base.mk b/target/product/core_base.mk
增加ntfs-3g相关工具到构建脚本core_base.mk
PRODUCT_PACKAGES += \ libstagefright_soft_vpxenc \ libvariablespeed \ libwebrtc_audio_preprocessing \ + ntfs-3g \ + ntfsfix \ + mkntfs \ mdnsd \ requestsync \ wifi-service
project device/friendly-arm/nanopi3/
diff –git a/fstab.nanopi3.emmc b/fstab.nanopi3.emmc
修改fstab。放宽设备路径,匹配所有USB端口和通过usb集线器级联拓展的接口。
/devices/platform/dw_mmc.0/mmc_host/mmc2/mmc2 /storage/sdcard1 auto defaults voldmanaged=sdcard1:auto,noemulatedsd -/devices/platform/nxp-ehci/usb1/1-1/1-1:1.0 /storage/usbdisk1 auto defaults voldmanaged=usbdisk1:auto,noemulatedsd -/devices/platform/nxp-ehci/usb1/1-1/1-1.1 /storage/usbdisk1 auto defaults voldmanaged=usbdisk1:auto,noemulatedsd -/devices/platform/nxp-ehci/usb1/1-1/1-1.2 /storage/usbdisk2 auto defaults voldmanaged=usbdisk2:auto,noemulatedsd -/devices/platform/nxp-ehci/usb1/1-1/1-1.3 /storage/usbdisk3 auto defaults voldmanaged=usbdisk3:auto,noemulatedsd -/devices/platform/nxp-ehci/usb1/1-1/1-1.4 /storage/usbdisk4 auto defaults voldmanaged=usbdisk4:auto,noemulatedsd -/devices/platform/dwc_otg/usb2/2-0 /storage/usbdisk5 vfat defaults voldmanaged=usbdisk5:auto,noemulatedsd -/devices/platform/dwc_otg/usb2/2-1 /storage/usbdisk6 vfat defaults voldmanaged=usbdisk6:auto,noemulatedsd +/devices/platform/nxp-ehci/usb1/ /storage/usbdisk1 auto defaults voldmanaged=usbdisk1:auto,noemulatedsd +/devices/platform/nxp-ehci/usb1/ /storage/usbdisk2 auto defaults voldmanaged=usbdisk2:auto,noemulatedsd +/devices/platform/nxp-ehci/usb1/ /storage/usbdisk3 auto defaults voldmanaged=usbdisk3:auto,noemulatedsd +/devices/platform/nxp-ehci/usb1/ /storage/usbdisk4 auto defaults voldmanaged=usbdisk4:auto,noemulatedsd +/devices/platform/nxp-ehci/usb1/ /storage/usbdisk5 auto defaults voldmanaged=usbdisk5:auto,noemulatedsd +/devices/platform/nxp-ehci/usb1/ /storage/usbdisk6 auto defaults voldmanaged=usbdisk6:auto,noemulatedsd
diff –git a/init.nanopi3.rc b/init.nanopi3.rc
修改初始化脚本init.nanopi3.rc。放宽usb移动硬盘访问权限。
# See storage config details at http://source.android.com/tech/storage/ - mkdir /mnt/shell/emulated 0700 shell shell - mkdir /storage/emulated 0555 root root + mkdir /mnt/shell/emulated 0777 shell shell + mkdir /storage/emulated 0555 media_rw media_rw export EXTERNAL_STORAGE /storage/emulated/legacy export EMULATED_STORAGE_SOURCE /mnt/shell/emulated @@ -19,32 +19,32 @@ on init symlink /mnt/shell/emulated/0 /storage/emulated/legacy # external sdcard - mkdir /mnt/media_rw/sdcard1 0700 media_rw media_rw - mkdir /storage/sdcard1 0700 root root + mkdir /mnt/media_rw/sdcard1 0777 media_rw media_rw + mkdir /storage/sdcard1 0777 media_rw media_rw # usb disk1 - mkdir /mnt/media_rw/usbdisk1 0700 media_rw media_rw - mkdir /storage/usbdisk1 0700 root root + mkdir /mnt/media_rw/usbdisk1 0777 media_rw media_rw + mkdir /storage/usbdisk1 0777 media_rw media_rw # usb disk2 - mkdir /mnt/media_rw/usbdisk2 0700 media_rw media_rw - mkdir /storage/usbdisk2 0700 root root + mkdir /mnt/media_rw/usbdisk2 0777 media_rw media_rw + mkdir /storage/usbdisk2 0777 media_rw media_rw # usb disk3 - mkdir /mnt/media_rw/usbdisk3 0700 media_rw media_rw - mkdir /storage/usbdisk3 0700 root root + mkdir /mnt/media_rw/usbdisk3 0777 media_rw media_rw + mkdir /storage/usbdisk3 0777 media_rw media_rw
project frameworks/base/
diff –git a/data/etc/platform.xml b/data/etc/platform.xml
放宽权限组设置
<permission name="android.permission.WRITE_EXTERNAL_STORAGE" > <group gid="sdcard_r" /> <group gid="sdcard_rw" /> + <group gid="media_rw" /> </permission> <permission name="android.permission.ACCESS_ALL_EXTERNAL_STORAGE" > <group gid="sdcard_r" /> <group gid="sdcard_rw" /> <group gid="sdcard_all" /> + <group gid="media_rw" /> </permission>
project system/vold/
diff –git a/Android.mk b/Android.mk
为vold构建脚本增加ntfs模块
common_src_files := \ Process.cpp \ Ext4.cpp \ Fat.cpp \ + Ntfs.cpp \ Loop.cpp \ Devmapper.cpp \ ResponseCode.cpp \ LOCAL_SHARED_LIBRARIES := $(common_shared_libraries) LOCAL_STATIC_LIBRARIES := $(common_static_libraries) LOCAL_MODULE_TAGS := eng tests +LOCAL_CFLAGS += -DHAS_NTFS_3G include $(BUILD_STATIC_LIBRARY) LOCAL_SRC_FILES := \ LOCAL_C_INCLUDES := $(common_c_includes) LOCAL_CFLAGS := -Werror=format +LOCAL_CFLAGS += -DHAS_NTFS_3G ifeq ($(TARGET_BOARD_PLATFORM), slsiap) LOCAL_CFLAGS += -DPATCH_FOR_SLSIAP
fstab每一行对应一个Volume。DirectVolume继承自Volume。DirectVolume::handleBlockEvent(NetlinkEvent *evt)通过fstab中的设备路径匹配Volume及挂载点路径。放宽设备匹配字符串后,不再严格按照设备路径一对一匹配挂载点,实现自适应动态挂载。挂载时根据挂载点是否空闲状态判断是否允许挂载。卸载时根据设备路径找到相应挂载点。
diff –git a/DirectVolume.cpp b/DirectVolume.cpp
int DirectVolume::handleBlockEvent(NetlinkEvent *evt) { const char *dp = evt->findParam("DEVPATH"); - + SLOGD("DirectVolume %s state %s handleBlockEvent devpath %s", getLabel(), getStateStr(), dp); + PathCollection::iterator it; for (it = mPaths->begin(); it != mPaths->end(); ++it) { if ((*it)->match(dp)) { @@ -140,6 +147,16 @@ int DirectVolume::handleBlockEvent(NetlinkEvent *evt) { const char *devtype = evt->findParam("DEVTYPE"); if (action == NetlinkEvent::NlActionAdd) { + int st = getState(); + if(!(st == Volume::State_NoMedia || st == Volume::State_Pending || st == Volume::State_Idle)){ + errno = ENODEV; + return -1; + } + SLOGD("DirectVolume %s NlActionAdd @ %s", getLabel(), dp); + + free(mDevPath); + mDevPath = strdup(dp); + int major = atoi(evt->findParam("MAJOR")); int minor = atoi(evt->findParam("MINOR")); char nodepath[255]; @@ -167,12 +184,22 @@ int DirectVolume::handleBlockEvent(NetlinkEvent *evt) { msg, false); } } else if (action == NetlinkEvent::NlActionRemove) { + if(mDevPath != NULL){ + if(strcmp(dp, mDevPath)){ + errno = ENODEV; + return -1; + } + } + + SLOGD("DirectVolume %s NlActionRemove @ %s", getLabel(), dp); + if (!strcmp(devtype, "disk")) { handleDiskRemoved(dp, evt); } else { handlePartitionRemoved(dp, evt); } } else if (action == NetlinkEvent::NlActionChange) { + SLOGD("DirectVolume %s NlActionChange", getLabel()); if (!strcmp(devtype, "disk")) { handleDiskChanged(dp, evt); } else {