From 6eff4d8f1b091bceb759a31444c1742e7c7abb88 Mon Sep 17 00:00:00 2001 From: "T.J. Mercier" Date: Fri, 29 Apr 2022 03:20:53 +0000 Subject: [PATCH] Freeze all package processes before killing Apps are able to prevent their death by forking multiple processes under different services and monitoring for the death of any of these. When a child death is detected, the remaining process restarts the terminating/terminated service before it's able to be killed itself. This is now prevented by freezing all processes before killing any of them so that no process can react to the death of another. Bug: 148425913 Test: vsoc_arm64:/ $ monkey -p com.haok.nirvana 1 Test: bash arg: -p Test: bash arg: com.haok.nirvana Test: bash arg: 1 Test: args: [-p, com.haok.nirvana, 1] Test: arg: "-p" Test: arg: "com.haok.nirvana" Test: arg: "1" Test: data="com.haok.nirvana" Test: Events injected: 1 Test: ## Network stats: elapsed time=3200ms (0ms mobile, 0ms wifi, 3200ms not connected) Test: vsoc_arm64:/ $ ps -eo pid,uid,ppid,name|grep 10088 Test: 6827 10088 2973 com.haok.nirvana Test: 6850 10088 2973 com.haok.nirvana:resident Test: 6867 10088 2973 android.media Test: 6895 10088 1 app_d Test: 6899 10088 1 app_d Test: vsoc_arm64:/ $ am force-stop com.haok.nirvana Test: vsoc_arm64:/ $ ps -eo pid,uid,ppid,name |grep 10088 Test: 1|vsoc_arm64:/ $ Test: Also tested manually on Pixel 6 Pro Change-Id: Ib0231eaf4b11b15a3d6bac5dc5486844f0f81d18 Merged-In: Ib0231eaf4b11b15a3d6bac5dc5486844f0f81d18 --- .../core/java/com/android/server/am/ProcessList.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/services/core/java/com/android/server/am/ProcessList.java b/services/core/java/com/android/server/am/ProcessList.java index fc73a59550018..cceacd8c6fa3f 100644 --- a/services/core/java/com/android/server/am/ProcessList.java +++ b/services/core/java/com/android/server/am/ProcessList.java @@ -2792,6 +2792,15 @@ public final class ProcessList { } int N = procs.size(); + for (int i = 0; i < N; ++i) { + final ProcessRecord proc = procs.get(i).first; + try { + Process.setProcessFrozen(proc.getPid(), proc.uid, true); + } catch (Exception e) { + Slog.w(TAG, "Unable to freeze " + proc.getPid() + " " + proc.processName); + } + } + for (int i=0; i proc = procs.get(i); removeProcessLocked(proc.first, callerWillRestart, allowRestart || proc.second,