android P监听SD卡热插拔执行symlink软链接的实现
收到個(gè)android P項(xiàng)目的需求,要求監(jiān)聽SD卡hotplug熱插拔,執(zhí)行symlink軟鏈接和unlink。
先看下運(yùn)行效果:
拔SD卡時(shí)打印:
ja310_evb:/ # logcat |grep pis 08-05 10:08:00.386 2249 2263 W vold : pis get kernel block event!!! 08-05 10:08:00.386 2249 2263 W vold : pis VolumeManager->handleBlockEvent entry=== 08-05 10:08:00.391 2249 2263 W vold : pis get kernel block event!!! 08-05 10:08:00.391 2249 2263 W vold : pis VolumeManager->handleBlockEvent entry=== 08-05 10:08:00.392 2249 2263 W vold : pis VolumeManager->handleBlockEvent remove action=== 08-05 10:08:00.392 2249 2263 W vold : **pis PublicVolume.cpp doUnmount entry**.... 08-05 10:08:00.396 2541 3000 E StorageManagerService: pis StorageManagerService.ajva onVolumeStateChanged... 08-05 10:08:01.222 2541 3000 E StorageManagerService: pis StorageManagerService.ajva onVolumeStateChanged... 08-05 10:08:01.226 2541 3000 E StorageManagerService: pis StorageManagerService.ajva onVolumeStateChanged...再插入SD卡時(shí)打印:
08-05 10:08:49.965 2249 2263 W vold : pis get kernel block event!!! 08-05 10:08:49.965 2249 2263 W vold : pis VolumeManager->handleBlockEvent entry=== 08-05 10:08:49.965 2249 2263 W vold : pis VolumeManager->handleBlockEvent add action=== 08-05 10:08:50.004 2249 2263 W vold : pis get kernel block event!!! 08-05 10:08:50.004 2249 2263 W vold : pis VolumeManager->handleBlockEvent entry=== 08-05 10:08:50.004 2541 3000 E StorageManagerService: pis StorageManagerService.ajva onVolumeStateChanged... 08-05 10:08:50.005 2249 2294 W vold : **pis PublicVolume.cpp doMount entry**.... 08-05 10:08:50.005 2541 3000 E StorageManagerService: pis StorageManagerService.ajva onVolumeStateChanged... 08-05 10:08:50.336 2249 2294 E vold : pis Linking /storage/sdcard0 to /storage/Tfcard start... 08-05 10:08:50.336 2249 2294 E vold : pis Linking /storage/sdcard0 to /storage/Tfcard success 08-05 10:08:50.337 2541 2552 E StorageManagerService: pis StorageManagerService.ajva onVolumeStateChanged...軟鏈接效果:
# ls -l /storage/Tfcard lrwxrwxrwx 1 root reserved_disk 16 2021-08-05 10:08 /storage/Tfcard -> /storage/sdcard0好了,以上這些logcat打印日志,全是手動添加上去的,修改記錄如下:
framework側(cè)的修改
diff --git a/services/core/java/com/android/server/StorageManagerService.java b/services/core/java/com/android/server/StorageManagerService.java index 183be9b..82d3189 100644 --- a/services/core/java/com/android/server/StorageManagerService.java +++ b/services/core/java/com/android/server/StorageManagerService.java @@ -1064,6 +1064,7 @@ class StorageManagerService extends IStorageManager.Stub@Overridepublic void onVolumeStateChanged(String volId, int state) { + Slog.e(TAG, "pis StorageManagerService.ajva onVolumeStateChanged...");synchronized (mLock) {final VolumeInfo vol = mVolumes.get(volId);if (vol != null) {system/vold修改:
system/vold$ git diff . diff --git a/NetlinkHandler.cpp b/NetlinkHandler.cpp index 92131e9..0c9b6ce 100644 --- a/NetlinkHandler.cpp +++ b/NetlinkHandler.cpp @@ -50,6 +50,7 @@ void NetlinkHandler::onEvent(NetlinkEvent *evt) {}if (std::string(subsys) == "block") { + LOG(WARNING) << "pis get kernel block event!!!";vm->handleBlockEvent(evt);}} diff --git a/VolumeManager.cpp b/VolumeManager.cpp index 8c32587..b3aea43 100644 --- a/VolumeManager.cpp +++ b/VolumeManager.cpp @@ -175,6 +175,7 @@ int VolumeManager::stop() {void VolumeManager::handleBlockEvent(NetlinkEvent *evt) {std::lock_guard<std::mutex> lock(mLock); + LOG(WARNING) << "pis VolumeManager->handleBlockEvent entry===";if (mDebug) {LOG(VERBOSE) << "----------------"; @@ -193,6 +194,7 @@ void VolumeManager::handleBlockEvent(NetlinkEvent *evt) {switch (evt->getAction()) {case NetlinkEvent::Action::kAdd: { + LOG(WARNING) << "pis VolumeManager->handleBlockEvent add action===";for (const auto& source : mDiskSources) {if (source->matches(eventPath)) {// For now, assume that MMC and virtio-blk (the latter is @@ -217,11 +219,13 @@ void VolumeManager::handleBlockEvent(NetlinkEvent *evt) {break;}case NetlinkEvent::Action::kChange: { + LOG(WARNING) << "pis VolumeManager->handleBlockEvent changed action===";LOG(DEBUG) << "Disk at " << major << ":" << minor << " changed";handleDiskChanged(device);break;}case NetlinkEvent::Action::kRemove: { + LOG(WARNING) << "pis VolumeManager->handleBlockEvent remove action===";handleDiskRemoved(device);break;} diff --git a/model/PublicVolume.cpp b/model/PublicVolume.cpp index fc7e96f..438a7f6 100644 --- a/model/PublicVolume.cpp +++ b/model/PublicVolume.cpp @@ -94,6 +94,8 @@ status_t PublicVolume::doDestroy() {}status_t PublicVolume::doMount() { + LOG(WARNING) << "pis PublicVolume.cpp doMount entry...."; +readMetadata();if (mFsType == "vfat" && vfat::IsSupported()) { @@ -214,6 +216,14 @@ status_t PublicVolume::doMount() {if (TEMP_FAILURE_RETRY(waitpid(mFusePid, nullptr, WNOHANG)) == mFusePid)mFusePid = 0;+ LOG(ERROR) << "pis Linking /storage/sdcard0 to /storage/Tfcard start..."; + if (TEMP_FAILURE_RETRY(symlink("/storage/sdcard0", "/storage/Tfcard"))) { + PLOG(WARNING) << "pis Failed to link"; + return -errno; + } else { + LOG(ERROR) << "pis Linking /storage/sdcard0 to /storage/Tfcard success"; + } +return OK;}@@ -222,6 +232,7 @@ status_t PublicVolume::doUnmount() {// the FUSE process first, most file system operations will return// ENOTCONN until the unmount completes. This is an exotic and unusual// error code and might cause broken behaviour in applications. + LOG(WARNING) << "pis PublicVolume.cpp doUnmount entry....";KillProcessesUsingPath(getPath());ForceUnmount(kAsecPath); @@ -247,6 +258,10 @@ status_t PublicVolume::doUnmount() {mFuseWrite.clear();mRawPath.clear();+ if (TEMP_FAILURE_RETRY(unlink("/storage/Tfcard"))) { + LOG(ERROR) << "pis unlink /storage/sdcard0 to /storage/Tfcard error"; + } +return OK;}以上是所有的修改,關(guān)于SD卡的插拔思路,CSDN上有很多文章都介紹過了,我這里就不做過多的介紹,主要的思想就是,監(jiān)聽底層上報(bào)的netlinker事件,然后針對Kernel上報(bào)的消息內(nèi)容,和fstab中SD卡的內(nèi)容進(jìn)行比對,找到合適的節(jié)點(diǎn)內(nèi)容。
通過vold來做中間者,上報(bào)消息給framework,因?yàn)閒ramework側(cè)是通過注冊消息,收到SD卡的狀態(tài)變更消息時(shí),就可以告知所有的注冊者,至于其他app或者服務(wù)進(jìn)程收到狀態(tài)變更的廣播,原理也是類似的,注冊相關(guān)消息,storageManagerService收到變更消息,群發(fā)狀態(tài)給所有的注冊者,進(jìn)行函數(shù)回調(diào)。
總結(jié)
以上是生活随笔為你收集整理的android P监听SD卡热插拔执行symlink软链接的实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 交叉线和直连线的线序,做法和使用场合
- 下一篇: INFO:InstallShield I