Removed AMS.mStackSuperivor (22/n)
The stack supervisor object should only be accessed through ATMS.
Test: Existing test pass
Bug: 80414790
Change-Id: I0648a95161a6a5c4ad714264d217c7f5e55852d7
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index f9e6134..2486787 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -139,8 +139,15 @@
import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_UID_OBSERVERS;
import static com.android.server.am.ActivityManagerDebugConfig.TAG_AM;
import static com.android.server.am.ActivityManagerDebugConfig.TAG_WITH_CLASS_NAME;
-import static com.android.server.am.ActivityStackSupervisor.PRESERVE_WINDOWS;
import static com.android.server.am.MemoryStatUtil.MEMORY_STAT_INTERESTING_NATIVE_PROCESSES;
+import static com.android.server.am.ActivityTaskManagerService.DUMP_ACTIVITIES_CMD;
+import static com.android.server.am.ActivityTaskManagerService.DUMP_ACTIVITIES_SHORT_CMD;
+import static com.android.server.am.ActivityTaskManagerService.DUMP_CONTAINERS_CMD;
+import static com.android.server.am.ActivityTaskManagerService.DUMP_LASTANR_CMD;
+import static com.android.server.am.ActivityTaskManagerService.DUMP_LASTANR_TRACES_CMD;
+import static com.android.server.am.ActivityTaskManagerService.DUMP_RECENTS_CMD;
+import static com.android.server.am.ActivityTaskManagerService.DUMP_RECENTS_SHORT_CMD;
+import static com.android.server.am.ActivityTaskManagerService.DUMP_STARTER_CMD;
import static com.android.server.am.MemoryStatUtil.hasMemcg;
import static com.android.server.am.MemoryStatUtil.readCmdlineFromProcfs;
import static com.android.server.am.MemoryStatUtil.readMemoryStatFromFilesystem;
@@ -439,7 +446,7 @@
static final String SYSTEM_DEBUGGABLE = "ro.debuggable";
- private static final String ANR_TRACE_DIR = "/data/anr";
+ public static final String ANR_TRACE_DIR = "/data/anr";
// Maximum number of receivers an app can register.
private static final int MAX_RECEIVERS_ALLOWED_PER_APP = 1000;
@@ -523,9 +530,6 @@
private Installer mInstaller;
- /** Run all ActivityStacks through this */
- ActivityStackSupervisor mStackSupervisor;
-
final InstrumentationReporter mInstrumentationReporter = new InstrumentationReporter();
final ArrayList<ActiveInstrumentation> mActiveInstrumentation = new ArrayList<>();
@@ -565,12 +569,6 @@
final AppErrors mAppErrors;
/**
- * Dump of the activity state at the time of the last ANR. Cleared after
- * {@link WindowManagerService#LAST_ANR_LIFETIME_DURATION_MSECS}
- */
- String mLastANRState;
-
- /**
* Indicates the maximum time spent waiting for the network rules to get updated.
*/
@VisibleForTesting
@@ -1464,7 +1462,7 @@
* also corresponds to the merged configuration of the default display.
*/
Configuration getGlobalConfiguration() {
- return mStackSupervisor.getConfiguration();
+ return mActivityTaskManager.getGlobalConfiguration();
}
final class KillHandler extends Handler {
@@ -2022,7 +2020,6 @@
synchronized (this) {
mWindowManager = wm;
mActivityTaskManager.setWindowManager(wm);
- mStackSupervisor.setWindowManager(wm);
}
}
@@ -2368,7 +2365,6 @@
mActivityTaskManager.setActivityManagerService(this, mHandlerThread.getLooper(),
mIntentFirewall, mPendingIntentController);
mAtmInternal = LocalServices.getService(ActivityTaskManagerInternal.class);
- mStackSupervisor = mActivityTaskManager.mStackSupervisor;
mProcessCpuThread = new Thread("CpuTracker") {
@Override
@@ -4087,33 +4083,13 @@
clearProfilerLocked();
}
- // Remove this application's activities from active lists.
- boolean hasVisibleActivities = mStackSupervisor.handleAppDiedLocked(app.getWindowProcessController());
-
- app.clearRecentTasks();
- app.clearActivities();
-
- if (app.getActiveInstrumentation() != null) {
+ mAtmInternal.handleAppDied(app.getWindowProcessController(), restarting, () -> {
Slog.w(TAG, "Crash of app " + app.processName
- + " running instrumentation " + app.getActiveInstrumentation().mClass);
+ + " running instrumentation " + app.getActiveInstrumentation().mClass);
Bundle info = new Bundle();
info.putString("shortMsg", "Process crashed.");
finishInstrumentationLocked(app, Activity.RESULT_CANCELED, info);
- }
-
- mWindowManager.deferSurfaceLayout();
- try {
- if (!restarting && hasVisibleActivities
- && !mStackSupervisor.resumeFocusedStacksTopActivitiesLocked()) {
- // If there was nothing to resume, and we are not already restarting this process, but
- // there is a visible activity that is hosted by the process... then make sure all
- // visible activities are running, taking care of restarting this process.
- mStackSupervisor.ensureActivitiesVisibleLocked(null, 0, !PRESERVE_WINDOWS);
- }
- } finally {
- mWindowManager.continueSurfaceLayout();
- }
-
+ });
}
private final int getLRURecordIndexForAppLocked(IApplicationThread thread) {
@@ -4879,48 +4855,7 @@
@Override
public void closeSystemDialogs(String reason) {
- enforceNotIsolatedCaller("closeSystemDialogs");
-
- final int pid = Binder.getCallingPid();
- final int uid = Binder.getCallingUid();
- final long origId = Binder.clearCallingIdentity();
- try {
- synchronized (this) {
- // Only allow this from foreground processes, so that background
- // applications can't abuse it to prevent system UI from being shown.
- if (uid >= FIRST_APPLICATION_UID) {
- ProcessRecord proc;
- synchronized (mPidsSelfLocked) {
- proc = mPidsSelfLocked.get(pid);
- }
- if (proc.curRawAdj > ProcessList.PERCEPTIBLE_APP_ADJ) {
- Slog.w(TAG, "Ignoring closeSystemDialogs " + reason
- + " from background process " + proc);
- return;
- }
- }
- closeSystemDialogsLocked(reason);
- }
- } finally {
- Binder.restoreCallingIdentity(origId);
- }
- }
-
- @GuardedBy("this")
- void closeSystemDialogsLocked(String reason) {
- Intent intent = new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
- intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY
- | Intent.FLAG_RECEIVER_FOREGROUND);
- if (reason != null) {
- intent.putExtra("reason", reason);
- }
- mWindowManager.closeSystemDialogs(reason);
-
- mStackSupervisor.closeSystemDialogsLocked();
-
- broadcastIntentLocked(null, null, intent, null, null, 0, null, null, null,
- OP_NONE, null, false, false,
- -1, SYSTEM_UID, UserHandle.USER_ALL);
+ mAtmInternal.closeSystemDialogs(reason);
}
@Override
@@ -5235,15 +5170,8 @@
return;
}
- // Clean-up disabled activities.
- if (mStackSupervisor.finishDisabledPackageActivitiesLocked(
- packageName, disabledClasses, true, false, userId) && mBooted) {
- mStackSupervisor.resumeFocusedStacksTopActivitiesLocked();
- mStackSupervisor.scheduleIdleLocked();
- }
-
- // Clean-up disabled tasks
- mActivityTaskManager.getRecentTasks().cleanupDisabledPackageTasksLocked(packageName, disabledClasses, userId);
+ mAtmInternal.cleanupDisabledPackageComponents(
+ packageName, disabledClasses, userId, mBooted);
// Clean-up disabled services.
mServices.bringDownDisabledPackageServicesLocked(
@@ -5307,15 +5235,8 @@
ProcessList.INVALID_ADJ, callerWillRestart, true, doit, evenPersistent,
packageName == null ? ("stop user " + userId) : ("stop " + packageName));
- didSomething |= mActivityTaskManager.getActivityStartController().clearPendingActivityLaunches(packageName);
-
- if (mStackSupervisor.finishDisabledPackageActivitiesLocked(
- packageName, null, doit, evenPersistent, userId)) {
- if (!doit) {
- return true;
- }
- didSomething = true;
- }
+ didSomething |=
+ mAtmInternal.onForceStopPackage(packageName, doit, evenPersistent, userId);
if (mServices.bringDownDisabledPackageServicesLocked(
packageName, null, userId, evenPersistent, true, doit)) {
@@ -5365,8 +5286,7 @@
}
}
if (mBooted) {
- mStackSupervisor.resumeFocusedStacksTopActivitiesLocked();
- mStackSupervisor.scheduleIdleLocked();
+ mAtmInternal.resumeTopActivities(true /* scheduleIdle */);
}
}
@@ -5790,7 +5710,7 @@
}
checkTime(startTime, "attachApplicationLocked: immediately before bindApplication");
- mStackSupervisor.getActivityMetricsLogger().notifyBindApplication(app);
+ mAtmInternal.preBindApplication(app.getWindowProcessController());
final ActiveInstrumentation instr2 = app.getActiveInstrumentation();
if (app.isolatedEntryPoint != null) {
// This is an isolated process which should just call an entry point instead of
@@ -5850,9 +5770,7 @@
// See if the top visible activity is waiting to run in this process...
if (normalMode) {
try {
- if (mStackSupervisor.attachApplicationLocked(app)) {
- didSomething = true;
- }
+ didSomething = mAtmInternal.attachApplication(app.getWindowProcessController());
} catch (Exception e) {
Slog.wtf(TAG, "Exception thrown launching activities in " + app, e);
badApp = true;
@@ -8651,51 +8569,12 @@
@Override
public void notifyLockedProfile(@UserIdInt int userId) {
- try {
- if (!AppGlobals.getPackageManager().isUidPrivileged(Binder.getCallingUid())) {
- throw new SecurityException("Only privileged app can call notifyLockedProfile");
- }
- } catch (RemoteException ex) {
- throw new SecurityException("Fail to check is caller a privileged app", ex);
- }
-
- synchronized (this) {
- final long ident = Binder.clearCallingIdentity();
- try {
- if (mUserController.shouldConfirmCredentials(userId)) {
- if (mActivityTaskManager.mKeyguardController.isKeyguardLocked()) {
- // Showing launcher to avoid user entering credential twice.
- final int currentUserId = mUserController.getCurrentUserId();
- mAtmInternal.startHomeActivity(currentUserId, "notifyLockedProfile");
- }
- mStackSupervisor.lockAllProfileTasks(userId);
- }
- } finally {
- Binder.restoreCallingIdentity(ident);
- }
- }
+ mAtmInternal.notifyLockedProfile(userId, mUserController.getCurrentUserId());
}
@Override
public void startConfirmDeviceCredentialIntent(Intent intent, Bundle options) {
- enforceCallingPermission(MANAGE_ACTIVITY_STACKS, "startConfirmDeviceCredentialIntent");
- synchronized (this) {
- final long ident = Binder.clearCallingIdentity();
- try {
- intent.addFlags(FLAG_ACTIVITY_NEW_TASK |
- FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS |
- FLAG_ACTIVITY_TASK_ON_HOME);
- ActivityOptions activityOptions = options != null
- ? new ActivityOptions(options)
- : ActivityOptions.makeBasic();
- activityOptions.setLaunchTaskId(
- mStackSupervisor.getDefaultDisplayHomeActivity().getTask().taskId);
- mContext.startActivityAsUser(intent, activityOptions.toBundle(),
- UserHandle.CURRENT);
- } finally {
- Binder.restoreCallingIdentity(ident);
- }
- }
+ mAtmInternal.startConfirmDeviceCredentialIntent(intent, options);
}
@Override
@@ -9803,7 +9682,7 @@
} finally {
Binder.restoreCallingIdentity(ident);
}
- mStackSupervisor.resumeFocusedStacksTopActivitiesLocked();
+ mAtmInternal.resumeTopActivities(false /* scheduleIdle */);
mUserController.sendUserSwitchBroadcasts(-1, currentUserId);
BinderInternal.nSetBinderProxyCountWatermarks(6000,5500);
@@ -10584,24 +10463,26 @@
if (dumpAll) {
pw.println("-------------------------------------------------------------------------------");
}
- if (mActivityTaskManager.getRecentTasks() != null) {
- mActivityTaskManager.getRecentTasks().dump(pw, dumpAll, dumpPackage);
- }
+ mAtmInternal.dump(
+ DUMP_RECENTS_CMD, fd, pw, args, opti, dumpAll, dumpClient, dumpPackage);
pw.println();
if (dumpAll) {
pw.println("-------------------------------------------------------------------------------");
}
- dumpLastANRLocked(pw);
+ mAtmInternal.dump(
+ DUMP_LASTANR_CMD, fd, pw, args, opti, dumpAll, dumpClient, dumpPackage);
pw.println();
if (dumpAll) {
pw.println("-------------------------------------------------------------------------------");
}
- dumpActivityStarterLocked(pw, dumpPackage);
+ mAtmInternal.dump(
+ DUMP_STARTER_CMD, fd, pw, args, opti, dumpAll, dumpClient, dumpPackage);
pw.println();
if (dumpAll) {
pw.println("-------------------------------------------------------------------------------");
}
- dumpActivityContainersLocked(pw);
+ mAtmInternal.dump(
+ DUMP_CONTAINERS_CMD, fd, pw, args, opti, dumpAll, dumpClient, dumpPackage);
// Activities section is dumped as part of the Critical priority dump. Exclude the
// section if priority is Normal.
if (!dumpNormalPriority) {
@@ -10609,7 +10490,8 @@
if (dumpAll) {
pw.println("-------------------------------------------------------------------------------");
}
- dumpActivitiesLocked(fd, pw, args, opti, dumpAll, dumpClient, dumpPackage);
+ mAtmInternal.dump(
+ DUMP_ACTIVITIES_CMD, fd, pw, args, opti, dumpAll, dumpClient, dumpPackage);
}
if (mAssociations.size() > 0) {
pw.println();
@@ -10698,9 +10580,7 @@
if ("activities".equals(cmd) || "a".equals(cmd)) {
// output proto is ActivityManagerServiceDumpActivitiesProto
- synchronized (this) {
- writeActivitiesToProtoLocked(proto);
- }
+ mAtmInternal.writeActivitiesToProto(proto);
} else if ("broadcasts".equals(cmd) || "b".equals(cmd)) {
// output proto is ActivityManagerServiceDumpBroadcastsProto
synchronized (this) {
@@ -10739,7 +10619,7 @@
// default option, dump everything, output is ActivityManagerServiceProto
synchronized (this) {
long activityToken = proto.start(ActivityManagerServiceProto.ACTIVITIES);
- writeActivitiesToProtoLocked(proto);
+ mAtmInternal.writeActivitiesToProto(proto);
proto.end(activityToken);
long broadcastToken = proto.start(ActivityManagerServiceProto.BROADCASTS);
@@ -10766,32 +10646,12 @@
if (opti < args.length) {
String cmd = args[opti];
opti++;
- if ("activities".equals(cmd) || "a".equals(cmd)) {
- synchronized (this) {
- dumpActivitiesLocked(fd, pw, args, opti, true, dumpClient, dumpPackage);
- }
- } else if ("lastanr".equals(cmd)) {
- synchronized (this) {
- dumpLastANRLocked(pw);
- }
- } else if ("lastanr-traces".equals(cmd)) {
- synchronized (this) {
- dumpLastANRTracesLocked(pw);
- }
- } else if ("starter".equals(cmd)) {
- synchronized (this) {
- dumpActivityStarterLocked(pw, dumpPackage);
- }
- } else if ("containers".equals(cmd)) {
- synchronized (this) {
- dumpActivityContainersLocked(pw);
- }
- } else if ("recents".equals(cmd) || "r".equals(cmd)) {
- synchronized (this) {
- if (mActivityTaskManager.getRecentTasks() != null) {
- mActivityTaskManager.getRecentTasks().dump(pw, true /* dumpAll */, dumpPackage);
- }
- }
+ if (DUMP_ACTIVITIES_CMD.equals(cmd) || DUMP_ACTIVITIES_SHORT_CMD.equals(cmd)
+ || DUMP_LASTANR_CMD.equals(cmd) || DUMP_LASTANR_TRACES_CMD.equals(cmd)
+ || DUMP_STARTER_CMD.equals(cmd) || DUMP_CONTAINERS_CMD.equals(cmd)
+ || DUMP_RECENTS_CMD.equals(cmd) || DUMP_RECENTS_SHORT_CMD.equals(cmd)) {
+ mAtmInternal.dump(
+ cmd, fd, pw, args, opti, true /* dumpAll */, dumpClient, dumpPackage);
} else if ("binder-proxies".equals(cmd)) {
if (opti >= args.length) {
dumpBinderProxies(pw);
@@ -10927,8 +10787,8 @@
LockGuard.dump(fd, pw, args);
} else {
// Dumping a single activity?
- if (!dumpActivity(fd, pw, cmd, args, opti, dumpAll, dumpVisibleStacksOnly,
- dumpFocusedStackOnly)) {
+ if (!mAtmInternal.dumpActivity(fd, pw, cmd, args, opti, dumpAll,
+ dumpVisibleStacksOnly, dumpFocusedStackOnly)) {
ActivityManagerShellCommand shell = new ActivityManagerShellCommand(this, true);
int res = shell.exec(this, null, fd, null, args, null,
new ResultReceiver(null));
@@ -10965,96 +10825,6 @@
Binder.restoreCallingIdentity(origId);
}
- private void writeActivitiesToProtoLocked(ProtoOutputStream proto) {
- // The output proto of "activity --proto activities" is ActivityManagerServiceDumpActivitiesProto
- mStackSupervisor.writeToProto(proto, ActivityManagerServiceDumpActivitiesProto.ACTIVITY_STACK_SUPERVISOR);
- }
-
- private void dumpLastANRLocked(PrintWriter pw) {
- pw.println("ACTIVITY MANAGER LAST ANR (dumpsys activity lastanr)");
- if (mLastANRState == null) {
- pw.println(" <no ANR has occurred since boot>");
- } else {
- pw.println(mLastANRState);
- }
- }
-
- private void dumpLastANRTracesLocked(PrintWriter pw) {
- pw.println("ACTIVITY MANAGER LAST ANR TRACES (dumpsys activity lastanr-traces)");
-
- final File[] files = new File(ANR_TRACE_DIR).listFiles();
- if (ArrayUtils.isEmpty(files)) {
- pw.println(" <no ANR has occurred since boot>");
- return;
- }
- // Find the latest file.
- File latest = null;
- for (File f : files) {
- if ((latest == null) || (latest.lastModified() < f.lastModified())) {
- latest = f;
- }
- }
- pw.print("File: ");
- pw.print(latest.getName());
- pw.println();
- try (BufferedReader in = new BufferedReader(new FileReader(latest))) {
- String line;
- while ((line = in.readLine()) != null) {
- pw.println(line);
- }
- } catch (IOException e) {
- pw.print("Unable to read: ");
- pw.print(e);
- pw.println();
- }
- }
-
- private void dumpActivityContainersLocked(PrintWriter pw) {
- pw.println("ACTIVITY MANAGER STARTER (dumpsys activity containers)");
- mStackSupervisor.dumpChildrenNames(pw, " ");
- pw.println(" ");
- }
-
- private void dumpActivityStarterLocked(PrintWriter pw, String dumpPackage) {
- pw.println("ACTIVITY MANAGER STARTER (dumpsys activity starter)");
- mActivityTaskManager.getActivityStartController().dump(pw, "", dumpPackage);
- }
-
- void dumpActivitiesLocked(FileDescriptor fd, PrintWriter pw, String[] args,
- int opti, boolean dumpAll, boolean dumpClient, String dumpPackage) {
- dumpActivitiesLocked(fd, pw, args, opti, dumpAll, dumpClient, dumpPackage,
- "ACTIVITY MANAGER ACTIVITIES (dumpsys activity activities)");
- }
-
- void dumpActivitiesLocked(FileDescriptor fd, PrintWriter pw, String[] args,
- int opti, boolean dumpAll, boolean dumpClient, String dumpPackage, String header) {
- pw.println(header);
-
- boolean printedAnything = mStackSupervisor.dumpActivitiesLocked(fd, pw, dumpAll, dumpClient,
- dumpPackage);
- boolean needSep = printedAnything;
-
- boolean printed = ActivityStackSupervisor.printThisActivity(pw,
- mStackSupervisor.getTopResumedActivity(), dumpPackage, needSep,
- " ResumedActivity: ");
- if (printed) {
- printedAnything = true;
- needSep = false;
- }
-
- if (dumpPackage == null) {
- if (needSep) {
- pw.println();
- }
- printedAnything = true;
- mStackSupervisor.dump(pw, " ");
- }
-
- if (!printedAnything) {
- pw.println(" (nothing)");
- }
- }
-
void dumpAssociationsLocked(FileDescriptor fd, PrintWriter pw, String[] args,
int opti, boolean dumpAll, boolean dumpClient, String dumpPackage) {
pw.println("ACTIVITY MANAGER ASSOCIATIONS (dumpsys activity associations)");
@@ -11403,37 +11173,10 @@
needSep = false;
mUserController.dump(pw, dumpAll);
}
- if (mActivityTaskManager.mHomeProcess != null && (dumpPackage == null
- || mActivityTaskManager.mHomeProcess.mPkgList.contains(dumpPackage))) {
- if (needSep) {
- pw.println();
- needSep = false;
- }
- pw.println(" mHomeProcess: " + mActivityTaskManager.mHomeProcess);
- }
- if (mActivityTaskManager.mPreviousProcess != null && (dumpPackage == null
- || mActivityTaskManager.mPreviousProcess.mPkgList.contains(dumpPackage))) {
- if (needSep) {
- pw.println();
- needSep = false;
- }
- pw.println(" mPreviousProcess: " + mActivityTaskManager.mPreviousProcess);
- }
- if (dumpAll && (mActivityTaskManager.mPreviousProcess == null || dumpPackage == null
- || mActivityTaskManager.mPreviousProcess.mPkgList.contains(dumpPackage))) {
- StringBuilder sb = new StringBuilder(128);
- sb.append(" mPreviousProcessVisibleTime: ");
- TimeUtils.formatDuration(mActivityTaskManager.mPreviousProcessVisibleTime, sb);
- pw.println(sb);
- }
- if (mActivityTaskManager.mHeavyWeightProcess != null && (dumpPackage == null
- || mActivityTaskManager.mHeavyWeightProcess.mPkgList.contains(dumpPackage))) {
- if (needSep) {
- pw.println();
- needSep = false;
- }
- pw.println(" mHeavyWeightProcess: " + mActivityTaskManager.mHeavyWeightProcess);
- }
+
+ needSep = mAtmInternal.dumpForProcesses(fd, pw, dumpAll, dumpPackage, dumpAppId, needSep,
+ mTestPssMode, mWakefulness);
+
if (dumpAll && mPendingStarts.size() > 0) {
if (needSep) pw.println();
needSep = true;
@@ -11442,32 +11185,7 @@
pw.println(" " + mPendingStarts.keyAt(i) + ": " + mPendingStarts.valueAt(i));
}
}
- if (dumpPackage == null) {
- pw.println(" mGlobalConfiguration: " + getGlobalConfiguration());
- mStackSupervisor.dumpDisplayConfigs(pw, " ");
- }
if (dumpAll) {
- if (dumpPackage == null) {
- pw.println(" mConfigWillChange: "
- + mActivityTaskManager.getTopDisplayFocusedStack().mConfigWillChange);
- }
- if (mActivityTaskManager.mCompatModePackages.getPackages().size() > 0) {
- boolean printed = false;
- for (Map.Entry<String, Integer> entry
- : mActivityTaskManager.mCompatModePackages.getPackages().entrySet()) {
- String pkg = entry.getKey();
- int mode = entry.getValue();
- if (dumpPackage != null && !dumpPackage.equals(pkg)) {
- continue;
- }
- if (!printed) {
- pw.println(" mScreenCompatPackages:");
- printed = true;
- }
- pw.print(" "); pw.print(pkg); pw.print(": ");
- pw.print(mode); pw.println();
- }
- }
final int NI = mUidObservers.getRegisteredCallbackCount();
boolean printed = false;
for (int i=0; i<NI; i++) {
@@ -11524,11 +11242,6 @@
}
}
}
- if (dumpPackage == null) {
- pw.println(" mWakefulness="
- + PowerManagerInternal.wakefulnessToString(mWakefulness));
- mActivityTaskManager.dumpSleepStates(pw, mTestPssMode);
- }
if (mDebugApp != null || mOrigDebugApp != null || mDebugTransient
|| mOrigWaitForDebugger) {
if (dumpPackage == null || dumpPackage.equals(mDebugApp)
@@ -11542,9 +11255,6 @@
+ " mOrigWaitForDebugger=" + mOrigWaitForDebugger);
}
}
- if (mActivityTaskManager.mCurAppTimeTracker != null) {
- mActivityTaskManager.mCurAppTimeTracker.dumpWithHeader(pw, " ", true);
- }
if (mMemWatchProcesses.getMap().size() > 0) {
pw.println(" Mem watch processes:");
final ArrayMap<String, SparseArray<Pair<Long, String>>> procs
@@ -11609,40 +11319,10 @@
pw.println(" mNativeDebuggingApp=" + mNativeDebuggingApp);
}
}
- if (mActivityTaskManager.mAllowAppSwitchUids.size() > 0) {
- boolean printed = false;
- for (int i = 0; i < mActivityTaskManager.mAllowAppSwitchUids.size(); i++) {
- ArrayMap<String, Integer> types = mActivityTaskManager.mAllowAppSwitchUids.valueAt(i);
- for (int j = 0; j < types.size(); j++) {
- if (dumpPackage == null ||
- UserHandle.getAppId(types.valueAt(j).intValue()) == dumpAppId) {
- if (needSep) {
- pw.println();
- needSep = false;
- }
- if (!printed) {
- pw.println(" mAllowAppSwitchUids:");
- printed = true;
- }
- pw.print(" User ");
- pw.print(mActivityTaskManager.mAllowAppSwitchUids.keyAt(i));
- pw.print(": Type ");
- pw.print(types.keyAt(j));
- pw.print(" = ");
- UserHandle.formatUid(pw, types.valueAt(j).intValue());
- pw.println();
- }
- }
- }
- }
if (dumpPackage == null) {
if (mAlwaysFinishActivities) {
pw.println(" mAlwaysFinishActivities=" + mAlwaysFinishActivities);
}
- if (mActivityTaskManager.mController != null) {
- pw.println(" mController=" + mActivityTaskManager.mController
- + " mControllerIsAMonkey=" + mActivityTaskManager.mControllerIsAMonkey);
- }
if (dumpAll) {
pw.println(" Total persistent processes: " + numPers);
pw.println(" mProcessesReady=" + mProcessesReady
@@ -11655,8 +11335,6 @@
pw.print(" mLastPowerCheckUptime=");
TimeUtils.formatDuration(mLastPowerCheckUptime, pw);
pw.println("");
- pw.println(" mGoingToSleep=" + mStackSupervisor.mGoingToSleep);
- pw.println(" mLaunchingActivity=" + mStackSupervisor.mLaunchingActivity);
pw.println(" mAdjSeq=" + mAdjSeq + " mLruSeq=" + mLruSeq);
pw.println(" mNumNonCachedProcs=" + mNumNonCachedProcs
+ " (" + mLruProcesses.size() + " total)"
@@ -11818,39 +11496,10 @@
writeProcessesToGcToProto(proto, ActivityManagerServiceDumpProcessesProto.GC_PROCS, dumpPackage);
mAppErrors.writeToProto(proto, ActivityManagerServiceDumpProcessesProto.APP_ERRORS, dumpPackage);
+ mAtmInternal.writeProcessesToProto(proto, dumpPackage);
if (dumpPackage == null) {
mUserController.writeToProto(proto, ActivityManagerServiceDumpProcessesProto.USER_CONTROLLER);
- getGlobalConfiguration().writeToProto(proto, ActivityManagerServiceDumpProcessesProto.GLOBAL_CONFIGURATION);
- proto.write(ActivityManagerServiceDumpProcessesProto.CONFIG_WILL_CHANGE, mActivityTaskManager.getTopDisplayFocusedStack().mConfigWillChange);
- }
-
- if (mActivityTaskManager.mHomeProcess != null && (dumpPackage == null
- || mActivityTaskManager.mHomeProcess.mPkgList.contains(dumpPackage))) {
- ((ProcessRecord) mActivityTaskManager.mHomeProcess.mOwner).writeToProto(proto, ActivityManagerServiceDumpProcessesProto.HOME_PROC);
- }
-
- if (mActivityTaskManager.mPreviousProcess != null && (dumpPackage == null
- || mActivityTaskManager.mPreviousProcess.mPkgList.contains(dumpPackage))) {
- ((ProcessRecord) mActivityTaskManager.mPreviousProcess.mOwner).writeToProto(proto, ActivityManagerServiceDumpProcessesProto.PREVIOUS_PROC);
- proto.write(ActivityManagerServiceDumpProcessesProto.PREVIOUS_PROC_VISIBLE_TIME_MS, mActivityTaskManager.mPreviousProcessVisibleTime);
- }
-
- if (mActivityTaskManager.mHeavyWeightProcess != null && (dumpPackage == null
- || mActivityTaskManager.mHeavyWeightProcess.mPkgList.contains(dumpPackage))) {
- ((ProcessRecord) mActivityTaskManager.mHeavyWeightProcess.mOwner).writeToProto(proto, ActivityManagerServiceDumpProcessesProto.HEAVY_WEIGHT_PROC);
- }
-
- for (Map.Entry<String, Integer> entry
- : mActivityTaskManager.mCompatModePackages.getPackages().entrySet()) {
- String pkg = entry.getKey();
- int mode = entry.getValue();
- if (dumpPackage == null || dumpPackage.equals(pkg)) {
- long compatToken = proto.start(ActivityManagerServiceDumpProcessesProto.SCREEN_COMPAT_PACKAGES);
- proto.write(ActivityManagerServiceDumpProcessesProto.ScreenCompatPackage.PACKAGE, pkg);
- proto.write(ActivityManagerServiceDumpProcessesProto.ScreenCompatPackage.MODE, mode);
- proto.end(compatToken);
- }
}
final int NI = mUidObservers.getRegisteredCallbackCount();
@@ -11883,8 +11532,6 @@
PowerManagerInternal.wakefulnessToProtoEnum(mWakefulness));
proto.write(ActivityManagerServiceDumpProcessesProto.SleepStatus.TEST_PSS_MODE, mTestPssMode);
proto.end(sleepToken);
-
- mActivityTaskManager.writeSleepStateToProto(proto);
}
if (mDebugApp != null || mOrigDebugApp != null || mDebugTransient
@@ -11900,11 +11547,6 @@
}
}
- if (mActivityTaskManager.mCurAppTimeTracker != null) {
- mActivityTaskManager.mCurAppTimeTracker.writeToProto(
- proto, ActivityManagerServiceDumpProcessesProto.CURRENT_TRACKER, true);
- }
-
if (mMemWatchProcesses.getMap().size() > 0) {
final long token = proto.start(ActivityManagerServiceDumpProcessesProto.MEM_WATCH_PROCESSES);
ArrayMap<String, SparseArray<Pair<Long, String>>> procs = mMemWatchProcesses.getMap();
@@ -11961,12 +11603,6 @@
if (dumpPackage == null) {
proto.write(ActivityManagerServiceDumpProcessesProto.ALWAYS_FINISH_ACTIVITIES, mAlwaysFinishActivities);
- if (mActivityTaskManager.mController != null) {
- final long token = proto.start(ActivityManagerServiceDumpProcessesProto.CONTROLLER);
- proto.write(ActivityManagerServiceDumpProcessesProto.Controller.CONTROLLER, mActivityTaskManager.mController.toString());
- proto.write(ActivityManagerServiceDumpProcessesProto.Controller.IS_A_MONKEY, mActivityTaskManager.mControllerIsAMonkey);
- proto.end(token);
- }
proto.write(ActivityManagerServiceDumpProcessesProto.TOTAL_PERSISTENT_PROCS, numPers);
proto.write(ActivityManagerServiceDumpProcessesProto.PROCESSES_READY, mProcessesReady);
proto.write(ActivityManagerServiceDumpProcessesProto.SYSTEM_READY, mSystemReady);
@@ -11976,8 +11612,6 @@
proto.write(ActivityManagerServiceDumpProcessesProto.CALL_FINISH_BOOTING, mCallFinishBooting);
proto.write(ActivityManagerServiceDumpProcessesProto.BOOT_ANIMATION_COMPLETE, mBootAnimationComplete);
proto.write(ActivityManagerServiceDumpProcessesProto.LAST_POWER_CHECK_UPTIME_MS, mLastPowerCheckUptime);
- mStackSupervisor.mGoingToSleep.writeToProto(proto, ActivityManagerServiceDumpProcessesProto.GOING_TO_SLEEP);
- mStackSupervisor.mLaunchingActivity.writeToProto(proto, ActivityManagerServiceDumpProcessesProto.LAUNCHING_ACTIVITY);
proto.write(ActivityManagerServiceDumpProcessesProto.ADJ_SEQ, mAdjSeq);
proto.write(ActivityManagerServiceDumpProcessesProto.LRU_SEQ, mLruSeq);
proto.write(ActivityManagerServiceDumpProcessesProto.NUM_NON_CACHED_PROCS, mNumNonCachedProcs);
@@ -12204,95 +11838,6 @@
}
}
- /**
- * There are three things that cmd can be:
- * - a flattened component name that matches an existing activity
- * - the cmd arg isn't the flattened component name of an existing activity:
- * dump all activity whose component contains the cmd as a substring
- * - A hex number of the ActivityRecord object instance.
- *
- * @param dumpVisibleStacksOnly dump activity with {@param name} only if in a visible stack
- * @param dumpFocusedStackOnly dump activity with {@param name} only if in the focused stack
- */
- protected boolean dumpActivity(FileDescriptor fd, PrintWriter pw, String name, String[] args,
- int opti, boolean dumpAll, boolean dumpVisibleStacksOnly, boolean dumpFocusedStackOnly) {
- ArrayList<ActivityRecord> activities;
-
- synchronized (this) {
- activities = mStackSupervisor.getDumpActivitiesLocked(name, dumpVisibleStacksOnly,
- dumpFocusedStackOnly);
- }
-
- if (activities.size() <= 0) {
- return false;
- }
-
- String[] newArgs = new String[args.length - opti];
- System.arraycopy(args, opti, newArgs, 0, args.length - opti);
-
- TaskRecord lastTask = null;
- boolean needSep = false;
- for (int i=activities.size()-1; i>=0; i--) {
- ActivityRecord r = activities.get(i);
- if (needSep) {
- pw.println();
- }
- needSep = true;
- synchronized (this) {
- final TaskRecord task = r.getTask();
- if (lastTask != task) {
- lastTask = task;
- pw.print("TASK "); pw.print(lastTask.affinity);
- pw.print(" id="); pw.print(lastTask.taskId);
- pw.print(" userId="); pw.println(lastTask.userId);
- if (dumpAll) {
- lastTask.dump(pw, " ");
- }
- }
- }
- dumpActivity(" ", fd, pw, activities.get(i), newArgs, dumpAll);
- }
- return true;
- }
-
- /**
- * Invokes IApplicationThread.dumpActivity() on the thread of the specified activity if
- * there is a thread associated with the activity.
- */
- private void dumpActivity(String prefix, FileDescriptor fd, PrintWriter pw,
- final ActivityRecord r, String[] args, boolean dumpAll) {
- String innerPrefix = prefix + " ";
- synchronized (this) {
- pw.print(prefix); pw.print("ACTIVITY "); pw.print(r.shortComponentName);
- pw.print(" "); pw.print(Integer.toHexString(System.identityHashCode(r)));
- pw.print(" pid=");
- if (r.hasProcess()) pw.println(r.app.getPid());
- else pw.println("(not running)");
- if (dumpAll) {
- r.dump(pw, innerPrefix);
- }
- }
- if (r.attachedToProcess()) {
- // flush anything that is already in the PrintWriter since the thread is going
- // to write to the file descriptor directly
- pw.flush();
- try {
- TransferPipe tp = new TransferPipe();
- try {
- r.app.getThread().dumpActivity(tp.getWriteFd(),
- r.appToken, innerPrefix, args);
- tp.go(fd);
- } finally {
- tp.kill();
- }
- } catch (IOException e) {
- pw.println(innerPrefix + "Failure while dumping the activity: " + e);
- } catch (RemoteException e) {
- pw.println(innerPrefix + "Got a RemoteException while dumping the activity");
- }
- }
- }
-
void writeBroadcastsToProtoLocked(ProtoOutputStream proto) {
if (mRegisteredReceivers.size() > 0) {
Iterator it = mRegisteredReceivers.values().iterator();
@@ -12644,7 +12189,7 @@
if (inclDetails) {
long detailToken = proto.start(ProcessOomProto.DETAIL);
proto.write(ProcessOomProto.Detail.MAX_ADJ, r.maxAdj);
- proto.write(ProcessOomProto.Detail.CUR_RAW_ADJ, r.curRawAdj);
+ proto.write(ProcessOomProto.Detail.CUR_RAW_ADJ, r.getCurRawAdj());
proto.write(ProcessOomProto.Detail.SET_RAW_ADJ, r.setRawAdj);
proto.write(ProcessOomProto.Detail.CUR_ADJ, r.curAdj);
proto.write(ProcessOomProto.Detail.SET_ADJ, r.setAdj);
@@ -12770,7 +12315,7 @@
pw.print(prefix);
pw.print(" ");
pw.print("oom: max="); pw.print(r.maxAdj);
- pw.print(" curRaw="); pw.print(r.curRawAdj);
+ pw.print(" curRaw="); pw.print(r.getCurRawAdj());
pw.print(" setRaw="); pw.print(r.setRawAdj);
pw.print(" cur="); pw.print(r.curAdj);
pw.print(" set="); pw.println(r.setAdj);
@@ -14432,7 +13977,7 @@
mServices.newServiceDumperLocked(null, catPw, emptyArgs, 0,
false, null).dumpLocked();
catPw.println();
- dumpActivitiesLocked(null, catPw, emptyArgs, 0, false, false, null);
+ mAtmInternal.dump(DUMP_ACTIVITIES_CMD, null, catPw, emptyArgs, 0, false, false, null);
catPw.flush();
}
dropBuilder.append(catSw.toString());
@@ -15895,7 +15440,7 @@
+ " ssp=" + ssp + " data=" + data);
return ActivityManager.BROADCAST_SUCCESS;
}
- mStackSupervisor.updateActivityApplicationInfoLocked(aInfo);
+ mAtmInternal.onPackageReplaced(aInfo);
mServices.updateServiceApplicationInfoLocked(aInfo);
sendPackageBroadcastLocked(ApplicationThreadConstants.PACKAGE_REPLACED,
new String[] {ssp}, userId);
@@ -17014,7 +16559,8 @@
app.adjSeq = mAdjSeq;
app.setCurrentSchedulingGroup(ProcessList.SCHED_GROUP_BACKGROUND);
app.setCurProcState(ActivityManager.PROCESS_STATE_CACHED_EMPTY);
- app.curAdj=app.curRawAdj=ProcessList.CACHED_APP_MAX_ADJ;
+ app.curAdj = ProcessList.CACHED_APP_MAX_ADJ;
+ app.setCurRawAdj(ProcessList.CACHED_APP_MAX_ADJ);
app.completedAdjSeq = app.adjSeq;
return false;
}
@@ -17040,7 +16586,7 @@
}
app.adjType = "fixed";
app.adjSeq = mAdjSeq;
- app.curRawAdj = app.maxAdj;
+ app.setCurRawAdj(app.maxAdj);
app.setHasForegroundActivities(false);
app.setCurrentSchedulingGroup(ProcessList.SCHED_GROUP_DEFAULT);
app.setCurProcState(ActivityManager.PROCESS_STATE_PERSISTENT);
@@ -17317,7 +16863,7 @@
// there are applications dependent on our services or providers, but
// this gives us a baseline and makes sure we don't get into an
// infinite recursion.
- app.curRawAdj = adj;
+ app.setCurRawAdj(adj);
app.hasStartedServices = false;
app.adjSeq = mAdjSeq;
@@ -17432,7 +16978,7 @@
continue;
}
}
- int clientAdj = client.curRawAdj;
+ int clientAdj = client.getCurRawAdj();
int clientProcState = client.getCurProcState();
if (clientProcState >= PROCESS_STATE_CACHED_ACTIVITY) {
// If the other app is cached for any reason, for purposes here
@@ -17674,7 +17220,7 @@
continue;
}
}
- int clientAdj = client.curRawAdj;
+ int clientAdj = client.getCurRawAdj();
int clientProcState = client.getCurProcState();
if (clientProcState >= PROCESS_STATE_CACHED_ACTIVITY) {
// If the other app is cached for any reason, for purposes here
@@ -17876,7 +17422,7 @@
}
}
- app.curRawAdj = adj;
+ app.setCurRawAdj(adj);
//Slog.i(TAG, "OOM ADJ " + app + ": pid=" + app.pid +
// " adj=" + adj + " curAdj=" + app.curAdj + " maxAdj=" + app.maxAdj);
@@ -18119,8 +17665,7 @@
processingBroadcasts = true;
}
}
- return !processingBroadcasts
- && (mAtmInternal.isSleeping() || mStackSupervisor.allResumedActivitiesIdle());
+ return !processingBroadcasts && mAtmInternal.canGcNow();
}
/**
@@ -18135,7 +17680,7 @@
if (canGcNowLocked()) {
while (mProcessesToGc.size() > 0) {
ProcessRecord proc = mProcessesToGc.remove(0);
- if (proc.curRawAdj > ProcessList.PERCEPTIBLE_APP_ADJ || proc.reportLowMemory) {
+ if (proc.getCurRawAdj() > ProcessList.PERCEPTIBLE_APP_ADJ || proc.reportLowMemory) {
if ((proc.lastRequestedGc+mConstants.GC_MIN_INTERVAL)
<= SystemClock.uptimeMillis()) {
// To avoid spamming the system, we will GC processes one
@@ -18300,8 +17845,8 @@
long nowElapsed) {
boolean success = true;
- if (app.curRawAdj != app.setRawAdj) {
- app.setRawAdj = app.curRawAdj;
+ if (app.getCurRawAdj() != app.setRawAdj) {
+ app.setRawAdj = app.getCurRawAdj();
}
int changes = 0;
@@ -18788,13 +18333,14 @@
// TODO(b/111541062): This method is only used for updating OOM adjustments. We need to update
// the logic there and in mBatteryStatsService to make them aware of multiple resumed activities
- private ActivityRecord resumedAppLocked() {
- final ActivityRecord act = mStackSupervisor.getTopResumedActivity();
+ private ProcessRecord getTopAppLocked() {
+ final WindowProcessController wpc = mAtmInternal != null ? mAtmInternal.getTopApp() : null;
+ final ProcessRecord r = wpc != null ? (ProcessRecord) wpc.mOwner : null;
String pkg;
int uid;
- if (act != null) {
- pkg = act.packageName;
- uid = act.info.applicationInfo.uid;
+ if (r != null) {
+ pkg = r.processName;
+ uid = r.info.uid;
} else {
pkg = null;
uid = -1;
@@ -18820,7 +18366,7 @@
}
}
- return act;
+ return r;
}
/**
@@ -18832,9 +18378,7 @@
*/
@GuardedBy("this")
final boolean updateOomAdjLocked(ProcessRecord app, boolean oomAdjAll) {
- final ActivityRecord TOP_ACT = resumedAppLocked();
- final ProcessRecord TOP_APP = TOP_ACT != null && TOP_ACT.hasProcess()
- ? (ProcessRecord) TOP_ACT.app.mOwner : null;
+ final ProcessRecord TOP_APP = getTopAppLocked();
final boolean wasCached = app.cached;
mAdjSeq++;
@@ -18843,12 +18387,12 @@
// If our app is currently cached, we know it, and that is it. Otherwise,
// we don't know it yet, and it needs to now be cached we will then
// need to do a complete oom adj.
- final int cachedAdj = app.curRawAdj >= ProcessList.CACHED_APP_MIN_ADJ
- ? app.curRawAdj : ProcessList.UNKNOWN_ADJ;
+ final int cachedAdj = app.getCurRawAdj() >= ProcessList.CACHED_APP_MIN_ADJ
+ ? app.getCurRawAdj() : ProcessList.UNKNOWN_ADJ;
boolean success = updateOomAdjLocked(app, cachedAdj, TOP_APP, false,
SystemClock.uptimeMillis());
if (oomAdjAll
- && (wasCached != app.cached || app.curRawAdj == ProcessList.UNKNOWN_ADJ)) {
+ && (wasCached != app.cached || app.getCurRawAdj() == ProcessList.UNKNOWN_ADJ)) {
// Changed to/from cached state, so apps after it in the LRU
// list may also be changed.
updateOomAdjLocked();
@@ -18857,16 +18401,6 @@
}
@GuardedBy("this")
- ProcessRecord getTopAppLocked() {
- final ActivityRecord TOP_ACT = resumedAppLocked();
- if (TOP_ACT != null && TOP_ACT.hasProcess()) {
- return (ProcessRecord) TOP_ACT.app.mOwner;
- } else {
- return null;
- }
- }
-
- @GuardedBy("this")
final void updateOomAdjLocked() {
mOomAdjProfiler.oomAdjStarted();
final ProcessRecord TOP_APP = getTopAppLocked();
@@ -18883,8 +18417,8 @@
uidRec.reset();
}
- if (mStackSupervisor != null) {
- mStackSupervisor.rankTaskLayersIfNeeded();
+ if (mAtmInternal != null) {
+ mAtmInternal.rankTaskLayersIfNeeded();
}
mAdjSeq++;
@@ -18956,7 +18490,7 @@
// This process is a cached process holding activities...
// assign it the next cached value for that type, and then
// step that cached level.
- app.curRawAdj = curCachedAdj;
+ app.setCurRawAdj(curCachedAdj);
app.curAdj = app.modifyRawOomAdj(curCachedAdj);
if (DEBUG_LRU && false) Slog.d(TAG_LRU, "Assigning activity LRU #" + i
+ " adj: " + app.curAdj + " (curCachedAdj=" + curCachedAdj
@@ -18979,7 +18513,7 @@
// long-running services that have dropped down to the
// cached level will be treated as empty (since their process
// state is still as a service), which is what we want.
- app.curRawAdj = curEmptyAdj;
+ app.setCurRawAdj(curEmptyAdj);
app.curAdj = app.modifyRawOomAdj(curEmptyAdj);
if (DEBUG_LRU && false) Slog.d(TAG_LRU, "Assigning empty LRU #" + i
+ " adj: " + app.curAdj + " (curEmptyAdj=" + curEmptyAdj
@@ -19270,7 +18804,7 @@
if (mAlwaysFinishActivities) {
// Need to do this on its own message because the stack may not
// be in a consistent state at this point.
- mStackSupervisor.scheduleDestroyAllActivities(null, "always-finish");
+ mAtmInternal.scheduleDestroyAllActivities("always-finish");
}
if (allChanged) {
@@ -20408,36 +19942,6 @@
}
@Override
- public void saveANRState(String reason) {
- synchronized (ActivityManagerService.this) {
- final StringWriter sw = new StringWriter();
- final PrintWriter pw = new FastPrintWriter(sw, false, 1024);
- pw.println(" ANR time: " + DateFormat.getDateTimeInstance().format(new Date()));
- if (reason != null) {
- pw.println(" Reason: " + reason);
- }
- pw.println();
- mActivityTaskManager.getActivityStartController().dump(pw, " ", null);
- pw.println();
- pw.println("-------------------------------------------------------------------------------");
- dumpActivitiesLocked(null /* fd */, pw, null /* args */, 0 /* opti */,
- true /* dumpAll */, false /* dumpClient */, null /* dumpPackage */,
- "" /* header */);
- pw.println();
- pw.close();
-
- mLastANRState = sw.toString();
- }
- }
-
- @Override
- public void clearSavedANRState() {
- synchronized (ActivityManagerService.this) {
- mLastANRState = null;
- }
- }
-
- @Override
public boolean isRuntimeRestarted() {
return mSystemServiceManager.isRuntimeRestarted();
}
@@ -20552,10 +20056,6 @@
ActivityManagerService.this.trimApplications();
}
- public void closeSystemDialogs(String reason) {
- ActivityManagerService.this.closeSystemDialogs(reason);
- }
-
public void killProcessesForRemovedTask(ArrayList<Object> procsToKill) {
synchronized (ActivityManagerService.this) {
for (int i = 0; i < procsToKill.size(); i++) {
diff --git a/services/core/java/com/android/server/am/ActivityMetricsLogger.java b/services/core/java/com/android/server/am/ActivityMetricsLogger.java
index 3578ed0..a0dd878 100644
--- a/services/core/java/com/android/server/am/ActivityMetricsLogger.java
+++ b/services/core/java/com/android/server/am/ActivityMetricsLogger.java
@@ -507,14 +507,14 @@
/**
* Notifies the tracker that we called immediately before we call bindApplication on the client.
*
- * @param app The client into which we'll call bindApplication.
+ * @param appInfo The client into which we'll call bindApplication.
*/
- void notifyBindApplication(ProcessRecord app) {
+ void notifyBindApplication(ApplicationInfo appInfo) {
for (int i = mWindowingModeTransitionInfo.size() - 1; i >= 0; i--) {
final WindowingModeTransitionInfo info = mWindowingModeTransitionInfo.valueAt(i);
// App isn't attached to record yet, so match with info.
- if (info.launchedActivity.appInfo == app.info) {
+ if (info.launchedActivity.appInfo == appInfo) {
info.bindApplicationDelayMs = calculateCurrentDelay();
}
}
diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
index 6470759..c455704 100644
--- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java
+++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
@@ -994,8 +994,8 @@
return candidateTaskId;
}
- boolean attachApplicationLocked(ProcessRecord app) throws RemoteException {
- final String processName = app.processName;
+ boolean attachApplicationLocked(WindowProcessController app) throws RemoteException {
+ final String processName = app.mName;
boolean didSomething = false;
for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
final ActivityDisplay display = mActivityDisplays.get(displayNdx);
@@ -1009,10 +1009,10 @@
final int size = mTmpActivityList.size();
for (int i = 0; i < size; i++) {
final ActivityRecord activity = mTmpActivityList.get(i);
- if (activity.app == null && app.uid == activity.info.applicationInfo.uid
+ if (activity.app == null && app.mUid == activity.info.applicationInfo.uid
&& processName.equals(activity.processName)) {
try {
- if (realStartActivityLocked(activity, app,
+ if (realStartActivityLocked(activity, (ProcessRecord) app.mOwner,
top == activity /* andResume */, true /* checkConfig */)) {
didSomething = true;
}
diff --git a/services/core/java/com/android/server/am/ActivityTaskManagerService.java b/services/core/java/com/android/server/am/ActivityTaskManagerService.java
index 6398680..b7bbfe8 100644
--- a/services/core/java/com/android/server/am/ActivityTaskManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityTaskManagerService.java
@@ -38,7 +38,9 @@
import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_PRIMARY;
import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_SECONDARY;
import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED;
+import static android.content.Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS;
import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
+import static android.content.Intent.FLAG_ACTIVITY_TASK_ON_HOME;
import static android.content.pm.ApplicationInfo.FLAG_FACTORY_TEST;
import static android.content.pm.ConfigurationInfo.GL_ES_VERSION_UNDEFINED;
import static android.content.pm.PackageManager.FEATURE_ACTIVITIES_ON_SECONDARY_DISPLAYS;
@@ -51,6 +53,7 @@
import static android.os.FactoryTest.FACTORY_TEST_HIGH_LEVEL;
import static android.os.FactoryTest.FACTORY_TEST_LOW_LEVEL;
import static android.os.FactoryTest.FACTORY_TEST_OFF;
+import static android.os.Process.FIRST_APPLICATION_UID;
import static android.os.Process.SYSTEM_UID;
import static android.os.Trace.TRACE_TAG_ACTIVITY_MANAGER;
import static android.provider.Settings.Global.ALWAYS_FINISH_ACTIVITIES;
@@ -68,7 +71,22 @@
import static android.view.WindowManager.TRANSIT_TASK_OPEN;
import static android.view.WindowManager.TRANSIT_TASK_TO_FRONT;
+import static com.android.server.am.ActivityManagerServiceDumpProcessesProto.CONFIG_WILL_CHANGE;
+import static com.android.server.am.ActivityManagerServiceDumpProcessesProto.CONTROLLER;
+import static com.android.server.am.ActivityManagerServiceDumpProcessesProto.CURRENT_TRACKER;
+import static com.android.server.am.ActivityManagerServiceDumpProcessesProto.Controller.IS_A_MONKEY;
+import static com.android.server.am.ActivityManagerServiceDumpProcessesProto.GLOBAL_CONFIGURATION;
+import static com.android.server.am.ActivityManagerServiceDumpProcessesProto.GOING_TO_SLEEP;
+import static com.android.server.am.ActivityManagerServiceDumpProcessesProto.HEAVY_WEIGHT_PROC;
+import static com.android.server.am.ActivityManagerServiceDumpProcessesProto.HOME_PROC;
+import static com.android.server.am.ActivityManagerServiceDumpProcessesProto.LAUNCHING_ACTIVITY;
+import static com.android.server.am.ActivityManagerServiceDumpProcessesProto.PREVIOUS_PROC;
+import static com.android.server.am.ActivityManagerServiceDumpProcessesProto.PREVIOUS_PROC_VISIBLE_TIME_MS;
+import static com.android.server.am.ActivityManagerServiceDumpProcessesProto.SCREEN_COMPAT_PACKAGES;
+import static com.android.server.am.ActivityManagerServiceDumpProcessesProto.ScreenCompatPackage.MODE;
+import static com.android.server.am.ActivityManagerServiceDumpProcessesProto.ScreenCompatPackage.PACKAGE;
import static com.android.server.am.ActivityTaskManagerDebugConfig.DEBUG_ALL;
+import static com.android.server.am.ActivityManagerService.ANR_TRACE_DIR;
import static com.android.server.am.ActivityTaskManagerDebugConfig.DEBUG_CONFIGURATION;
import static com.android.server.am.ActivityTaskManagerDebugConfig.DEBUG_FOCUS;
import static com.android.server.am.ActivityTaskManagerDebugConfig.DEBUG_IMMERSIVE;
@@ -220,9 +238,12 @@
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.internal.messages.nano.SystemMessageProto.SystemMessage;
import com.android.internal.notification.SystemNotificationChannels;
+import com.android.internal.os.TransferPipe;
import com.android.internal.os.logging.MetricsLoggerWrapper;
import com.android.internal.policy.IKeyguardDismissCallback;
import com.android.internal.policy.KeyguardDismissCallback;
+import com.android.internal.util.ArrayUtils;
+import com.android.internal.util.FastPrintWriter;
import com.android.internal.util.Preconditions;
import com.android.internal.util.function.pooled.PooledLambda;
import com.android.server.AppOpsService;
@@ -239,16 +260,24 @@
import com.android.server.wm.PinnedStackWindowController;
import com.android.server.wm.WindowManagerService;
+import java.io.BufferedReader;
import java.io.File;
+import java.io.FileDescriptor;
import java.io.FileOutputStream;
+import java.io.FileReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.lang.ref.WeakReference;
+import java.text.DateFormat;
import java.util.ArrayList;
+import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
+import java.util.Map;
+import java.util.Set;
+import java.util.function.Predicate;
/**
* System service for managing activities and their containers (task, stacks, displays,... ).
@@ -276,6 +305,15 @@
/** Hardware-reported OpenGLES version. */
final int GL_ES_VERSION;
+ public static final String DUMP_ACTIVITIES_CMD = "activities" ;
+ public static final String DUMP_ACTIVITIES_SHORT_CMD = "a" ;
+ public static final String DUMP_LASTANR_CMD = "lastanr" ;
+ public static final String DUMP_LASTANR_TRACES_CMD = "lastanr-traces" ;
+ public static final String DUMP_STARTER_CMD = "starter" ;
+ public static final String DUMP_CONTAINERS_CMD = "containers" ;
+ public static final String DUMP_RECENTS_CMD = "recents" ;
+ public static final String DUMP_RECENTS_SHORT_CMD = "r" ;
+
Context mContext;
/**
* This Context is themable and meant for UI display (AlertDialogs, etc.). The theme can
@@ -414,6 +452,12 @@
String mTopData;
/**
+ * Dump of the activity state at the time of the last ANR. Cleared after
+ * {@link WindowManagerService#LAST_ANR_LIFETIME_DURATION_MSECS}
+ */
+ String mLastANRState;
+
+ /**
* Used to retain an update lock when the foreground activity is in
* immersive mode.
*/
@@ -701,6 +745,7 @@
void setWindowManager(WindowManagerService wm) {
mWindowManager = wm;
mLockTaskController.setWindowManager(wm);
+ mStackSupervisor.setWindowManager(wm);
}
void setUsageStatsManager(UsageStatsManagerInternal usageStatsManager) {
@@ -2617,7 +2662,7 @@
pae.intent.setFlags(FLAG_ACTIVITY_NEW_TASK
| Intent.FLAG_ACTIVITY_SINGLE_TOP
| Intent.FLAG_ACTIVITY_CLEAR_TOP);
- mAmInternal.closeSystemDialogs("assist");
+ mInternal.closeSystemDialogs("assist");
try {
mContext.startActivityAsUser(pae.intent, new UserHandle(pae.userHandle));
@@ -4304,16 +4349,177 @@
|| transit == TRANSIT_TASK_TO_FRONT;
}
- void dumpSleepStates(PrintWriter pw, boolean testPssMode) {
- synchronized (mGlobalLock) {
- pw.println(" mSleepTokens=" + mStackSupervisor.mSleepTokens);
- if (mRunningVoice != null) {
- pw.println(" mRunningVoice=" + mRunningVoice);
- pw.println(" mVoiceWakeLock" + mVoiceWakeLock);
+ void dumpLastANRLocked(PrintWriter pw) {
+ pw.println("ACTIVITY MANAGER LAST ANR (dumpsys activity lastanr)");
+ if (mLastANRState == null) {
+ pw.println(" <no ANR has occurred since boot>");
+ } else {
+ pw.println(mLastANRState);
+ }
+ }
+
+ void dumpLastANRTracesLocked(PrintWriter pw) {
+ pw.println("ACTIVITY MANAGER LAST ANR TRACES (dumpsys activity lastanr-traces)");
+
+ final File[] files = new File(ANR_TRACE_DIR).listFiles();
+ if (ArrayUtils.isEmpty(files)) {
+ pw.println(" <no ANR has occurred since boot>");
+ return;
+ }
+ // Find the latest file.
+ File latest = null;
+ for (File f : files) {
+ if ((latest == null) || (latest.lastModified() < f.lastModified())) {
+ latest = f;
}
- pw.println(" mSleeping=" + mSleeping);
- pw.println(" mShuttingDown=" + mShuttingDown + " mTestPssMode=" + testPssMode);
- pw.println(" mVrController=" + mVrController);
+ }
+ pw.print("File: ");
+ pw.print(latest.getName());
+ pw.println();
+ try (BufferedReader in = new BufferedReader(new FileReader(latest))) {
+ String line;
+ while ((line = in.readLine()) != null) {
+ pw.println(line);
+ }
+ } catch (IOException e) {
+ pw.print("Unable to read: ");
+ pw.print(e);
+ pw.println();
+ }
+ }
+
+ void dumpActivitiesLocked(FileDescriptor fd, PrintWriter pw, String[] args,
+ int opti, boolean dumpAll, boolean dumpClient, String dumpPackage) {
+ dumpActivitiesLocked(fd, pw, args, opti, dumpAll, dumpClient, dumpPackage,
+ "ACTIVITY MANAGER ACTIVITIES (dumpsys activity activities)");
+ }
+
+ void dumpActivitiesLocked(FileDescriptor fd, PrintWriter pw, String[] args,
+ int opti, boolean dumpAll, boolean dumpClient, String dumpPackage, String header) {
+ pw.println(header);
+
+ boolean printedAnything = mStackSupervisor.dumpActivitiesLocked(fd, pw, dumpAll, dumpClient,
+ dumpPackage);
+ boolean needSep = printedAnything;
+
+ boolean printed = ActivityStackSupervisor.printThisActivity(pw,
+ mStackSupervisor.getTopResumedActivity(), dumpPackage, needSep,
+ " ResumedActivity: ");
+ if (printed) {
+ printedAnything = true;
+ needSep = false;
+ }
+
+ if (dumpPackage == null) {
+ if (needSep) {
+ pw.println();
+ }
+ printedAnything = true;
+ mStackSupervisor.dump(pw, " ");
+ }
+
+ if (!printedAnything) {
+ pw.println(" (nothing)");
+ }
+ }
+
+ void dumpActivityContainersLocked(PrintWriter pw) {
+ pw.println("ACTIVITY MANAGER STARTER (dumpsys activity containers)");
+ mStackSupervisor.dumpChildrenNames(pw, " ");
+ pw.println(" ");
+ }
+
+ void dumpActivityStarterLocked(PrintWriter pw, String dumpPackage) {
+ pw.println("ACTIVITY MANAGER STARTER (dumpsys activity starter)");
+ getActivityStartController().dump(pw, "", dumpPackage);
+ }
+
+ /**
+ * There are three things that cmd can be:
+ * - a flattened component name that matches an existing activity
+ * - the cmd arg isn't the flattened component name of an existing activity:
+ * dump all activity whose component contains the cmd as a substring
+ * - A hex number of the ActivityRecord object instance.
+ *
+ * @param dumpVisibleStacksOnly dump activity with {@param name} only if in a visible stack
+ * @param dumpFocusedStackOnly dump activity with {@param name} only if in the focused stack
+ */
+ protected boolean dumpActivity(FileDescriptor fd, PrintWriter pw, String name, String[] args,
+ int opti, boolean dumpAll, boolean dumpVisibleStacksOnly, boolean dumpFocusedStackOnly) {
+ ArrayList<ActivityRecord> activities;
+
+ synchronized (mGlobalLock) {
+ activities = mStackSupervisor.getDumpActivitiesLocked(name, dumpVisibleStacksOnly,
+ dumpFocusedStackOnly);
+ }
+
+ if (activities.size() <= 0) {
+ return false;
+ }
+
+ String[] newArgs = new String[args.length - opti];
+ System.arraycopy(args, opti, newArgs, 0, args.length - opti);
+
+ TaskRecord lastTask = null;
+ boolean needSep = false;
+ for (int i = activities.size() - 1; i >= 0; i--) {
+ ActivityRecord r = activities.get(i);
+ if (needSep) {
+ pw.println();
+ }
+ needSep = true;
+ synchronized (mGlobalLock) {
+ final TaskRecord task = r.getTask();
+ if (lastTask != task) {
+ lastTask = task;
+ pw.print("TASK "); pw.print(lastTask.affinity);
+ pw.print(" id="); pw.print(lastTask.taskId);
+ pw.print(" userId="); pw.println(lastTask.userId);
+ if (dumpAll) {
+ lastTask.dump(pw, " ");
+ }
+ }
+ }
+ dumpActivity(" ", fd, pw, activities.get(i), newArgs, dumpAll);
+ }
+ return true;
+ }
+
+ /**
+ * Invokes IApplicationThread.dumpActivity() on the thread of the specified activity if
+ * there is a thread associated with the activity.
+ */
+ private void dumpActivity(String prefix, FileDescriptor fd, PrintWriter pw,
+ final ActivityRecord r, String[] args, boolean dumpAll) {
+ String innerPrefix = prefix + " ";
+ synchronized (mGlobalLock) {
+ pw.print(prefix); pw.print("ACTIVITY "); pw.print(r.shortComponentName);
+ pw.print(" "); pw.print(Integer.toHexString(System.identityHashCode(r)));
+ pw.print(" pid=");
+ if (r.hasProcess()) pw.println(r.app.getPid());
+ else pw.println("(not running)");
+ if (dumpAll) {
+ r.dump(pw, innerPrefix);
+ }
+ }
+ if (r.attachedToProcess()) {
+ // flush anything that is already in the PrintWriter since the thread is going
+ // to write to the file descriptor directly
+ pw.flush();
+ try {
+ TransferPipe tp = new TransferPipe();
+ try {
+ r.app.getThread().dumpActivity(tp.getWriteFd(),
+ r.appToken, innerPrefix, args);
+ tp.go(fd);
+ } finally {
+ tp.kill();
+ }
+ } catch (IOException e) {
+ pw.println(innerPrefix + "Failure while dumping the activity: " + e);
+ } catch (RemoteException e) {
+ pw.println(innerPrefix + "Got a RemoteException while dumping the activity");
+ }
}
}
@@ -5870,6 +6076,13 @@
}
@Override
+ public void onPackageReplaced(ApplicationInfo aInfo) {
+ synchronized (mGlobalLock) {
+ mStackSupervisor.updateActivityApplicationInfoLocked(aInfo);
+ }
+ }
+
+ @Override
public CompatibilityInfo compatibilityInfoForPackage(ApplicationInfo ai) {
synchronized (mGlobalLock) {
return compatibilityInfoForPackageLocked(ai);
@@ -6037,5 +6250,469 @@
});
}
}
+
+ @Override
+ public void handleAppDied(WindowProcessController wpc, boolean restarting,
+ Runnable finishInstrumentationCallback) {
+ synchronized (mGlobalLock) {
+ // Remove this application's activities from active lists.
+ boolean hasVisibleActivities = mStackSupervisor.handleAppDiedLocked(wpc);
+
+ wpc.clearRecentTasks();
+ wpc.clearActivities();
+
+ if (wpc.isInstrumenting()) {
+ finishInstrumentationCallback.run();
+ }
+
+ mWindowManager.deferSurfaceLayout();
+ try {
+ if (!restarting && hasVisibleActivities
+ && !mStackSupervisor.resumeFocusedStacksTopActivitiesLocked()) {
+ // If there was nothing to resume, and we are not already restarting this
+ // process, but there is a visible activity that is hosted by the process...
+ // then make sure all visible activities are running, taking care of
+ // restarting this process.
+ mStackSupervisor.ensureActivitiesVisibleLocked(null, 0, !PRESERVE_WINDOWS);
+ }
+ } finally {
+ mWindowManager.continueSurfaceLayout();
+ }
+ }
+ }
+
+ @Override
+ public void closeSystemDialogs(String reason) {
+ enforceNotIsolatedCaller("closeSystemDialogs");
+
+ final int pid = Binder.getCallingPid();
+ final int uid = Binder.getCallingUid();
+ final long origId = Binder.clearCallingIdentity();
+ try {
+ synchronized (mGlobalLock) {
+ // Only allow this from foreground processes, so that background
+ // applications can't abuse it to prevent system UI from being shown.
+ if (uid >= FIRST_APPLICATION_UID) {
+ final WindowProcessController proc = mPidMap.get(pid);
+ if (!proc.isPerceptible()) {
+ Slog.w(TAG, "Ignoring closeSystemDialogs " + reason
+ + " from background process " + proc);
+ return;
+ }
+ }
+ Intent intent = new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
+ intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY
+ | Intent.FLAG_RECEIVER_FOREGROUND);
+ if (reason != null) {
+ intent.putExtra("reason", reason);
+ }
+ mWindowManager.closeSystemDialogs(reason);
+
+ mStackSupervisor.closeSystemDialogsLocked();
+
+ mAm.broadcastIntentLocked(null, null, intent, null, null, 0, null, null, null,
+ OP_NONE, null, false, false,
+ -1, SYSTEM_UID, UserHandle.USER_ALL);
+ }
+ } finally {
+ Binder.restoreCallingIdentity(origId);
+ }
+ }
+
+ @Override
+ public void cleanupDisabledPackageComponents(
+ String packageName, Set<String> disabledClasses, int userId, boolean booted) {
+ synchronized (mGlobalLock) {
+ // Clean-up disabled activities.
+ if (mStackSupervisor.finishDisabledPackageActivitiesLocked(
+ packageName, disabledClasses, true, false, userId) && booted) {
+ mStackSupervisor.resumeFocusedStacksTopActivitiesLocked();
+ mStackSupervisor.scheduleIdleLocked();
+ }
+
+ // Clean-up disabled tasks
+ getRecentTasks().cleanupDisabledPackageTasksLocked(
+ packageName, disabledClasses, userId);
+ }
+ }
+
+ @Override
+ public boolean onForceStopPackage(String packageName, boolean doit, boolean evenPersistent,
+ int userId) {
+ synchronized (mGlobalLock) {
+
+ boolean didSomething =
+ getActivityStartController().clearPendingActivityLaunches(packageName);
+ didSomething |= mStackSupervisor.finishDisabledPackageActivitiesLocked(packageName,
+ null, doit, evenPersistent, userId);
+ return didSomething;
+ }
+ }
+
+ @Override
+ public void resumeTopActivities(boolean scheduleIdle) {
+ synchronized (mGlobalLock) {
+ mStackSupervisor.resumeFocusedStacksTopActivitiesLocked();
+ if (scheduleIdle) {
+ mStackSupervisor.scheduleIdleLocked();
+ }
+ }
+ }
+
+ @Override
+ public void preBindApplication(WindowProcessController wpc) {
+ synchronized (mGlobalLock) {
+ mStackSupervisor.getActivityMetricsLogger().notifyBindApplication(wpc.mInfo);
+ }
+ }
+
+ @Override
+ public boolean attachApplication(WindowProcessController wpc) throws RemoteException {
+ synchronized (mGlobalLock) {
+ return mStackSupervisor.attachApplicationLocked(wpc);
+ }
+ }
+
+ @Override
+ public void notifyLockedProfile(@UserIdInt int userId, int currentUserId) {
+ try {
+ if (!AppGlobals.getPackageManager().isUidPrivileged(Binder.getCallingUid())) {
+ throw new SecurityException("Only privileged app can call notifyLockedProfile");
+ }
+ } catch (RemoteException ex) {
+ throw new SecurityException("Fail to check is caller a privileged app", ex);
+ }
+
+ synchronized (mGlobalLock) {
+ final long ident = Binder.clearCallingIdentity();
+ try {
+ if (mAmInternal.shouldConfirmCredentials(userId)) {
+ if (mKeyguardController.isKeyguardLocked()) {
+ // Showing launcher to avoid user entering credential twice.
+ startHomeActivity(currentUserId, "notifyLockedProfile");
+ }
+ mStackSupervisor.lockAllProfileTasks(userId);
+ }
+ } finally {
+ Binder.restoreCallingIdentity(ident);
+ }
+ }
+ }
+
+ @Override
+ public void startConfirmDeviceCredentialIntent(Intent intent, Bundle options) {
+ mAmInternal.enforceCallingPermission(
+ MANAGE_ACTIVITY_STACKS, "startConfirmDeviceCredentialIntent");
+
+ synchronized (mGlobalLock) {
+ final long ident = Binder.clearCallingIdentity();
+ try {
+ intent.addFlags(FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS |
+ FLAG_ACTIVITY_TASK_ON_HOME);
+ ActivityOptions activityOptions = options != null
+ ? new ActivityOptions(options) : ActivityOptions.makeBasic();
+ activityOptions.setLaunchTaskId(
+ mStackSupervisor.getDefaultDisplayHomeActivity().getTask().taskId);
+ mContext.startActivityAsUser(intent, activityOptions.toBundle(),
+ UserHandle.CURRENT);
+ } finally {
+ Binder.restoreCallingIdentity(ident);
+ }
+ }
+ }
+
+ @Override
+ public void writeActivitiesToProto(ProtoOutputStream proto) {
+ synchronized (mGlobalLock) {
+ // The output proto of "activity --proto activities"
+ // is ActivityManagerServiceDumpActivitiesProto
+ mStackSupervisor.writeToProto(proto,
+ ActivityManagerServiceDumpActivitiesProto.ACTIVITY_STACK_SUPERVISOR);
+ }
+ }
+
+ @Override
+ public void saveANRState(String reason) {
+ synchronized (mGlobalLock) {
+ final StringWriter sw = new StringWriter();
+ final PrintWriter pw = new FastPrintWriter(sw, false, 1024);
+ pw.println(" ANR time: " + DateFormat.getDateTimeInstance().format(new Date()));
+ if (reason != null) {
+ pw.println(" Reason: " + reason);
+ }
+ pw.println();
+ getActivityStartController().dump(pw, " ", null);
+ pw.println();
+ pw.println("-------------------------------------------------------------------------------");
+ dumpActivitiesLocked(null /* fd */, pw, null /* args */, 0 /* opti */,
+ true /* dumpAll */, false /* dumpClient */, null /* dumpPackage */,
+ "" /* header */);
+ pw.println();
+ pw.close();
+
+ mLastANRState = sw.toString();
+ }
+ }
+
+ @Override
+ public void clearSavedANRState() {
+ synchronized (mGlobalLock) {
+ mLastANRState = null;
+ }
+ }
+
+ @Override
+ public void dump(String cmd, FileDescriptor fd, PrintWriter pw, String[] args, int opti,
+ boolean dumpAll, boolean dumpClient, String dumpPackage) {
+ synchronized (mGlobalLock) {
+ if (DUMP_ACTIVITIES_CMD.equals(cmd) || DUMP_ACTIVITIES_SHORT_CMD.equals(cmd)) {
+ dumpActivitiesLocked(fd, pw, args, opti, dumpAll, dumpClient, dumpPackage);
+ } else if (DUMP_LASTANR_CMD.equals(cmd)) {
+ dumpLastANRLocked(pw);
+ } else if (DUMP_LASTANR_TRACES_CMD.equals(cmd)) {
+ dumpLastANRTracesLocked(pw);
+ } else if (DUMP_STARTER_CMD.equals(cmd)) {
+ dumpActivityStarterLocked(pw, dumpPackage);
+ } else if (DUMP_CONTAINERS_CMD.equals(cmd)) {
+ dumpActivityContainersLocked(pw);
+ } else if (DUMP_RECENTS_CMD.equals(cmd) || DUMP_RECENTS_SHORT_CMD.equals(cmd)) {
+ if (getRecentTasks() != null) {
+ getRecentTasks().dump(pw, dumpAll, dumpPackage);
+ }
+ }
+ }
+ }
+
+ @Override
+ public boolean dumpForProcesses(FileDescriptor fd, PrintWriter pw, boolean dumpAll,
+ String dumpPackage, int dumpAppId, boolean needSep, boolean testPssMode,
+ int wakefulness) {
+ synchronized (mGlobalLock) {
+ if (mHomeProcess != null && (dumpPackage == null
+ || mHomeProcess.mPkgList.contains(dumpPackage))) {
+ if (needSep) {
+ pw.println();
+ needSep = false;
+ }
+ pw.println(" mHomeProcess: " + mHomeProcess);
+ }
+ if (mPreviousProcess != null && (dumpPackage == null
+ || mPreviousProcess.mPkgList.contains(dumpPackage))) {
+ if (needSep) {
+ pw.println();
+ needSep = false;
+ }
+ pw.println(" mPreviousProcess: " + mPreviousProcess);
+ }
+ if (dumpAll && (mPreviousProcess == null || dumpPackage == null
+ || mPreviousProcess.mPkgList.contains(dumpPackage))) {
+ StringBuilder sb = new StringBuilder(128);
+ sb.append(" mPreviousProcessVisibleTime: ");
+ TimeUtils.formatDuration(mPreviousProcessVisibleTime, sb);
+ pw.println(sb);
+ }
+ if (mHeavyWeightProcess != null && (dumpPackage == null
+ || mHeavyWeightProcess.mPkgList.contains(dumpPackage))) {
+ if (needSep) {
+ pw.println();
+ needSep = false;
+ }
+ pw.println(" mHeavyWeightProcess: " + mHeavyWeightProcess);
+ }
+ if (dumpPackage == null) {
+ pw.println(" mGlobalConfiguration: " + getGlobalConfiguration());
+ mStackSupervisor.dumpDisplayConfigs(pw, " ");
+ }
+ if (dumpAll) {
+ if (dumpPackage == null) {
+ pw.println(" mConfigWillChange: "
+ + getTopDisplayFocusedStack().mConfigWillChange);
+ }
+ if (mCompatModePackages.getPackages().size() > 0) {
+ boolean printed = false;
+ for (Map.Entry<String, Integer> entry
+ : mCompatModePackages.getPackages().entrySet()) {
+ String pkg = entry.getKey();
+ int mode = entry.getValue();
+ if (dumpPackage != null && !dumpPackage.equals(pkg)) {
+ continue;
+ }
+ if (!printed) {
+ pw.println(" mScreenCompatPackages:");
+ printed = true;
+ }
+ pw.println(" " + pkg + ": " + mode);
+ }
+ }
+ }
+
+ if (dumpPackage == null) {
+ pw.println(" mWakefulness="
+ + PowerManagerInternal.wakefulnessToString(wakefulness));
+ pw.println(" mSleepTokens=" + mStackSupervisor.mSleepTokens);
+ if (mRunningVoice != null) {
+ pw.println(" mRunningVoice=" + mRunningVoice);
+ pw.println(" mVoiceWakeLock" + mVoiceWakeLock);
+ }
+ pw.println(" mSleeping=" + mSleeping);
+ pw.println(" mShuttingDown=" + mShuttingDown + " mTestPssMode=" + testPssMode);
+ pw.println(" mVrController=" + mVrController);
+ }
+ if (mCurAppTimeTracker != null) {
+ mCurAppTimeTracker.dumpWithHeader(pw, " ", true);
+ }
+ if (mAllowAppSwitchUids.size() > 0) {
+ boolean printed = false;
+ for (int i = 0; i < mAllowAppSwitchUids.size(); i++) {
+ ArrayMap<String, Integer> types = mAllowAppSwitchUids.valueAt(i);
+ for (int j = 0; j < types.size(); j++) {
+ if (dumpPackage == null ||
+ UserHandle.getAppId(types.valueAt(j).intValue()) == dumpAppId) {
+ if (needSep) {
+ pw.println();
+ needSep = false;
+ }
+ if (!printed) {
+ pw.println(" mAllowAppSwitchUids:");
+ printed = true;
+ }
+ pw.print(" User ");
+ pw.print(mAllowAppSwitchUids.keyAt(i));
+ pw.print(": Type ");
+ pw.print(types.keyAt(j));
+ pw.print(" = ");
+ UserHandle.formatUid(pw, types.valueAt(j).intValue());
+ pw.println();
+ }
+ }
+ }
+ }
+ if (dumpPackage == null) {
+ if (mController != null) {
+ pw.println(" mController=" + mController
+ + " mControllerIsAMonkey=" + mControllerIsAMonkey);
+ }
+ pw.println(" mGoingToSleep=" + mStackSupervisor.mGoingToSleep);
+ pw.println(" mLaunchingActivity=" + mStackSupervisor.mLaunchingActivity);
+ }
+
+ return needSep;
+ }
+ }
+
+ @Override
+ public void writeProcessesToProto(ProtoOutputStream proto, String dumpPackage) {
+ synchronized (mGlobalLock) {
+ if (dumpPackage == null) {
+ getGlobalConfiguration().writeToProto(proto, GLOBAL_CONFIGURATION);
+ proto.write(CONFIG_WILL_CHANGE, getTopDisplayFocusedStack().mConfigWillChange);
+ writeSleepStateToProto(proto);
+ if (mController != null) {
+ final long token = proto.start(CONTROLLER);
+ proto.write(CONTROLLER, mController.toString());
+ proto.write(IS_A_MONKEY, mControllerIsAMonkey);
+ proto.end(token);
+ }
+ mStackSupervisor.mGoingToSleep.writeToProto(proto, GOING_TO_SLEEP);
+ mStackSupervisor.mLaunchingActivity.writeToProto(proto, LAUNCHING_ACTIVITY);
+ }
+
+ if (mHomeProcess != null && (dumpPackage == null
+ || mHomeProcess.mPkgList.contains(dumpPackage))) {
+ ((ProcessRecord) mHomeProcess.mOwner).writeToProto(proto, HOME_PROC);
+ }
+
+ if (mPreviousProcess != null && (dumpPackage == null
+ || mPreviousProcess.mPkgList.contains(dumpPackage))) {
+ ((ProcessRecord) mPreviousProcess.mOwner).writeToProto(proto, PREVIOUS_PROC);
+ proto.write(PREVIOUS_PROC_VISIBLE_TIME_MS, mPreviousProcessVisibleTime);
+ }
+
+ if (mHeavyWeightProcess != null && (dumpPackage == null
+ || mHeavyWeightProcess.mPkgList.contains(dumpPackage))) {
+ ((ProcessRecord) mHeavyWeightProcess.mOwner).writeToProto(
+ proto, HEAVY_WEIGHT_PROC);
+ }
+
+ for (Map.Entry<String, Integer> entry
+ : mCompatModePackages.getPackages().entrySet()) {
+ String pkg = entry.getKey();
+ int mode = entry.getValue();
+ if (dumpPackage == null || dumpPackage.equals(pkg)) {
+ long compatToken = proto.start(SCREEN_COMPAT_PACKAGES);
+ proto.write(PACKAGE, pkg);
+ proto.write(MODE, mode);
+ proto.end(compatToken);
+ }
+ }
+
+ if (mCurAppTimeTracker != null) {
+ mCurAppTimeTracker.writeToProto(proto, CURRENT_TRACKER, true);
+ }
+
+ }
+ }
+
+ @Override
+ public boolean dumpActivity(FileDescriptor fd, PrintWriter pw, String name,
+ String[] args, int opti, boolean dumpAll, boolean dumpVisibleStacksOnly,
+ boolean dumpFocusedStackOnly) {
+ synchronized (mGlobalLock) {
+ return ActivityTaskManagerService.this.dumpActivity(fd, pw, name, args, opti,
+ dumpAll, dumpVisibleStacksOnly, dumpFocusedStackOnly);
+ }
+ }
+
+ @Override
+ public boolean canGcNow() {
+ synchronized (mGlobalLock) {
+ return isSleeping() || mStackSupervisor.allResumedActivitiesIdle();
+ }
+ }
+
+ @Override
+ public WindowProcessController getTopApp() {
+ synchronized (mGlobalLock) {
+ final ActivityRecord top = mStackSupervisor.getTopResumedActivity();
+ return top != null ? top.app : null;
+ }
+ }
+
+ @Override
+ public void rankTaskLayersIfNeeded() {
+ synchronized (mGlobalLock) {
+ if (mStackSupervisor != null) {
+ mStackSupervisor.rankTaskLayersIfNeeded();
+ }
+ }
+ }
+
+ @Override
+ public void scheduleDestroyAllActivities(String reason) {
+ synchronized (mGlobalLock) {
+ mStackSupervisor.scheduleDestroyAllActivities(null, reason);
+ }
+ }
+
+ @Override
+ public void removeUser(int userId) {
+ synchronized (mGlobalLock) {
+ mStackSupervisor.removeUserLocked(userId);
+ }
+ }
+
+ @Override
+ public boolean switchUser(int userId, UserState userState) {
+ synchronized (mGlobalLock) {
+ return mStackSupervisor.switchUserLocked(userId, userState);
+ }
+ }
+
+ @Override
+ public void onHandleAppCrash(WindowProcessController wpc) {
+ synchronized (mGlobalLock) {
+ mStackSupervisor.handleAppCrashLocked(wpc);
+ }
+ }
}
}
diff --git a/services/core/java/com/android/server/am/AppErrors.java b/services/core/java/com/android/server/am/AppErrors.java
index a05fbc6..be1f9ea 100644
--- a/services/core/java/com/android/server/am/AppErrors.java
+++ b/services/core/java/com/android/server/am/AppErrors.java
@@ -501,10 +501,10 @@
long orig = Binder.clearCallingIdentity();
try {
// Kill it with fire!
- mService.mStackSupervisor.handleAppCrashLocked(r.getWindowProcessController());
+ mService.mAtmInternal.onHandleAppCrash(r.getWindowProcessController());
if (!r.isPersistent()) {
mService.removeProcessLocked(r, false, false, "crash");
- mService.mStackSupervisor.resumeFocusedStacksTopActivitiesLocked();
+ mService.mAtmInternal.resumeTopActivities(false /* scheduleIdle */);
}
} finally {
Binder.restoreCallingIdentity(orig);
@@ -723,7 +723,7 @@
+ " has crashed too many times: killing!");
EventLog.writeEvent(EventLogTags.AM_PROCESS_CRASHED_TOO_MUCH,
app.userId, app.info.processName, app.uid);
- mService.mStackSupervisor.handleAppCrashLocked(app.getWindowProcessController());
+ mService.mAtmInternal.onHandleAppCrash(app.getWindowProcessController());
if (!app.isPersistent()) {
// We don't want to start this process again until the user
// explicitly does so... but for persistent process, we really
@@ -744,15 +744,16 @@
// annoy the user repeatedly. Unless it is persistent, since those
// processes run critical code.
mService.removeProcessLocked(app, false, tryAgain, "crash");
- mService.mStackSupervisor.resumeFocusedStacksTopActivitiesLocked();
+ mService.mAtmInternal.resumeTopActivities(false /* scheduleIdle */);
if (!showBackground) {
return false;
}
}
- mService.mStackSupervisor.resumeFocusedStacksTopActivitiesLocked();
+ mService.mAtmInternal.resumeTopActivities(false /* scheduleIdle */);
} else {
final TaskRecord affectedTask =
- mService.mStackSupervisor.finishTopCrashedActivitiesLocked(app.getWindowProcessController(), reason);
+ mService.mActivityTaskManager.mStackSupervisor.finishTopCrashedActivitiesLocked(
+ app.getWindowProcessController(), reason);
if (data != null) {
data.task = affectedTask;
}
diff --git a/services/core/java/com/android/server/am/ProcessRecord.java b/services/core/java/com/android/server/am/ProcessRecord.java
index 3128333..145791c 100644
--- a/services/core/java/com/android/server/am/ProcessRecord.java
+++ b/services/core/java/com/android/server/am/ProcessRecord.java
@@ -128,7 +128,7 @@
long lastCachedPss; // Last computed pss when in cached state.
long lastCachedSwapPss; // Last computed SwapPss when in cached state.
int maxAdj; // Maximum OOM adjustment for this process
- int curRawAdj; // Current OOM unlimited adjustment for this process
+ private int mCurRawAdj; // Current OOM unlimited adjustment for this process
int setRawAdj; // Last set OOM unlimited adjustment for this process
int curAdj; // Current OOM adjustment for this process
int setAdj; // Last set OOM adjustment for this process
@@ -362,7 +362,7 @@
pw.print(" initialIdlePss="); pw.println(initialIdlePss);
}
pw.print(prefix); pw.print("oom: max="); pw.print(maxAdj);
- pw.print(" curRaw="); pw.print(curRawAdj);
+ pw.print(" curRaw="); pw.print(mCurRawAdj);
pw.print(" setRaw="); pw.print(setRawAdj);
pw.print(" cur="); pw.print(curAdj);
pw.print(" set="); pw.println(setAdj);
@@ -531,7 +531,7 @@
userId = UserHandle.getUserId(_uid);
processName = _processName;
maxAdj = ProcessList.UNKNOWN_ADJ;
- curRawAdj = setRawAdj = ProcessList.INVALID_ADJ;
+ mCurRawAdj = setRawAdj = ProcessList.INVALID_ADJ;
curAdj = setAdj = verifiedAdj = ProcessList.INVALID_ADJ;
mPersistent = false;
removed = false;
@@ -1091,6 +1091,15 @@
return mInstr;
}
+ void setCurRawAdj(int curRawAdj) {
+ mCurRawAdj = curRawAdj;
+ mWindowProcessController.setPerceptible(curRawAdj <= ProcessList.PERCEPTIBLE_APP_ADJ);
+ }
+
+ int getCurRawAdj() {
+ return mCurRawAdj;
+ }
+
@Override
public void clearProfilerIfNeeded() {
synchronized (mService) {
diff --git a/services/core/java/com/android/server/am/UserController.java b/services/core/java/com/android/server/am/UserController.java
index 3a897c4..d2dd3db 100644
--- a/services/core/java/com/android/server/am/UserController.java
+++ b/services/core/java/com/android/server/am/UserController.java
@@ -2242,21 +2242,15 @@
}
void stackSupervisorRemoveUser(int userId) {
- synchronized (mService) {
- mService.mStackSupervisor.removeUserLocked(userId);
- }
+ mService.mAtmInternal.removeUser(userId);
}
protected boolean stackSupervisorSwitchUser(int userId, UserState uss) {
- synchronized (mService) {
- return mService.mStackSupervisor.switchUserLocked(userId, uss);
- }
+ return mService.mAtmInternal.switchUser(userId, uss);
}
protected void stackSupervisorResumeFocusedStackTopActivity() {
- synchronized (mService) {
- mService.mStackSupervisor.resumeFocusedStacksTopActivitiesLocked();
- }
+ mService.mAtmInternal.resumeTopActivities(false /* scheduleIdle */);
}
protected void clearAllLockedTasks(String reason) {
diff --git a/services/core/java/com/android/server/am/WindowProcessController.java b/services/core/java/com/android/server/am/WindowProcessController.java
index a461d1c..7e3893b 100644
--- a/services/core/java/com/android/server/am/WindowProcessController.java
+++ b/services/core/java/com/android/server/am/WindowProcessController.java
@@ -127,6 +127,8 @@
private volatile boolean mDebugging;
// Active instrumentation running in process?
private volatile boolean mInstrumenting;
+ // This process it perceptible by the user.
+ private volatile boolean mPerceptible;
// Set to true when process was launched with a wrapper attached
private volatile boolean mUsingWrapper;
@@ -337,6 +339,14 @@
return mInstrumenting;
}
+ public void setPerceptible(boolean perceptible) {
+ mPerceptible = perceptible;
+ }
+
+ boolean isPerceptible() {
+ return mPerceptible;
+ }
+
@Override
protected int getChildCount() {
return 0;
diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java b/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java
index e5347cf..81a9ee0 100644
--- a/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java
+++ b/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java
@@ -18,6 +18,7 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.annotation.UserIdInt;
import android.app.AppProtoEnums;
import android.app.IActivityManager;
import android.app.IApplicationThread;
@@ -28,19 +29,26 @@
import android.content.res.CompatibilityInfo;
import android.os.Bundle;
import android.os.IBinder;
+import android.os.RemoteException;
import android.os.SystemClock;
import android.service.voice.IVoiceInteractionSession;
import android.util.SparseIntArray;
+import android.util.proto.ProtoOutputStream;
import com.android.internal.app.IVoiceInteractor;
import com.android.server.am.ActivityServiceConnectionsHolder;
import com.android.server.am.PendingIntentRecord;
import com.android.server.am.SafeActivityOptions;
import com.android.server.am.TaskRecord;
+import com.android.server.am.UserState;
import com.android.server.am.WindowProcessController;
+import java.io.FileDescriptor;
+import java.io.PrintWriter;
import java.lang.ref.WeakReference;
import java.util.List;
+import java.util.Set;
+import java.util.function.Predicate;
/**
* Activity Task manager local system service interface.
@@ -313,6 +321,7 @@
public abstract void onPackageDataCleared(String name);
public abstract void onPackageUninstalled(String name);
public abstract void onPackageAdded(String name, boolean replacing);
+ public abstract void onPackageReplaced(ApplicationInfo aInfo);
public abstract CompatibilityInfo compatibilityInfoForPackage(ApplicationInfo ai);
@@ -343,4 +352,83 @@
/** @return true if the given process is the factory test process. */
public abstract boolean isFactoryTestProcess(WindowProcessController wpc);
public abstract void updateTopComponentForFactoryTest();
+ public abstract void handleAppDied(WindowProcessController wpc, boolean restarting,
+ Runnable finishInstrumentationCallback);
+ public abstract void closeSystemDialogs(String reason);
+
+ /** Removes all components (e.g. activities, recents, ...) belonging to a disabled package. */
+ public abstract void cleanupDisabledPackageComponents(
+ String packageName, Set<String> disabledClasses, int userId, boolean booted);
+
+ /** Called whenever AM force stops a package. */
+ public abstract boolean onForceStopPackage(String packageName, boolean doit,
+ boolean evenPersistent, int userId);
+ /**
+ * Resumes all top activities in the system if they aren't resumed already.
+ * @param scheduleIdle If the idle message should be schedule after the top activities are
+ * resumed.
+ */
+ public abstract void resumeTopActivities(boolean scheduleIdle);
+
+ /** Called by AM just before it binds to an application process. */
+ public abstract void preBindApplication(WindowProcessController wpc);
+
+ /** Called by AM when an application process attaches. */
+ public abstract boolean attachApplication(WindowProcessController wpc) throws RemoteException;
+
+ /** @see IActivityManager#notifyLockedProfile(int) */
+ public abstract void notifyLockedProfile(@UserIdInt int userId, int currentUserId);
+
+ /** @see IActivityManager#startConfirmDeviceCredentialIntent(Intent, Bundle) */
+ public abstract void startConfirmDeviceCredentialIntent(Intent intent, Bundle options);
+
+ /** Writes current activity states to the proto stream. */
+ public abstract void writeActivitiesToProto(ProtoOutputStream proto);
+
+ /**
+ * Saves the current activity manager state and includes the saved state in the next dump of
+ * activity manager.
+ */
+ public abstract void saveANRState(String reason);
+
+ /** Clears the previously saved activity manager ANR state. */
+ public abstract void clearSavedANRState();
+
+ /** Dump the current state based on the command. */
+ public abstract void dump(String cmd, FileDescriptor fd, PrintWriter pw, String[] args,
+ int opti, boolean dumpAll, boolean dumpClient, String dumpPackage);
+
+ /** Dump the current state for inclusion in process dump. */
+ public abstract boolean dumpForProcesses(FileDescriptor fd, PrintWriter pw, boolean dumpAll,
+ String dumpPackage, int dumpAppId, boolean needSep, boolean testPssMode,
+ int wakefulness);
+
+ /** Writes the current window process states to the proto stream. */
+ public abstract void writeProcessesToProto(ProtoOutputStream proto, String dumpPackage);
+
+ /** Dump the current activities state. */
+ public abstract boolean dumpActivity(FileDescriptor fd, PrintWriter pw, String name,
+ String[] args, int opti, boolean dumpAll, boolean dumpVisibleStacksOnly,
+ boolean dumpFocusedStackOnly);
+
+ /** @return true if it the activity management system is okay with GC running now. */
+ public abstract boolean canGcNow();
+
+ /** @return the process for the top-most resumed activity in the system. */
+ public abstract WindowProcessController getTopApp();
+
+ /** Generate oom-score-adjustment rank for all tasks in the system based on z-order. */
+ public abstract void rankTaskLayersIfNeeded();
+
+ /** Destroy all activities. */
+ public abstract void scheduleDestroyAllActivities(String reason);
+
+ /** Remove user association with activities. */
+ public abstract void removeUser(int userId);
+
+ /** Switch current focused user for activities. */
+ public abstract boolean switchUser(int userId, UserState userState);
+
+ /** Called whenever an app crashes. */
+ public abstract void onHandleAppCrash(WindowProcessController wpc);
}
diff --git a/services/core/java/com/android/server/wm/InputManagerCallback.java b/services/core/java/com/android/server/wm/InputManagerCallback.java
index b5e2f01..eeb6f6a 100644
--- a/services/core/java/com/android/server/wm/InputManagerCallback.java
+++ b/services/core/java/com/android/server/wm/InputManagerCallback.java
@@ -108,7 +108,7 @@
}
// All the calls below need to happen without the WM lock held since they call into AM.
- mService.mAmInternal.saveANRState(reason);
+ mService.mAtmInternal.saveANRState(reason);
if (appWindowToken != null && appWindowToken.appToken != null) {
// Notify the activity manager about the timeout and let it decide whether
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index 8b1b327..ad51b17 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -4816,7 +4816,7 @@
synchronized (mWindowMap) {
mLastANRState = null;
}
- mAmInternal.clearSavedANRState();
+ mAtmInternal.clearSavedANRState();
}
break;
case WALLPAPER_DRAW_PENDING_TIMEOUT: {