[RK3566-Android11] U盘频繁快速插拔识别问题

发布于:2025-08-03 ⋅ 阅读:(13) ⋅ 点赞:(0)

问题描述

做老化测试时,在使用U盘频繁快速插拔的情况下,SDCard目录会突然被Kill掉,然后又重新挂载上,这会导致系统及APP的数据因为读写异常,从而界面卡死正常U盘插拔不应该导致内部存储卸载


解决方案:

SDK根目录/system/vold 打上以下补丁解决

diff --git a/Process.cpp b/Process.cpp
index 277d6a39..62d51a22 100644
--- a/Process.cpp
+++ b/Process.cpp
@@ -39,6 +39,7 @@
 #include <android-base/strings.h>
 
 #include "Process.h"
+#include "Utils.h"
 
 using android::base::StringPrintf;
 
@@ -127,7 +128,7 @@ int KillProcessesWithMounts(const std::string& prefix, int signal) {
     return pids.size();
 }
 
-int KillProcessesWithOpenFiles(const std::string& prefix, int signal) {
+int KillProcessesWithOpenFiles(const std::string& prefix, int signal, bool killFuseDaemon) {
     std::unordered_set<pid_t> pids;
 
     auto proc_d = std::unique_ptr<DIR, int (*)(DIR*)>(opendir("/proc"), closedir);
@@ -164,7 +165,11 @@ int KillProcessesWithOpenFiles(const std::string& prefix, int signal) {
         }
 
         if (found) {
-            pids.insert(pid);
+            if (!IsFuseDaemon(pid) || killFuseDaemon) {
+                pids.insert(pid);
+            } else {
+                LOG(WARNING) << "Found FUSE daemon with open file. Skipping...";
+            }
         }
     }
     if (signal != 0) {
     
diff --git a/Process.h b/Process.h
index 1c59812a..a56b9ceb 100644
--- a/Process.h
+++ b/Process.h
@@ -20,7 +20,7 @@
 namespace android {
 namespace vold {
 
-int KillProcessesWithOpenFiles(const std::string& path, int signal);
+int KillProcessesWithOpenFiles(const std::string& path, int signal, bool killFuseDaemon = true);
 int KillProcessesWithMounts(const std::string& path, int signal);
 
 }  // namespace vold
 
diff --git a/Utils.cpp b/Utils.cpp
index cef0f399..9ff79202 100644
--- a/Utils.cpp
+++ b/Utils.cpp
@@ -525,24 +525,25 @@ status_t KillProcessesWithMountPrefix(const std::string& path) {
 }
 
 status_t KillProcessesUsingPath(const std::string& path) {
-    if (KillProcessesWithOpenFiles(path, SIGINT) == 0) {
+    if (KillProcessesWithOpenFiles(path, SIGINT, false /* killFuseDaemon */) == 0) {
         return OK;
     }
     if (sSleepOnUnmount) sleep(5);
 
-    if (KillProcessesWithOpenFiles(path, SIGTERM) == 0) {
+    if (KillProcessesWithOpenFiles(path, SIGTERM, false /* killFuseDaemon */) == 0) {
         return OK;
     }
     if (sSleepOnUnmount) sleep(5);
 
-    if (KillProcessesWithOpenFiles(path, SIGKILL) == 0) {
+    if (KillProcessesWithOpenFiles(path, SIGKILL, false /* killFuseDaemon */) == 0) {
         return OK;
     }
     if (sSleepOnUnmount) sleep(5);
 
     // Send SIGKILL a second time to determine if we've
     // actually killed everyone with open files
-    if (KillProcessesWithOpenFiles(path, SIGKILL) == 0) {
+    // This time, we also kill the FUSE daemon if found
+    if (KillProcessesWithOpenFiles(path, SIGKILL, true /* killFuseDaemon */) == 0) {
         return OK;
     }
     PLOG(ERROR) << "Failed to kill processes using " << path;

网站公告

今日签到

点亮在社区的每一天
去签到