问题描述
做老化测试时,在使用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 volddiff --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;