diff options
5 files changed, 35 insertions, 47 deletions
diff --git a/services/core/java/com/android/server/wm/ActivityStarter.java b/services/core/java/com/android/server/wm/ActivityStarter.java index c6cece3d2b23..01f16fd1c0b9 100644 --- a/services/core/java/com/android/server/wm/ActivityStarter.java +++ b/services/core/java/com/android/server/wm/ActivityStarter.java @@ -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()) { diff --git a/services/core/java/com/android/server/wm/BackgroundLaunchProcessController.java b/services/core/java/com/android/server/wm/BackgroundLaunchProcessController.java index ab1ed67d4cf9..71a10df34d30 100644 --- a/services/core/java/com/android/server/wm/BackgroundLaunchProcessController.java +++ b/services/core/java/com/android/server/wm/BackgroundLaunchProcessController.java @@ -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) { @@ -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"); diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java index 1212302d40a5..81efbeb2398e 100644 --- a/services/core/java/com/android/server/wm/RootWindowContainer.java +++ b/services/core/java/com/android/server/wm/RootWindowContainer.java @@ -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; @@ -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) { @@ -2660,16 +2654,18 @@ class RootWindowContainer extends WindowContainer<DisplayContent> } void invalidateTaskLayers() { - mTaskLayersChanged = true; - mRankTaskLayersScheduler.scheduleIfNeeded(); + if (!mTaskLayersChanged) { + mTaskLayersChanged = true; + 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); } - mTaskLayersChanged = false; mTmpTaskLayerRank = 0; // Only rank for leaf tasks because the score of activity is based on immediate parent. forAllLeafTasks(task -> { @@ -3668,32 +3664,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(); - } - } - - abstract void execute(); - - void scheduleIfNeeded() { - if (!mScheduled) { - mService.mH.post(this); - mScheduled = true; + if (mTaskLayersChanged) { + mTaskLayersChanged = false; + rankTaskLayers(); + } } } } diff --git a/services/core/java/com/android/server/wm/WindowProcessController.java b/services/core/java/com/android/server/wm/WindowProcessController.java index c5e24a9df3a7..bac1ab1264ab 100644 --- a/services/core/java/com/android/server/wm/WindowProcessController.java +++ b/services/core/java/com/android/server/wm/WindowProcessController.java @@ -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; /** @@ -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; @@ -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); @@ -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; @@ -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) { @@ -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(); } diff --git a/services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java b/services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java index 171aa76032db..1b114c194bfb 100644 --- a/services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java @@ -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. @@ -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. @@ -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); |