問題描述
做老化測試時,在使用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;