diff options
| author | 2018-10-17 20:08:41 +0000 | |
|---|---|---|
| committer | 2018-10-17 20:08:41 +0000 | |
| commit | 1abd4feabb8e1f989cc159ecd15ee02d73cd77e1 (patch) | |
| tree | 15c8a468255bb29fcd079b4326be72a0304c5215 | |
| parent | b10e4373c94a66b9aee29f743330f20b5e112baa (diff) | |
| parent | 31913b50d1f2e5a191b3123a45011ae0a533c340 (diff) | |
Merge "Removed AMS.mStackSuperivor (22/n)"
14 files changed, 903 insertions, 633 deletions
diff --git a/core/java/android/app/ActivityManagerInternal.java b/core/java/android/app/ActivityManagerInternal.java index a7836af2c1e5..7ae2ded9f241 100644 --- a/core/java/android/app/ActivityManagerInternal.java +++ b/core/java/android/app/ActivityManagerInternal.java @@ -124,17 +124,6 @@ public abstract class ActivityManagerInternal { public abstract void notifyNetworkPolicyRulesUpdated(int uid, long procStateSeq); /** - * 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(); - - /** * @return true if runtime was restarted, false if it's normal boot */ public abstract boolean isRuntimeRestarted(); @@ -197,9 +186,6 @@ public abstract class ActivityManagerInternal { /** Trims memory usage in the system by removing/stopping unused application processes. */ public abstract void trimApplications(); - /** Closes all system dialogs. */ - public abstract void closeSystemDialogs(String reason); - /** Kill the processes in the list due to their tasks been removed. */ public abstract void killProcessesForRemovedTask(ArrayList<Object> procsToKill); diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index f9e61347503f..248678767b58 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.ActivityTaskManagerDebugConfig.POSTFIX_SWITC 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 @@ public class ActivityManagerService extends IActivityManager.Stub 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 @@ public class ActivityManagerService extends IActivityManager.Stub 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 @@ public class ActivityManagerService extends IActivityManager.Stub 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 @@ public class ActivityManagerService extends IActivityManager.Stub * 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 @@ public class ActivityManagerService extends IActivityManager.Stub synchronized (this) { mWindowManager = wm; mActivityTaskManager.setWindowManager(wm); - mStackSupervisor.setWindowManager(wm); } } @@ -2368,7 +2365,6 @@ public class ActivityManagerService extends IActivityManager.Stub mActivityTaskManager.setActivityManagerService(this, mHandlerThread.getLooper(), mIntentFirewall, mPendingIntentController); mAtmInternal = LocalServices.getService(ActivityTaskManagerInternal.class); - mStackSupervisor = mActivityTaskManager.mStackSupervisor; mProcessCpuThread = new Thread("CpuTracker") { @Override @@ -4087,33 +4083,13 @@ public class ActivityManagerService extends IActivityManager.Stub 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 @@ public class ActivityManagerService extends IActivityManager.Stub @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 @@ public class ActivityManagerService extends IActivityManager.Stub 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 @@ public class ActivityManagerService extends IActivityManager.Stub 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 @@ public class ActivityManagerService extends IActivityManager.Stub } } if (mBooted) { - mStackSupervisor.resumeFocusedStacksTopActivitiesLocked(); - mStackSupervisor.scheduleIdleLocked(); + mAtmInternal.resumeTopActivities(true /* scheduleIdle */); } } @@ -5790,7 +5710,7 @@ public class ActivityManagerService extends IActivityManager.Stub } 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 @@ public class ActivityManagerService extends IActivityManager.Stub // 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 @@ public class ActivityManagerService extends IActivityManager.Stub @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 @@ public class ActivityManagerService extends IActivityManager.Stub } finally { Binder.restoreCallingIdentity(ident); } - mStackSupervisor.resumeFocusedStacksTopActivitiesLocked(); + mAtmInternal.resumeTopActivities(false /* scheduleIdle */); mUserController.sendUserSwitchBroadcasts(-1, currentUserId); BinderInternal.nSetBinderProxyCountWatermarks(6000,5500); @@ -10584,24 +10463,26 @@ public class ActivityManagerService extends IActivityManager.Stub 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 @@ public class ActivityManagerService extends IActivityManager.Stub 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 @@ public class ActivityManagerService extends IActivityManager.Stub 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 @@ public class ActivityManagerService extends IActivityManager.Stub // 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 @@ public class ActivityManagerService extends IActivityManager.Stub 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 @@ public class ActivityManagerService extends IActivityManager.Stub 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 @@ public class ActivityManagerService extends IActivityManager.Stub 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 @@ public class ActivityManagerService extends IActivityManager.Stub 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 @@ public class ActivityManagerService extends IActivityManager.Stub 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 @@ public class ActivityManagerService extends IActivityManager.Stub } } } - 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 @@ public class ActivityManagerService extends IActivityManager.Stub + " 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 @@ public class ActivityManagerService extends IActivityManager.Stub 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 @@ public class ActivityManagerService extends IActivityManager.Stub 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 @@ public class ActivityManagerService extends IActivityManager.Stub 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 @@ public class ActivityManagerService extends IActivityManager.Stub 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 @@ public class ActivityManagerService extends IActivityManager.Stub } } - 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 @@ public class ActivityManagerService extends IActivityManager.Stub 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 @@ public class ActivityManagerService extends IActivityManager.Stub 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 @@ public class ActivityManagerService extends IActivityManager.Stub } } - /** - * 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 @@ public class ActivityManagerService extends IActivityManager.Stub 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 @@ public class ActivityManagerService extends IActivityManager.Stub 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 @@ public class ActivityManagerService extends IActivityManager.Stub 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 @@ public class ActivityManagerService extends IActivityManager.Stub + " 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 @@ public class ActivityManagerService extends IActivityManager.Stub 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 @@ public class ActivityManagerService extends IActivityManager.Stub } 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 @@ public class ActivityManagerService extends IActivityManager.Stub // 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 @@ public class ActivityManagerService extends IActivityManager.Stub 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 @@ public class ActivityManagerService extends IActivityManager.Stub 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 @@ public class ActivityManagerService extends IActivityManager.Stub } } - 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 @@ public class ActivityManagerService extends IActivityManager.Stub processingBroadcasts = true; } } - return !processingBroadcasts - && (mAtmInternal.isSleeping() || mStackSupervisor.allResumedActivitiesIdle()); + return !processingBroadcasts && mAtmInternal.canGcNow(); } /** @@ -18135,7 +17680,7 @@ public class ActivityManagerService extends IActivityManager.Stub 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 @@ public class ActivityManagerService extends IActivityManager.Stub 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 @@ public class ActivityManagerService extends IActivityManager.Stub // 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 @@ public class ActivityManagerService extends IActivityManager.Stub } } - return act; + return r; } /** @@ -18832,9 +18378,7 @@ public class ActivityManagerService extends IActivityManager.Stub */ @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 @@ public class ActivityManagerService extends IActivityManager.Stub // 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 @@ public class ActivityManagerService extends IActivityManager.Stub } @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 @@ public class ActivityManagerService extends IActivityManager.Stub uidRec.reset(); } - if (mStackSupervisor != null) { - mStackSupervisor.rankTaskLayersIfNeeded(); + if (mAtmInternal != null) { + mAtmInternal.rankTaskLayersIfNeeded(); } mAdjSeq++; @@ -18956,7 +18490,7 @@ public class ActivityManagerService extends IActivityManager.Stub // 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 @@ public class ActivityManagerService extends IActivityManager.Stub // 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 @@ public class ActivityManagerService extends IActivityManager.Stub 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 @@ public class ActivityManagerService extends IActivityManager.Stub } @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 @@ public class ActivityManagerService extends IActivityManager.Stub 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 3578ed05dccc..a0dd87811dae 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 @@ class ActivityMetricsLogger { /** * 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 647075909693..c4557047f95d 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 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D 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 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D 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 6398680b7122..b7bbfe8feed0 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_PINNED; 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.Build.VERSION_CODES.N; 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_IN_PLACE; 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.MetricsLogger; 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.ActivityTaskManagerInternal; 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 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { /** 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 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { 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 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { void setWindowManager(WindowManagerService wm) { mWindowManager = wm; mLockTaskController.setWindowManager(wm); + mStackSupervisor.setWindowManager(wm); } void setUsageStatsManager(UsageStatsManagerInternal usageStatsManager) { @@ -2617,7 +2662,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { 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 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { || transit == TRANSIT_TASK_TO_FRONT; } - void dumpSleepStates(PrintWriter pw, boolean testPssMode) { + 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.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) { - pw.println(" mSleepTokens=" + mStackSupervisor.mSleepTokens); - if (mRunningVoice != null) { - pw.println(" mRunningVoice=" + mRunningVoice); - pw.println(" mVoiceWakeLock" + mVoiceWakeLock); + 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"); } - pw.println(" mSleeping=" + mSleeping); - pw.println(" mShuttingDown=" + mShuttingDown + " mTestPssMode=" + testPssMode); - pw.println(" mVrController=" + mVrController); } } @@ -5870,6 +6076,13 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { } @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 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { }); } } + + @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 a05fbc695370..be1f9ea9e134 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 @@ class AppErrors { 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 @@ class AppErrors { + " 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 @@ class AppErrors { // 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 3128333def6f..145791cdc943 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 @@ final class ProcessRecord implements WindowProcessListener { 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 @@ final class ProcessRecord implements WindowProcessListener { 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 @@ final class ProcessRecord implements WindowProcessListener { 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 @@ final class ProcessRecord implements WindowProcessListener { 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 3a897c4d525c..d2dd3db70118 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 @@ class UserController implements Handler.Callback { } 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 a461d1c4b849..7e3893b38c31 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 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio 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 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio 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 e5347cfee5a2..81a9ee0218c2 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 @@ package com.android.server.wm; 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.pm.ApplicationInfo; 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 class ActivityTaskManagerInternal { 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 @@ public abstract class ActivityTaskManagerInternal { /** @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 b5e2f01d8fbb..eeb6f6a7a740 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 @@ final class InputManagerCallback implements InputManagerService.WindowManagerCal } // 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 8b1b3275362a..ad51b17b5604 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 @@ public class WindowManagerService extends IWindowManager.Stub synchronized (mWindowMap) { mLastANRState = null; } - mAmInternal.clearSavedANRState(); + mAtmInternal.clearSavedANRState(); } break; case WALLPAPER_DRAW_PENDING_TIMEOUT: { diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityTestsBase.java b/services/tests/servicestests/src/com/android/server/am/ActivityTestsBase.java index 023f7758bd0a..58fe70d7d992 100644 --- a/services/tests/servicestests/src/com/android/server/am/ActivityTestsBase.java +++ b/services/tests/servicestests/src/com/android/server/am/ActivityTestsBase.java @@ -546,6 +546,11 @@ public class ActivityTestsBase { ActivityDisplay getDefaultDisplay() { return mDisplay; } + + @Override + void setWindowManager(WindowManagerService wm) { + mWindowManager = wm; + } } protected static class TestActivityDisplay extends ActivityDisplay { diff --git a/services/tests/servicestests/src/com/android/server/am/TaskRecordTests.java b/services/tests/servicestests/src/com/android/server/am/TaskRecordTests.java index fa8a09cc2b85..921cdea2e646 100644 --- a/services/tests/servicestests/src/com/android/server/am/TaskRecordTests.java +++ b/services/tests/servicestests/src/com/android/server/am/TaskRecordTests.java @@ -69,13 +69,13 @@ public class TaskRecordTests extends ActivityTestsBase { private static final String TASK_TAG = "task"; - private ActivityManagerService mService; + private ActivityTaskManagerService mService; @Before public void setUp() throws Exception { super.setUp(); TaskRecord.setTaskRecordFactory(null); - mService = createActivityManagerService(); + mService = createActivityTaskManagerService(); } @Test @@ -150,7 +150,7 @@ public class TaskRecordTests extends ActivityTestsBase { } private TaskRecord createTaskRecord(int taskId) { - return new TaskRecord(mService.mActivityTaskManager, taskId, new Intent(), null, null, null, + return new TaskRecord(mService, taskId, new Intent(), null, null, null, ActivityBuilder.getDefaultComponent(), null, false, false, false, 0, 10050, null, new ArrayList<>(), 0, false, null, 0, 0, 0, 0, 0, null, 0, false, false, false, 0, 0 ); |