From a666f83b825d4017751bd2c6d1e81763d53690eb 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 --- .../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 ca16f579609a9..1257f1f4bc104 100644 --- a/services/core/java/com/android/server/am/ProcessList.java +++ b/services/core/java/com/android/server/am/ProcessList.java @@ -2897,6 +2897,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,