日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

android P监听SD卡热插拔执行symlink软链接的实现

發(fā)布時(shí)間:2025/3/15 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android P监听SD卡热插拔执行symlink软链接的实现 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

收到個(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打印日志,全是手動(dòng)添加上去的,修改記錄如下:

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲国产成人av | caopor超碰| 四虎影院在线 | 成人依依网 | 日韩av在线一区二区三区 | 人妻精品无码一区二区三区 | 手机看片1024欧美 | 亚洲欧美日韩精品在线 | 婷婷激情成人 | 欧美变态口味重另类在线视频 | 直接看的av | 最新日韩av | 亚洲欧洲日韩综合 | 亚洲综合久久av一区二区三区 | 成人h动漫精品一区二区 | 永久免费看片在线观看 | 色屁屁| 99在线观看精品视频 | 亚洲图片小说视频 | 99av视频| www.猫咪av.com | 国产成人久久精品麻豆二区 | 我的邻居在线观看 | 亚洲精品一区二三区不卡 | 欧美一区二区三区四区视频 | 免费成人深夜 | 欧美不卡高清 | 日韩影视一区二区三区 | 亚洲资源站 | 欧美黄视频在线观看 | 亚洲熟女乱综合一区二区三区 | 亚洲经典一区二区三区四区 | 天堂8在线天堂资源bt | 福利一二三区 | 天天综合网站 | 少妇超碰| 中文无码精品一区二区三区 | 欧美不卡一区二区 | 黄色成年视频 | 欧美无人区码suv | 色噜噜日韩精品欧美一区二区 | 中文字幕一本 | 色婷婷国产精品综合在线观看 | 亚洲av无码一区二区三区人 | 欧美日韩成人免费 | 自拍偷拍国内 | 国产无遮挡免费 | 波多av | 国产精品美女久久久久av爽 | 九九热av | 中文字幕激情小说 | 99热首页| 天天狠天天插天天透 | 欧美一区二区在线视频观看 | 一区二区三区四区免费 | 亚洲国产一区在线观看 | 欧美三级自拍 | 日本网站黄色 | 狠狠操狠狠插 | 女性裸体下面张开 | 国产中文字幕在线视频 | 美女久久视频 | 中文字幕一区二区在线播放 | 亚洲美女在线视频 | 日韩一级成人 | 涩涩屋视频 | 成人午夜精品福利免费 | 国内自拍偷拍 | 欧美大片高清免费观看 | 欧美巨乳在线 | 在线观看亚洲精品 | 日本韩国视频 | 欧美性生活xxx | 风韵少妇性饥渴推油按摩视频 | 亚洲一区二区三区无码久久 | 国产精品999在线观看 | 九九热精品在线视频 | 亚洲最大福利网 | 国产精品亚洲成在人线 | 亚洲小说专区 | 美女被草视频在线观看 | 久久天天东北熟女毛茸茸 | 激情久久av一区av二区av三区 | 欧美日韩丝袜 | 亚洲成人黄色av | 波多野结衣在线一区 | 国产精品视频一区二区三区在3 | 青青草视频在线看 | 欧美激情国产在线 | 给我看高清的视频在线观看 | 国产crm系统91在线 | 麻豆av导航 | 亚洲 欧美 综合 | 国产极品在线观看 | 亚洲精品乱码久久久久久久久久久久 | 国内精品视频在线播放 | 欧美在线视频精品 | 黄网站色视频免费观看 | 久久久久成人精品无码 |