Removed references to IActivityController from AMS (31/n)
IActivityController should only be accessed from the ATMS side since
it relates to activties. This CL makes it so.
Bug: 80414790
Test: Existing tests pass
Change-Id: Ifcbab0499d3f00d83e8a76503e5a6f703792f274
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index 4179cf3..2e930db 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -16544,8 +16544,7 @@
if (curSchedGroup == ProcessList.SCHED_GROUP_TOP_APP) {
// do nothing if we already switched to RT
if (oldSchedGroup != ProcessList.SCHED_GROUP_TOP_APP) {
- mActivityTaskManager.onTopProcChangedLocked(
- app.getWindowProcessController());
+ app.getWindowProcessController().onTopProcChanged();
if (mUseFifoUiScheduling) {
// Switch UI pipeline for app to SCHED_FIFO
app.savedPriority = Process.getThreadPriority(app.pid);
@@ -16577,8 +16576,7 @@
}
} else if (oldSchedGroup == ProcessList.SCHED_GROUP_TOP_APP &&
curSchedGroup != ProcessList.SCHED_GROUP_TOP_APP) {
- mActivityTaskManager.onTopProcChangedLocked(
- app.getWindowProcessController());
+ app.getWindowProcessController().onTopProcChanged();
if (mUseFifoUiScheduling) {
try {
// Reset UI pipeline to SCHED_OTHER
diff --git a/services/core/java/com/android/server/am/ActivityTaskManagerService.java b/services/core/java/com/android/server/am/ActivityTaskManagerService.java
index 02707fb..2dac28c 100644
--- a/services/core/java/com/android/server/am/ActivityTaskManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityTaskManagerService.java
@@ -397,7 +397,7 @@
// VoiceInteractionManagerService
ComponentName mActiveVoiceInteractionServiceComponent;
- private VrController mVrController;
+ VrController mVrController;
KeyguardController mKeyguardController;
private final ClientLifecycleManager mLifecycleManager;
private TaskChangeNotificationController mTaskChangeNotificationController;
@@ -4355,10 +4355,6 @@
mRecentTasks.notifyTaskPersisterLocked(task, flush);
}
- void onTopProcChangedLocked(WindowProcessController proc) {
- mVrController.onTopProcChangedLocked(proc);
- }
-
boolean isKeyguardLocked() {
return mKeyguardController.isKeyguardLocked();
}
@@ -6689,5 +6685,28 @@
mPendingTempWhitelist.remove(uid);
}
}
+
+ @Override
+ public boolean handleAppCrashInActivityController(String processName, int pid,
+ String shortMsg, String longMsg, long timeMillis, String stackTrace,
+ Runnable killCrashingAppCallback) {
+ synchronized (mGlobalLock) {
+ if (mController == null) {
+ return false;
+ }
+
+ try {
+ if (!mController.appCrashed(processName, pid, shortMsg, longMsg, timeMillis,
+ stackTrace)) {
+ killCrashingAppCallback.run();
+ return true;
+ }
+ } catch (RemoteException e) {
+ mController = null;
+ Watchdog.getInstance().setActivityController(null);
+ }
+ return false;
+ }
+ }
}
}
diff --git a/services/core/java/com/android/server/am/AppErrors.java b/services/core/java/com/android/server/am/AppErrors.java
index e8ec057..0b8b74d 100644
--- a/services/core/java/com/android/server/am/AppErrors.java
+++ b/services/core/java/com/android/server/am/AppErrors.java
@@ -526,41 +526,29 @@
String shortMsg, String longMsg,
String stackTrace, long timeMillis,
int callingPid, int callingUid) {
- if (mService.mActivityTaskManager.mController == null) {
- return false;
- }
+ String name = r != null ? r.processName : null;
+ int pid = r != null ? r.pid : callingPid;
+ int uid = r != null ? r.info.uid : callingUid;
- try {
- String name = r != null ? r.processName : null;
- int pid = r != null ? r.pid : callingPid;
- int uid = r != null ? r.info.uid : callingUid;
- if (!mService.mActivityTaskManager.mController.appCrashed(name, pid,
- shortMsg, longMsg, timeMillis, crashInfo.stackTrace)) {
- if ("1".equals(SystemProperties.get(SYSTEM_DEBUGGABLE, "0"))
- && "Native crash".equals(crashInfo.exceptionClassName)) {
- Slog.w(TAG, "Skip killing native crashed app " + name
- + "(" + pid + ") during testing");
- } else {
- Slog.w(TAG, "Force-killing crashed app " + name
- + " at watcher's request");
- if (r != null) {
- if (!makeAppCrashingLocked(r, shortMsg, longMsg, stackTrace, null))
- {
- r.kill("crash", true);
- }
- } else {
- // Huh.
- Process.killProcess(pid);
- ProcessList.killProcessGroup(uid, pid);
+ return mService.mAtmInternal.handleAppCrashInActivityController(
+ name, pid, shortMsg, longMsg, timeMillis, crashInfo.stackTrace, () -> {
+ if ("1".equals(SystemProperties.get(SYSTEM_DEBUGGABLE, "0"))
+ && "Native crash".equals(crashInfo.exceptionClassName)) {
+ Slog.w(TAG, "Skip killing native crashed app " + name
+ + "(" + pid + ") during testing");
+ } else {
+ Slog.w(TAG, "Force-killing crashed app " + name + " at watcher's request");
+ if (r != null) {
+ if (!makeAppCrashingLocked(r, shortMsg, longMsg, stackTrace, null)) {
+ r.kill("crash", true);
}
+ } else {
+ // Huh.
+ Process.killProcess(pid);
+ ProcessList.killProcessGroup(uid, pid);
}
- return true;
}
- } catch (RemoteException e) {
- mService.mActivityTaskManager.mController = null;
- Watchdog.getInstance().setActivityController(null);
- }
- return false;
+ });
}
private boolean makeAppCrashingLocked(ProcessRecord app,
diff --git a/services/core/java/com/android/server/am/ProcessRecord.java b/services/core/java/com/android/server/am/ProcessRecord.java
index fa7a08b..21259f4c 100644
--- a/services/core/java/com/android/server/am/ProcessRecord.java
+++ b/services/core/java/com/android/server/am/ProcessRecord.java
@@ -1244,19 +1244,7 @@
ArrayList<Integer> firstPids = new ArrayList<>(5);
SparseArray<Boolean> lastPids = new SparseArray<>(20);
- if (mService.mActivityTaskManager.mController != null) {
- try {
- // 0 == continue, -1 = kill process immediately
- int res = mService.mActivityTaskManager.mController.appEarlyNotResponding(
- processName, pid, annotation);
- if (res < 0 && pid != MY_PID) {
- kill("anr", true);
- }
- } catch (RemoteException e) {
- mService.mActivityTaskManager.mController = null;
- Watchdog.getInstance().setActivityController(null);
- }
- }
+ mWindowProcessController.appEarlyNotResponding(annotation, () -> kill("anr", true));
long anrTime = SystemClock.uptimeMillis();
if (ActivityManagerService.MONITOR_CPU_USAGE) {
@@ -1412,25 +1400,13 @@
mService.addErrorToDropBox("anr", this, processName, activityShortComponentName,
parentShortComponentName, parentPr, annotation, cpuInfo, tracesFile, null);
- if (mService.mActivityTaskManager.mController != null) {
- try {
- // 0 == show dialog, 1 = keep waiting, -1 = kill process immediately
- int res = mService.mActivityTaskManager.mController.appNotResponding(
- processName, pid, info.toString());
- if (res != 0) {
- if (res < 0 && pid != MY_PID) {
- kill("anr", true);
- } else {
- synchronized (mService) {
- mService.mServices.scheduleServiceTimeoutLocked(this);
- }
+ if (mWindowProcessController.appNotResponding(info.toString(), () -> kill("anr", true),
+ () -> {
+ synchronized (mService) {
+ mService.mServices.scheduleServiceTimeoutLocked(this);
}
- return;
- }
- } catch (RemoteException e) {
- mService.mActivityTaskManager.mController = null;
- Watchdog.getInstance().setActivityController(null);
- }
+ })) {
+ return;
}
synchronized (mService) {
diff --git a/services/core/java/com/android/server/am/WindowProcessController.java b/services/core/java/com/android/server/am/WindowProcessController.java
index 94f1002..7e66d50 100644
--- a/services/core/java/com/android/server/am/WindowProcessController.java
+++ b/services/core/java/com/android/server/am/WindowProcessController.java
@@ -19,6 +19,7 @@
import static android.app.ActivityManager.PROCESS_STATE_NONEXISTENT;
import static android.view.Display.INVALID_DISPLAY;
+import static com.android.server.am.ActivityManagerService.MY_PID;
import static com.android.server.am.ActivityStack.ActivityState.DESTROYED;
import static com.android.server.am.ActivityStack.ActivityState.DESTROYING;
import static com.android.server.am.ActivityStack.ActivityState.PAUSED;
@@ -53,6 +54,7 @@
import com.android.internal.app.HeavyWeightSwitcherActivity;
import com.android.internal.util.function.pooled.PooledLambda;
+import com.android.server.Watchdog;
import com.android.server.wm.ConfigurationContainer;
import com.android.server.wm.ConfigurationContainerListener;
@@ -807,6 +809,57 @@
}
}
+ public void appEarlyNotResponding(String annotation, Runnable killAppCallback) {
+ synchronized (mAtm.mGlobalLock) {
+ if (mAtm.mController == null) {
+ return;
+ }
+
+ try {
+ // 0 == continue, -1 = kill process immediately
+ int res = mAtm.mController.appEarlyNotResponding(mName, mPid, annotation);
+ if (res < 0 && mPid != MY_PID) {
+ killAppCallback.run();
+ }
+ } catch (RemoteException e) {
+ mAtm.mController = null;
+ Watchdog.getInstance().setActivityController(null);
+ }
+ }
+ }
+
+ public boolean appNotResponding(String info, Runnable killAppCallback,
+ Runnable serviceTimeoutCallback) {
+ synchronized (mAtm.mGlobalLock) {
+ if (mAtm.mController == null) {
+ return false;
+ }
+
+ try {
+ // 0 == show dialog, 1 = keep waiting, -1 = kill process immediately
+ int res = mAtm.mController.appNotResponding(mName, mPid, info);
+ if (res != 0) {
+ if (res < 0 && mPid != MY_PID) {
+ killAppCallback.run();
+ } else {
+ serviceTimeoutCallback.run();
+ }
+ return true;
+ }
+ } catch (RemoteException e) {
+ mAtm.mController = null;
+ Watchdog.getInstance().setActivityController(null);
+ }
+ return false;
+ }
+ }
+
+ public void onTopProcChanged() {
+ synchronized (mAtm.mGlobalLock) {
+ mAtm.mVrController.onTopProcChangedLocked(this);
+ }
+ }
+
public void dump(PrintWriter pw, String prefix) {
synchronized (mAtm.mGlobalLock) {
if (mActivities.size() > 0) {
diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java b/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java
index 443d6fe..2e37542 100644
--- a/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java
+++ b/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java
@@ -447,4 +447,9 @@
public abstract void onUidAddedToPendingTempWhitelist(int uid, String tag);
public abstract void onUidRemovedFromPendingTempWhitelist(int uid);
+
+ /** Handle app crash event in {@link android.app.IActivityController} if there is one. */
+ public abstract boolean handleAppCrashInActivityController(String processName, int pid,
+ String shortMsg, String longMsg, long timeMillis, String stackTrace,
+ Runnable killCrashingAppCallback);
}