收到个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软链接的实现相关推荐

  1. Android 监听SD卡插入与拔出

    Android 监听SD卡插入与拔出 简单记录一下Android 如何监听SD卡插入与拔出,注意事项: 继承广播: public class SdStatusReceiver extends Broa ...

  2. android sd卡挂载广播,Android--检测内置/外置SD卡存储卡,枚举所有挂载点(通过反射实现),监听SD卡广播...

    直接上重点: 1:获取内置SD卡的路径, 但是判断是否有效(是否挂载), 需要用到下面检测挂载点的方法 /** * 获取内置SD卡路径 * * @return */ public String get ...

  3. android监听卡1电话,Android 监听 SIM 卡状态

    判断是否包含 SIM 卡 /** * 判断是否包含SIM卡 * * @return 状态 */ public static boolean hasSimCard(Context context) { ...

  4. android sim卡插拔广播,Android监听SIM卡插拔的方式

    监听SIM卡是否可用 import android.app.Service; import android.content.BroadcastReceiver; import android.cont ...

  5. Android usb读卡器sd卡热插拔心得

    Android usb读卡器sd卡热插拔心得 最近跟usb打了一段时间交道,处理了一些storage方面的项目需求,现在记录一些调试思路,同时分享给一些有缘人,希望能够给予一些灵感. 平台是qnx h ...

  6. 双SIM卡,Android监听SIM卡状态

    最近在搞一个项目,其中有一块关于双SIM卡状态监听,在这一块上没有经验,在网上找了很多例子,但都是只是监听SIM卡改变状态,而我要的是不但要监听SIM状态改变,而且还要知道具体是哪张SIM卡状态改变, ...

  7. android vold初始化及sd卡挂载流程(转载)

    1 总体介绍 在Android 中,当SD卡插入系统之后,系统会自动挂载.Vold 就是负责挂载SD卡的,vold 的全称是volume daemon.实际上是负责完成系统的CDROM,USB 大容量 ...

  8. android 无法显示SD卡目录,Android studio无法在SD卡上创建新目录?

    我使用名为scanlibrary的库来扫描照片,然后将它传递给tess-two来执行OCR过程.问题是,在目录"ScanDemoExample"不被创建因此tessdata文件不会 ...

  9. android 如何监听应用前后台切换

    今天,简单讲讲android如何判断应用切换到后台和应用切换到前台. 这个其实很简单,之前需要做一个功能,当app由后台进入前台时需要完成一些逻辑操作,所以在网上查找如何判断app由后台进入前台,最终 ...

最新文章

  1. 一个技术总监的忠告:精通那么多技术有毛用啊,你还不是不被重用?
  2. 台式电脑cpu排行榜_台式电脑CPU性能天梯图 AMD性能首次反超intel
  3. linux 音频文件播放文件管理,linux dsp 播放音频文件
  4. 串口之GetCommTimeouts、SetCommTimeouts函数详解
  5. python修改xml标签的值_对python修改xml文件的节点值方法详解
  6. 病毒及***防御手册之十二
  7. Android Junit测试
  8. eclipse代码量统计插件_Android Studio 代码行数统计插件Statistic的简单使用
  9. jquery的一些常用方法
  10. 图书管理系统Java代码
  11. CSS练习中|无序列表中,<li>的小黑点如何替换为图片(菜鸡趣味学习,细节到每一步)
  12. VSCode插件---Code Runner
  13. UE学习笔记:源码安装UE
  14. 广东九联UNT402H-3798-mv300-uwe5621wifi-爱家TV新魔百和刷机固件
  15. OpenGL ES教程VI之纹理贴图(原文对照)
  16. 实验五 java gui(预习报告)
  17. matlab中将数据保存为txt文件_matlab中将数据输出保存为txt格式文件的方式
  18. 欧拉筛(线性筛)超级详解 - Python3实现
  19. SpringMVC学习笔记:springMVC中相关细节
  20. 计算机找不到工具怎么办,电脑工具栏声音图标不见了怎么办

热门文章

  1. 87个常用电脑快捷键大全,别让速度限制你的工资,建议收藏一份!
  2. 当电信诈骗犯遇上程序员,技术决定成败!
  3. 华为鸿蒙5g售价,华为5G新旗舰已确认,双曲面屏+升级到鸿蒙2.0,价格很感人
  4. rfid技术及应用答案王佳斌_RFID技术智能仓储管理系统应用优势
  5. 机器学习 | 梯度下降原理及Python实现
  6. 经典工具 | 使用SIFT预测错义突变的有害性
  7. 高通量数据中批次效应的鉴定和处理(二)
  8. 原有磁盘上创建lvm_Linux 系统管理及服务配置实战-第12章 磁盘管理3(连载)
  9. NOI大纲 CSP初赛篇·知识大纲 CSP-入门级-NOI大纲
  10. 【C#桌面应用】第一节:使用C#开发桌面应用的准备