summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Sudheer Shanka <sudheersai@google.com> 2022-04-15 18:37:22 +0000
committer Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> 2022-04-15 18:37:22 +0000
commit9eaceb337ce16d5c4891d13d8ca4657ad007977e (patch)
treeec9bed333652182ce2dd617dadcd213c38dd07d8
parent54fd12368942e9a37dd0c97bfdde785b48ac809f (diff)
parent11ca5138aa5abbd0d97542251b6ad4ca63c7844e (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>
-rw-r--r--core/java/android/app/ActivityManagerInternal.java2
-rw-r--r--services/core/java/com/android/server/am/ActivityManagerService.java26
-rw-r--r--services/core/java/com/android/server/am/PendingStartActivityUids.java4
-rw-r--r--services/core/java/com/android/server/wm/WindowProcessController.java4
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,