summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/wm/ActivityStarter.java1
-rw-r--r--services/core/java/com/android/server/wm/BackgroundLaunchProcessController.java9
-rw-r--r--services/core/java/com/android/server/wm/RootWindowContainer.java50
-rw-r--r--services/core/java/com/android/server/wm/WindowProcessController.java16
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java6
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);