android P监听SD卡热插拔执行symlink软链接的实现
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                android P监听SD卡热插拔执行symlink软链接的实现
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
                                收到個android P項目的需求,要求監聽SD卡hotplug熱插拔,執行symlink軟鏈接和unlink。
先看下運行效果:
拔SD卡時打印:
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卡時打印:
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側的修改
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;}以上是所有的修改,關于SD卡的插拔思路,CSDN上有很多文章都介紹過了,我這里就不做過多的介紹,主要的思想就是,監聽底層上報的netlinker事件,然后針對Kernel上報的消息內容,和fstab中SD卡的內容進行比對,找到合適的節點內容。
通過vold來做中間者,上報消息給framework,因為framework側是通過注冊消息,收到SD卡的狀態變更消息時,就可以告知所有的注冊者,至于其他app或者服務進程收到狀態變更的廣播,原理也是類似的,注冊相關消息,storageManagerService收到變更消息,群發狀態給所有的注冊者,進行函數回調。
總結
以上是生活随笔為你收集整理的android P监听SD卡热插拔执行symlink软链接的实现的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 交叉线和直连线的线序,做法和使用场合
- 下一篇: INFO:InstallShield I
