diff options
| author | 2022-04-15 18:37:22 +0000 | |
|---|---|---|
| committer | 2022-04-15 18:37:22 +0000 | |
| commit | 9eaceb337ce16d5c4891d13d8ca4657ad007977e (patch) | |
| tree | ec9bed333652182ce2dd617dadcd213c38dd07d8 | |
| parent | 54fd12368942e9a37dd0c97bfdde785b48ac809f (diff) | |
| parent | 11ca5138aa5abbd0d97542251b6ad4ca63c7844e (diff) | |
Inform Application thread to block for network rules to be updated. am: 3bad67bf01 am: 11ca5138aa
Original change: https://android-review.googlesource.com/c/platform/frameworks/base/+/2062965
Change-Id: I4b5cf4f949dcf7ead902ba0f7968e5a34d454f14
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
4 files changed, 27 insertions, 9 deletions
diff --git a/core/java/android/app/ActivityManagerInternal.java b/core/java/android/app/ActivityManagerInternal.java index 45ed6f273068..7ec361922afc 100644 --- a/core/java/android/app/ActivityManagerInternal.java +++ b/core/java/android/app/ActivityManagerInternal.java @@ -587,7 +587,7 @@ public abstract class ActivityManagerInternal { * @param uid uid * @param pid pid of the ProcessRecord that is pending top. */ - public abstract void addPendingTopUid(int uid, int pid); + public abstract void addPendingTopUid(int uid, int pid, @Nullable IApplicationThread thread); /** * Delete uid from the 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 c6b4e67cb393..68ae021f04ef 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -16338,23 +16338,39 @@ public class ActivityManagerService extends IActivityManager.Stub } @Override - public void addPendingTopUid(int uid, int pid) { - mPendingStartActivityUids.add(uid, pid); + public void addPendingTopUid(int uid, int pid, @Nullable IApplicationThread thread) { + final boolean isNewPending = mPendingStartActivityUids.add(uid, pid); // We need to update the network rules for the app coming to the top state so that // it can access network when the device or the app is in a restricted state // (e.g. battery/data saver) but since waiting for updateOomAdj to complete and then // informing NetworkPolicyManager might get delayed, informing the state change as soon // as we know app is going to come to the top state. - if (mNetworkPolicyUidObserver != null) { + if (isNewPending && mNetworkPolicyUidObserver != null) { try { + final long procStateSeq = mProcessList.getNextProcStateSeq(); mNetworkPolicyUidObserver.onUidStateChanged(uid, PROCESS_STATE_TOP, - mProcessList.getNextProcStateSeq(), PROCESS_CAPABILITY_ALL); + procStateSeq, PROCESS_CAPABILITY_ALL); + if (thread != null && isNetworkingBlockedForUid(uid)) { + thread.setNetworkBlockSeq(procStateSeq); + } } catch (RemoteException e) { - // Should not happen; call is within the same process + Slog.d(TAG, "Error calling setNetworkBlockSeq", e); } } } + private boolean isNetworkingBlockedForUid(int uid) { + synchronized (mUidNetworkBlockedReasons) { + // TODO: We can consider only those blocked reasons that will be overridden + // by the TOP state. For other ones, there is no point in waiting. + // TODO: We can reuse this data in + // ProcessList#incrementProcStateSeqAndNotifyAppsLOSP instead of calling into + // NetworkManagementService. + return mUidNetworkBlockedReasons.get(uid, BLOCKED_REASON_NONE) + != BLOCKED_REASON_NONE; + } + } + @Override public void deletePendingTopUid(int uid, long nowElapsed) { mPendingStartActivityUids.delete(uid, nowElapsed); diff --git a/services/core/java/com/android/server/am/PendingStartActivityUids.java b/services/core/java/com/android/server/am/PendingStartActivityUids.java index 20f6bb205dc4..5beda3197581 100644 --- a/services/core/java/com/android/server/am/PendingStartActivityUids.java +++ b/services/core/java/com/android/server/am/PendingStartActivityUids.java @@ -44,10 +44,12 @@ final class PendingStartActivityUids { mContext = context; } - synchronized void add(int uid, int pid) { + synchronized boolean add(int uid, int pid) { if (mPendingUids.get(uid) == null) { mPendingUids.put(uid, new Pair<>(pid, SystemClock.elapsedRealtime())); + return true; } + return false; } synchronized void delete(int uid, long nowElapsed) { diff --git a/services/core/java/com/android/server/wm/WindowProcessController.java b/services/core/java/com/android/server/wm/WindowProcessController.java index 3ccb06ccef15..ab8527e7ec41 100644 --- a/services/core/java/com/android/server/wm/WindowProcessController.java +++ b/services/core/java/com/android/server/wm/WindowProcessController.java @@ -1123,7 +1123,7 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio /** Makes the process have top state before oom-adj is computed from a posted message. */ void addToPendingTop() { - mAtm.mAmInternal.addPendingTopUid(mUid, mPid); + mAtm.mAmInternal.addPendingTopUid(mUid, mPid, mThread); } void updateServiceConnectionActivities() { @@ -1176,7 +1176,7 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio } // update ActivityManagerService.PendingStartActivityUids list. if (topProcessState == ActivityManager.PROCESS_STATE_TOP) { - mAtm.mAmInternal.addPendingTopUid(mUid, mPid); + mAtm.mAmInternal.addPendingTopUid(mUid, mPid, mThread); } prepareOomAdjustment(); // Posting the message at the front of queue so WM lock isn't held when we call into AM, |