Loading services/core/java/com/android/server/wm/ActivityStarter.java +1 −0 Original line number Diff line number Diff line Loading @@ -1429,6 +1429,7 @@ class ActivityStarter { + "; allowBackgroundActivityStart: " + allowBackgroundActivityStart + "; intent: " + intent + "; callerApp: " + callerApp + "; inVisibleTask: " + (callerApp != null && callerApp.hasActivityInVisibleTask()) + "]"); // log aborted activity start to TRON if (mService.isActivityStartsLoggingEnabled()) { Loading services/core/java/com/android/server/wm/BackgroundLaunchProcessController.java +5 −4 Original line number Diff line number Diff line Loading @@ -70,9 +70,10 @@ class BackgroundLaunchProcessController { } boolean areBackgroundActivityStartsAllowed(int pid, int uid, String packageName, boolean appSwitchAllowed, boolean isCheckingForFgsStart, boolean hasVisibleActivities, boolean hasBackgroundActivityStartPrivileges, long lastStopAppSwitchesTime, long lastActivityLaunchTime, long lastActivityFinishTime) { boolean appSwitchAllowed, boolean isCheckingForFgsStart, boolean hasActivityInVisibleTask, boolean hasBackgroundActivityStartPrivileges, long lastStopAppSwitchesTime, long lastActivityLaunchTime, long lastActivityFinishTime) { // If app switching is not allowed, we ignore all the start activity grace period // exception so apps cannot start itself in onPause() after pressing home button. if (appSwitchAllowed) { Loading Loading @@ -110,7 +111,7 @@ class BackgroundLaunchProcessController { return true; } // Allow if the caller has an activity in any foreground task. if (appSwitchAllowed && hasVisibleActivities) { if (appSwitchAllowed && hasActivityInVisibleTask) { if (DEBUG_ACTIVITY_STARTS) { Slog.d(TAG, "[Process(" + pid + ")] Activity start allowed: process has activity in foreground task"); Loading services/core/java/com/android/server/wm/RootWindowContainer.java +14 −36 Original line number Diff line number Diff line Loading @@ -273,7 +273,7 @@ class RootWindowContainer extends WindowContainer<DisplayContent> // Whether tasks have moved and we need to rank the tasks before next OOM scoring private boolean mTaskLayersChanged = true; private int mTmpTaskLayerRank; private final LockedScheduler mRankTaskLayersScheduler; private final RankTaskLayersRunnable mRankTaskLayersRunnable = new RankTaskLayersRunnable(); private boolean mTmpBoolean; private RemoteException mTmpRemoteException; Loading Loading @@ -451,12 +451,6 @@ class RootWindowContainer extends WindowContainer<DisplayContent> mTaskSupervisor = mService.mTaskSupervisor; mTaskSupervisor.mRootWindowContainer = this; mDisplayOffTokenAcquirer = mService.new SleepTokenAcquirerImpl("Display-off"); mRankTaskLayersScheduler = new LockedScheduler(mService) { @Override public void execute() { rankTaskLayersIfNeeded(); } }; } boolean updateFocusedWindowLocked(int mode, boolean updateInputWindows) { Loading Loading @@ -2660,16 +2654,18 @@ class RootWindowContainer extends WindowContainer<DisplayContent> } void invalidateTaskLayers() { if (!mTaskLayersChanged) { mTaskLayersChanged = true; mRankTaskLayersScheduler.scheduleIfNeeded(); mService.mH.post(mRankTaskLayersRunnable); } } /** Generate oom-score-adjustment rank for all tasks in the system based on z-order. */ void rankTaskLayersIfNeeded() { if (!mTaskLayersChanged) { return; } void rankTaskLayers() { if (mTaskLayersChanged) { mTaskLayersChanged = false; mService.mH.removeCallbacks(mRankTaskLayersRunnable); } mTmpTaskLayerRank = 0; // Only rank for leaf tasks because the score of activity is based on immediate parent. forAllLeafTasks(task -> { Loading Loading @@ -3669,32 +3665,14 @@ class RootWindowContainer extends WindowContainer<DisplayContent> } } /** * Helper class to schedule the runnable if it hasn't scheduled on display thread inside window * manager lock. */ abstract static class LockedScheduler implements Runnable { private final ActivityTaskManagerService mService; private boolean mScheduled; LockedScheduler(ActivityTaskManagerService service) { mService = service; } private class RankTaskLayersRunnable implements Runnable { @Override public void run() { synchronized (mService.mGlobalLock) { mScheduled = false; execute(); } if (mTaskLayersChanged) { mTaskLayersChanged = false; rankTaskLayers(); } abstract void execute(); void scheduleIfNeeded() { if (!mScheduled) { mService.mH.post(this); mScheduled = true; } } } Loading services/core/java/com/android/server/wm/WindowProcessController.java +12 −4 Original line number Diff line number Diff line Loading @@ -225,6 +225,7 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio private static final int ACTIVITY_STATE_FLAG_IS_STOPPING_FINISHING = 1 << 19; private static final int ACTIVITY_STATE_FLAG_IS_WINDOW_VISIBLE = 1 << 20; private static final int ACTIVITY_STATE_FLAG_HAS_RESUMED = 1 << 21; private static final int ACTIVITY_STATE_FLAG_HAS_ACTIVITY_IN_VISIBLE_TASK = 1 << 22; private static final int ACTIVITY_STATE_FLAG_MASK_MIN_TASK_LAYER = 0x0000ffff; /** Loading Loading @@ -479,7 +480,7 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio } void setLastActivityFinishTimeIfNeeded(long finishTime) { if (finishTime <= mLastActivityFinishTime || !hasVisibleActivities()) { if (finishTime <= mLastActivityFinishTime || !hasActivityInVisibleTask()) { return; } mLastActivityFinishTime = finishTime; Loading Loading @@ -516,7 +517,7 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio private boolean areBackgroundActivityStartsAllowed(boolean appSwitchAllowed, boolean isCheckingForFgsStart) { return mBgLaunchController.areBackgroundActivityStartsAllowed(mPid, mUid, mInfo.packageName, appSwitchAllowed, isCheckingForFgsStart, hasVisibleActivities(), appSwitchAllowed, isCheckingForFgsStart, hasActivityInVisibleTask(), mInstrumentingWithBackgroundActivityStartPrivileges, mAtm.getLastStopAppSwitchesTime(), mLastActivityLaunchTime, mLastActivityFinishTime); Loading Loading @@ -653,6 +654,10 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio return (mActivityStateFlags & ACTIVITY_STATE_FLAG_IS_VISIBLE) != 0; } boolean hasActivityInVisibleTask() { return (mActivityStateFlags & ACTIVITY_STATE_FLAG_HAS_ACTIVITY_IN_VISIBLE_TASK) != 0; } @HotPath(caller = HotPath.LRU_UPDATE) public boolean hasActivitiesOrRecentTasks() { return mHasActivities || mHasRecentTasks; Loading Loading @@ -996,11 +1001,14 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio if (r.isVisible()) { stateFlags |= ACTIVITY_STATE_FLAG_IS_WINDOW_VISIBLE; } final Task task = r.getTask(); if (task != null && task.mLayerRank != Task.LAYER_RANK_INVISIBLE) { stateFlags |= ACTIVITY_STATE_FLAG_HAS_ACTIVITY_IN_VISIBLE_TASK; } if (r.mVisibleRequested) { if (r.isState(RESUMED)) { stateFlags |= ACTIVITY_STATE_FLAG_HAS_RESUMED; } final Task task = r.getTask(); if (task != null && minTaskLayer > 0) { final int layer = task.mLayerRank; if (layer >= 0 && minTaskLayer > layer) { Loading Loading @@ -1048,7 +1056,7 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio /** Called when the process has some oom related changes and it is going to update oom-adj. */ private void prepareOomAdjustment() { mAtm.mRootWindowContainer.rankTaskLayersIfNeeded(); mAtm.mRootWindowContainer.rankTaskLayers(); mAtm.mTaskSupervisor.computeProcessActivityStateBatch(); } Loading services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java +3 −3 Original line number Diff line number Diff line Loading @@ -116,8 +116,7 @@ public class RootWindowContainerTests extends WindowTestsBase { final Task rootTask = new TaskBuilder(mSupervisor).build(); final Task task1 = new TaskBuilder(mSupervisor).setParentTask(rootTask).build(); new ActivityBuilder(mAtm).setTask(task1).build().mVisibleRequested = true; // RootWindowContainer#invalidateTaskLayers should post to update. waitHandlerIdle(mWm.mH); mWm.mRoot.rankTaskLayers(); assertEquals(1, task1.mLayerRank); // Only tasks that directly contain activities have a ranking. Loading @@ -125,7 +124,7 @@ public class RootWindowContainerTests extends WindowTestsBase { final Task task2 = new TaskBuilder(mSupervisor).build(); new ActivityBuilder(mAtm).setTask(task2).build().mVisibleRequested = true; waitHandlerIdle(mWm.mH); mWm.mRoot.rankTaskLayers(); // Note that ensureActivitiesVisible is disabled in SystemServicesTestRule, so both the // activities have the visible rank. Loading @@ -134,6 +133,7 @@ public class RootWindowContainerTests extends WindowTestsBase { assertEquals(1, task2.mLayerRank); task2.moveToBack("test", null /* task */); // RootWindowContainer#invalidateTaskLayers should post to update. waitHandlerIdle(mWm.mH); assertEquals(1, task1.mLayerRank); Loading Loading
services/core/java/com/android/server/wm/ActivityStarter.java +1 −0 Original line number Diff line number Diff line Loading @@ -1429,6 +1429,7 @@ class ActivityStarter { + "; allowBackgroundActivityStart: " + allowBackgroundActivityStart + "; intent: " + intent + "; callerApp: " + callerApp + "; inVisibleTask: " + (callerApp != null && callerApp.hasActivityInVisibleTask()) + "]"); // log aborted activity start to TRON if (mService.isActivityStartsLoggingEnabled()) { Loading
services/core/java/com/android/server/wm/BackgroundLaunchProcessController.java +5 −4 Original line number Diff line number Diff line Loading @@ -70,9 +70,10 @@ class BackgroundLaunchProcessController { } boolean areBackgroundActivityStartsAllowed(int pid, int uid, String packageName, boolean appSwitchAllowed, boolean isCheckingForFgsStart, boolean hasVisibleActivities, boolean hasBackgroundActivityStartPrivileges, long lastStopAppSwitchesTime, long lastActivityLaunchTime, long lastActivityFinishTime) { boolean appSwitchAllowed, boolean isCheckingForFgsStart, boolean hasActivityInVisibleTask, boolean hasBackgroundActivityStartPrivileges, long lastStopAppSwitchesTime, long lastActivityLaunchTime, long lastActivityFinishTime) { // If app switching is not allowed, we ignore all the start activity grace period // exception so apps cannot start itself in onPause() after pressing home button. if (appSwitchAllowed) { Loading Loading @@ -110,7 +111,7 @@ class BackgroundLaunchProcessController { return true; } // Allow if the caller has an activity in any foreground task. if (appSwitchAllowed && hasVisibleActivities) { if (appSwitchAllowed && hasActivityInVisibleTask) { if (DEBUG_ACTIVITY_STARTS) { Slog.d(TAG, "[Process(" + pid + ")] Activity start allowed: process has activity in foreground task"); Loading
services/core/java/com/android/server/wm/RootWindowContainer.java +14 −36 Original line number Diff line number Diff line Loading @@ -273,7 +273,7 @@ class RootWindowContainer extends WindowContainer<DisplayContent> // Whether tasks have moved and we need to rank the tasks before next OOM scoring private boolean mTaskLayersChanged = true; private int mTmpTaskLayerRank; private final LockedScheduler mRankTaskLayersScheduler; private final RankTaskLayersRunnable mRankTaskLayersRunnable = new RankTaskLayersRunnable(); private boolean mTmpBoolean; private RemoteException mTmpRemoteException; Loading Loading @@ -451,12 +451,6 @@ class RootWindowContainer extends WindowContainer<DisplayContent> mTaskSupervisor = mService.mTaskSupervisor; mTaskSupervisor.mRootWindowContainer = this; mDisplayOffTokenAcquirer = mService.new SleepTokenAcquirerImpl("Display-off"); mRankTaskLayersScheduler = new LockedScheduler(mService) { @Override public void execute() { rankTaskLayersIfNeeded(); } }; } boolean updateFocusedWindowLocked(int mode, boolean updateInputWindows) { Loading Loading @@ -2660,16 +2654,18 @@ class RootWindowContainer extends WindowContainer<DisplayContent> } void invalidateTaskLayers() { if (!mTaskLayersChanged) { mTaskLayersChanged = true; mRankTaskLayersScheduler.scheduleIfNeeded(); mService.mH.post(mRankTaskLayersRunnable); } } /** Generate oom-score-adjustment rank for all tasks in the system based on z-order. */ void rankTaskLayersIfNeeded() { if (!mTaskLayersChanged) { return; } void rankTaskLayers() { if (mTaskLayersChanged) { mTaskLayersChanged = false; mService.mH.removeCallbacks(mRankTaskLayersRunnable); } mTmpTaskLayerRank = 0; // Only rank for leaf tasks because the score of activity is based on immediate parent. forAllLeafTasks(task -> { Loading Loading @@ -3669,32 +3665,14 @@ class RootWindowContainer extends WindowContainer<DisplayContent> } } /** * Helper class to schedule the runnable if it hasn't scheduled on display thread inside window * manager lock. */ abstract static class LockedScheduler implements Runnable { private final ActivityTaskManagerService mService; private boolean mScheduled; LockedScheduler(ActivityTaskManagerService service) { mService = service; } private class RankTaskLayersRunnable implements Runnable { @Override public void run() { synchronized (mService.mGlobalLock) { mScheduled = false; execute(); } if (mTaskLayersChanged) { mTaskLayersChanged = false; rankTaskLayers(); } abstract void execute(); void scheduleIfNeeded() { if (!mScheduled) { mService.mH.post(this); mScheduled = true; } } } Loading
services/core/java/com/android/server/wm/WindowProcessController.java +12 −4 Original line number Diff line number Diff line Loading @@ -225,6 +225,7 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio private static final int ACTIVITY_STATE_FLAG_IS_STOPPING_FINISHING = 1 << 19; private static final int ACTIVITY_STATE_FLAG_IS_WINDOW_VISIBLE = 1 << 20; private static final int ACTIVITY_STATE_FLAG_HAS_RESUMED = 1 << 21; private static final int ACTIVITY_STATE_FLAG_HAS_ACTIVITY_IN_VISIBLE_TASK = 1 << 22; private static final int ACTIVITY_STATE_FLAG_MASK_MIN_TASK_LAYER = 0x0000ffff; /** Loading Loading @@ -479,7 +480,7 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio } void setLastActivityFinishTimeIfNeeded(long finishTime) { if (finishTime <= mLastActivityFinishTime || !hasVisibleActivities()) { if (finishTime <= mLastActivityFinishTime || !hasActivityInVisibleTask()) { return; } mLastActivityFinishTime = finishTime; Loading Loading @@ -516,7 +517,7 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio private boolean areBackgroundActivityStartsAllowed(boolean appSwitchAllowed, boolean isCheckingForFgsStart) { return mBgLaunchController.areBackgroundActivityStartsAllowed(mPid, mUid, mInfo.packageName, appSwitchAllowed, isCheckingForFgsStart, hasVisibleActivities(), appSwitchAllowed, isCheckingForFgsStart, hasActivityInVisibleTask(), mInstrumentingWithBackgroundActivityStartPrivileges, mAtm.getLastStopAppSwitchesTime(), mLastActivityLaunchTime, mLastActivityFinishTime); Loading Loading @@ -653,6 +654,10 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio return (mActivityStateFlags & ACTIVITY_STATE_FLAG_IS_VISIBLE) != 0; } boolean hasActivityInVisibleTask() { return (mActivityStateFlags & ACTIVITY_STATE_FLAG_HAS_ACTIVITY_IN_VISIBLE_TASK) != 0; } @HotPath(caller = HotPath.LRU_UPDATE) public boolean hasActivitiesOrRecentTasks() { return mHasActivities || mHasRecentTasks; Loading Loading @@ -996,11 +1001,14 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio if (r.isVisible()) { stateFlags |= ACTIVITY_STATE_FLAG_IS_WINDOW_VISIBLE; } final Task task = r.getTask(); if (task != null && task.mLayerRank != Task.LAYER_RANK_INVISIBLE) { stateFlags |= ACTIVITY_STATE_FLAG_HAS_ACTIVITY_IN_VISIBLE_TASK; } if (r.mVisibleRequested) { if (r.isState(RESUMED)) { stateFlags |= ACTIVITY_STATE_FLAG_HAS_RESUMED; } final Task task = r.getTask(); if (task != null && minTaskLayer > 0) { final int layer = task.mLayerRank; if (layer >= 0 && minTaskLayer > layer) { Loading Loading @@ -1048,7 +1056,7 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio /** Called when the process has some oom related changes and it is going to update oom-adj. */ private void prepareOomAdjustment() { mAtm.mRootWindowContainer.rankTaskLayersIfNeeded(); mAtm.mRootWindowContainer.rankTaskLayers(); mAtm.mTaskSupervisor.computeProcessActivityStateBatch(); } Loading
services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java +3 −3 Original line number Diff line number Diff line Loading @@ -116,8 +116,7 @@ public class RootWindowContainerTests extends WindowTestsBase { final Task rootTask = new TaskBuilder(mSupervisor).build(); final Task task1 = new TaskBuilder(mSupervisor).setParentTask(rootTask).build(); new ActivityBuilder(mAtm).setTask(task1).build().mVisibleRequested = true; // RootWindowContainer#invalidateTaskLayers should post to update. waitHandlerIdle(mWm.mH); mWm.mRoot.rankTaskLayers(); assertEquals(1, task1.mLayerRank); // Only tasks that directly contain activities have a ranking. Loading @@ -125,7 +124,7 @@ public class RootWindowContainerTests extends WindowTestsBase { final Task task2 = new TaskBuilder(mSupervisor).build(); new ActivityBuilder(mAtm).setTask(task2).build().mVisibleRequested = true; waitHandlerIdle(mWm.mH); mWm.mRoot.rankTaskLayers(); // Note that ensureActivitiesVisible is disabled in SystemServicesTestRule, so both the // activities have the visible rank. Loading @@ -134,6 +133,7 @@ public class RootWindowContainerTests extends WindowTestsBase { assertEquals(1, task2.mLayerRank); task2.moveToBack("test", null /* task */); // RootWindowContainer#invalidateTaskLayers should post to update. waitHandlerIdle(mWm.mH); assertEquals(1, task1.mLayerRank); Loading