阅读:6381回复:2
Android设备挂载移动硬盘到一个固定的路径
客户需求:
之前为某个客户做了一个硬盘播放盒,安卓盒子外接移动硬盘,由于安卓系统默认挂载的路径默认是根据移动硬盘生成UUID来挂载的,客户需要挂载到他们指定的一个路径/mnt/sata,方便他们APK访问这个路径。 修改如下: diff --git a/PublicVolume.cpp b/PublicVolume.cppold mode 100644 new mode 100755index 4986f2e..c29b523 --- a/PublicVolume.cpp+++ b/PublicVolume.cpp @@ -36,6 +36,7 @@ #include <sys/types.h> #include <sys/wait.h> + using android::base::StringPrintf; namespace android { @@ -55,6 +56,7 @@ PublicVolume::PublicVolume(dev_t device) : PublicVolume::PublicVolume(const std::string& physicalDevName) : VolumeBase(Type::kPublic), mFusePid(0), mJustPhysicalDev(true) { setId(physicalDevName); + LOG(VERBOSE) << "zzzzzzzzzzzzzzzzzzphysicalDevName==" << physicalDevName; mDevPath = StringPrintf("/dev/block/%s", getId().c_str()); } @@ -63,7 +65,7 @@ PublicVolume::~PublicVolume() { status_t PublicVolume::readMetadata() { status_t res = ReadMetadataUntrusted(mDevPath, mFsType, mFsUuid, mFsLabel); - notifyEvent(ResponseCode::VolumeFsTypeChanged, mFsType);+ notifyEvent(ResponseCode::VolumeFsTypeChanged, mFsLabel); // TODO: find the Uuid of srdisk // If mFsUuid of publicVolume is empty, // it will cause systemUi crash when it is mounted@@ -101,6 +103,7 @@ status_t PublicVolume::initAsecStage() { status_t PublicVolume::doCreate() { if (mJustPhysicalDev) return 0;+ LOG(VERBOSE) << "zzzzzzzzzzzzzzzzzzmDevice==" << mDevice; return CreateDeviceNode(mDevPath, mDevice); } @@ -259,10 +262,49 @@ status_t PublicVolume::doMount() { LOG(VERBOSE) << "Waiting for FUSE to spin up..."; usleep(50000); // 50ms }- + + LOG(VERBOSE) << "zzzzzzzzzzzzzzzzzzmDevPath==" << mDevPath; + LOG(VERBOSE) << "zzzzzzzzzzzzzzzzzzmFsType==" << mFsType;+ LOG(VERBOSE) << "zzzzzzzzzzzzzzzzzzmFsUuid==" << mFsUuid; + LOG(VERBOSE) << "zzzzzzzzzzzzzzzzzzmFsLabel==" << mFsLabel;+ notifyEvent(ResponseCode::VolumeFsTypeChanged, mFsLabel); +// if(access("/sdcard/uuid.txt",0)){+// FILE *fp = NULL; +// fp = fopen("/sdcard/uuid.txt", "w+"); +// fprintf(fp,mFsUuid.c_str()); +// fclose(fp);+// } +// FILE *fp = NULL;+// char buff[255]; +// fp = fopen("/sdcard/uuid.txt", "r");+// fscanf(fp, "%s", buff); +// printf("uuid : %s\n", buff ); +//fclose(fp); +// LOG(VERBOSE) << "zzzzzzzzzzzzzzzzzzuuid==" << buff;+ if(access("/mnt/sata",0)&&mFsType=="ntfs"&&mFsUuid.length()==16){ + LOG(VERBOSE) << "zzzzzzzzzzzzzzzzzzmFsType==" << mFsType;+ LOG(VERBOSE) << "zzzzzzzzzzzzzzzzzzmFsUuid.length()==" << mFsUuid.length(); + linkExternal();+ } + return OK; } +void PublicVolume::linkExternal() { + std::string source(getPath()); + + std::string target("/mnt/sata"); + if (TEMP_FAILURE_RETRY(unlink(target.c_str()))) { + if (errno != ENOENT) { + LOG(VERBOSE) << "Failed to unlink " << target.c_str() << strerror(errno); + } + } + LOG(DEBUG) << "Linking " << source << " to " << target; + if (TEMP_FAILURE_RETRY(symlink(source.c_str(), target.c_str()))) { + LOG(ERROR) << "Failed to link " << source.c_str() << " to " + << target.c_str() << strerror(errno); + } +} status_t PublicVolume::doUnmount() { if (mFusePid > 0) { kill(mFusePid, SIGTERM); diff --git a/PublicVolume.h b/PublicVolume.hold mode 100644 new mode 100755index e7f6bfb..c4186d4 --- a/PublicVolume.h+++ b/PublicVolume.h @@ -48,6 +48,7 @@ protected: status_t doDestroy() override; status_t doMount() override; status_t doUnmount() override; + void linkExternal(); status_t doFormat(const std::string& fsType) override; bool isSrdiskMounted() { return mSrMounted;} 这个方法是将USB口新接入的存储设备的挂载路径链接到一个指定的路径比如:/mnt/sata/ 注意:需要关闭EnableSelinux 即改为宽容模式 方法1 修改UBoot 安卓6.0之后默认EnableSelinux=enforcing 打开的 改为permissive 关闭 方法2(用于调试) echo 0 > /sys/fs/selinux/enforce 也可以在init.rc关闭 |
|
最新喜欢:VastSt...
|
板凳#
发布于:2019-07-08 19:22
|
|
|