From 2da542d3685d9e4971823ef1b6b9c38479da6506 Mon Sep 17 00:00:00 2001 From: huang chaopeng Date: Tue, 22 Mar 2022 15:50:59 +0800 Subject: [PATCH] [Bugfix] Don't delete mPendingUids if PendingTopPid is added later than updateOomAdj started Analysis: 1.Doing updateOomAdjInnerLSP in backgroud, and it would last for a long time 2.Now start a new Activity, windowManager save the latest topUid into PendingStartActivityUids 3.updateOomAdj task in step.1 done, and then delete all uids in PendingStartActivityUids 4.The topApp will be rejected by AppOps due to the deleting in step.3 Signed-off-by: huang chaopeng Change-Id: I52c7c2a8d6cb86b27b1f008cb56f670ce7698dc9 --- core/java/android/app/ActivityManagerInternal.java | 3 ++- .../com/android/server/am/ActivityManagerService.java | 4 ++-- .../core/java/com/android/server/am/OomAdjuster.java | 2 +- .../android/server/am/PendingStartActivityUids.java | 10 ++++++++-- .../android/server/wm/ActivityTaskSupervisorTests.java | 2 +- 5 files changed, 14 insertions(+), 7 deletions(-) diff --git a/core/java/android/app/ActivityManagerInternal.java b/core/java/android/app/ActivityManagerInternal.java index 7be4c3e1465b8..4c30f56e40d67 100644 --- a/core/java/android/app/ActivityManagerInternal.java +++ b/core/java/android/app/ActivityManagerInternal.java @@ -586,8 +586,9 @@ public abstract class ActivityManagerInternal { /** * Delete uid from the ActivityManagerService PendingStartActivityUids list. * @param uid uid + * @param nowElapsed starting time of updateOomAdj */ - public abstract void deletePendingTopUid(int uid); + public abstract void deletePendingTopUid(int uid, long nowElapsed); /** * Is the uid in ActivityManagerService PendingStartActivityUids list? diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index f978b2b68e481..0f450e16be2d6 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -16306,8 +16306,8 @@ public class ActivityManagerService extends IActivityManager.Stub } @Override - public void deletePendingTopUid(int uid) { - mPendingStartActivityUids.delete(uid); + public void deletePendingTopUid(int uid, long nowElapsed) { + mPendingStartActivityUids.delete(uid, nowElapsed); } @Override diff --git a/services/core/java/com/android/server/am/OomAdjuster.java b/services/core/java/com/android/server/am/OomAdjuster.java index 96ea6db0c3f5d..9e0441004568d 100644 --- a/services/core/java/com/android/server/am/OomAdjuster.java +++ b/services/core/java/com/android/server/am/OomAdjuster.java @@ -1378,7 +1378,7 @@ public class OomAdjuster { mService.mServices.foregroundServiceProcStateChangedLocked(uidRec); } } - mService.mInternal.deletePendingTopUid(uidRec.getUid()); + mService.mInternal.deletePendingTopUid(uidRec.getUid(), nowElapsed); } if (mLocalPowerManager != null) { mLocalPowerManager.finishUidChanges(); diff --git a/services/core/java/com/android/server/am/PendingStartActivityUids.java b/services/core/java/com/android/server/am/PendingStartActivityUids.java index 6bf9d4e5c3f0f..20f6bb205dc4e 100644 --- a/services/core/java/com/android/server/am/PendingStartActivityUids.java +++ b/services/core/java/com/android/server/am/PendingStartActivityUids.java @@ -50,9 +50,15 @@ final class PendingStartActivityUids { } } - synchronized void delete(int uid) { + synchronized void delete(int uid, long nowElapsed) { final Pair pendingPid = mPendingUids.get(uid); if (pendingPid != null) { + if (nowElapsed < pendingPid.second) { + Slog.i(TAG, + "updateOomAdj start time is before than pendingPid added," + + " don't delete it"); + return; + } final long delay = SystemClock.elapsedRealtime() - pendingPid.second; if (delay >= 1000 /*ms*/) { Slog.i(TAG, @@ -75,4 +81,4 @@ final class PendingStartActivityUids { synchronized boolean isPendingTopUid(int uid) { return mPendingUids.get(uid) != null; } -} \ No newline at end of file +} diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityTaskSupervisorTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityTaskSupervisorTests.java index 66da2a6318685..716612c70aefd 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityTaskSupervisorTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityTaskSupervisorTests.java @@ -284,7 +284,7 @@ public class ActivityTaskSupervisorTests extends WindowTestsBase { .setCreateActivity(true).build().getTopMostActivity(); activity2.getTask().setResumedActivity(activity2, "test"); - mAtm.mAmInternal.deletePendingTopUid(activity1.getUid()); + mAtm.mAmInternal.deletePendingTopUid(activity1.getUid(), Long.MAX_VALUE); clearInvocations(mAtm); activity1.moveFocusableActivityToTop("test"); assertTrue(mAtm.mAmInternal.isPendingTopUid(activity1.getUid()));