Loading services/core/java/com/android/server/am/ActivityManagerService.java +27 −19 Original line number Diff line number Diff line Loading @@ -17311,6 +17311,12 @@ public class ActivityManagerService extends IActivityManager.Stub } } void onProcessFreezableChangedLocked(ProcessRecord app) { if (mEnableModernQueue) { mBroadcastQueues[0].onProcessFreezableChangedLocked(app); } } @VisibleForTesting public final class LocalService extends ActivityManagerInternal implements ActivityManagerLocal { Loading Loading @@ -19022,6 +19028,7 @@ public class ActivityManagerService extends IActivityManager.Stub // too quickly in parallel below pingCount.incrementAndGet(); synchronized (ActivityManagerService.this) { synchronized (mProcLock) { final ArrayMap<String, SparseArray<ProcessRecord>> pmap = mProcessList.getProcessNamesLOSP().getMap(); Loading @@ -19046,6 +19053,7 @@ public class ActivityManagerService extends IActivityManager.Stub } } } } // Now that we've dispatched all "ping" events above, we can send our // "pong" sentinel value services/core/java/com/android/server/am/BroadcastProcessQueue.java +12 −12 Original line number Diff line number Diff line Loading @@ -208,7 +208,7 @@ class BroadcastProcessQueue { private boolean mLastDeferredStates; private boolean mUidForeground; private boolean mUidCached; private boolean mProcessFreezable; private boolean mProcessInstrumented; private boolean mProcessPersistent; Loading Loading @@ -440,7 +440,7 @@ class BroadcastProcessQueue { */ @CheckResult public boolean setProcessAndUidState(@Nullable ProcessRecord app, boolean uidForeground, boolean uidCached) { boolean processFreezable) { this.app = app; // Since we may have just changed our PID, invalidate cached strings Loading @@ -449,13 +449,13 @@ class BroadcastProcessQueue { boolean didSomething = false; if (app != null) { didSomething |= setUidCached(uidCached); didSomething |= setUidForeground(uidForeground); didSomething |= setProcessFreezable(processFreezable); didSomething |= setProcessInstrumented(app.getActiveInstrumentation() != null); didSomething |= setProcessPersistent(app.isPersistent()); } else { didSomething |= setUidCached(uidCached); didSomething |= setUidForeground(false); didSomething |= setProcessFreezable(false); didSomething |= setProcessInstrumented(false); didSomething |= setProcessPersistent(false); } Loading @@ -479,13 +479,13 @@ class BroadcastProcessQueue { } /** * Update if this process is in the "cached" state, typically signaling that * Update if this process is in the "freezable" state, typically signaling that * broadcast dispatch should be paused or delayed. */ @CheckResult private boolean setUidCached(boolean uidCached) { if (mUidCached != uidCached) { mUidCached = uidCached; private boolean setProcessFreezable(boolean freezable) { if (mProcessFreezable != freezable) { mProcessFreezable = freezable; invalidateRunnableAt(); return true; } else { Loading Loading @@ -1150,7 +1150,7 @@ class BroadcastProcessQueue { } else if (mCountManifest > 0) { mRunnableAt = runnableAt; mRunnableAtReason = REASON_CONTAINS_MANIFEST; } else if (mUidCached) { } else if (mProcessFreezable) { if (r.deferUntilActive) { // All enqueued broadcasts are deferrable, defer if (mCountDeferred == mCountEnqueued) { Loading Loading @@ -1220,7 +1220,7 @@ class BroadcastProcessQueue { // When all we have pending is deferred broadcasts, and we're cached, // then we want everything to be marked deferred final boolean wantDeferredStates = (mCountDeferred > 0) && (mCountDeferred == mCountEnqueued) && mUidCached; && (mCountDeferred == mCountEnqueued) && mProcessFreezable; if (mLastDeferredStates != wantDeferredStates) { mLastDeferredStates = wantDeferredStates; Loading Loading @@ -1407,9 +1407,9 @@ class BroadcastProcessQueue { if (mUidForeground) { sb.append("FG"); } if (mUidCached) { if (mProcessFreezable) { if (sb.length() > 0) sb.append("|"); sb.append("CACHED"); sb.append("FRZ"); } if (mProcessInstrumented) { if (sb.length() > 0) sb.append("|"); Loading services/core/java/com/android/server/am/BroadcastQueue.java +7 −0 Original line number Diff line number Diff line Loading @@ -173,6 +173,13 @@ public abstract class BroadcastQueue { @GuardedBy("mService") public abstract void onApplicationCleanupLocked(@NonNull ProcessRecord app); /** * Signal from OS internals that the given process is in a freezable state and will be * frozen soon after. */ @GuardedBy("mService") public abstract void onProcessFreezableChangedLocked(@NonNull ProcessRecord app); /** * Signal from OS internals that the given package (or some subset of that * package) has been disabled or uninstalled, and that any pending Loading services/core/java/com/android/server/am/BroadcastQueueImpl.java +4 −0 Original line number Diff line number Diff line Loading @@ -466,6 +466,10 @@ public class BroadcastQueueImpl extends BroadcastQueue { skipCurrentOrPendingReceiverLocked(app); } public void onProcessFreezableChangedLocked(ProcessRecord app) { // Not supported; ignore } public boolean sendPendingBroadcastsLocked(ProcessRecord app) throws BroadcastDeliveryFailedException { boolean didSomething = false; Loading services/core/java/com/android/server/am/BroadcastQueueModernImpl.java +41 −38 Original line number Diff line number Diff line Loading @@ -232,16 +232,6 @@ class BroadcastQueueModernImpl extends BroadcastQueue { @GuardedBy("mService") private final SparseBooleanArray mUidForeground = new SparseBooleanArray(); /** * Map from UID to its last known "cached" state. * <p> * We manually maintain this data structure since the lifecycle of * {@link ProcessRecord} and {@link BroadcastProcessQueue} can be * mismatched. */ @GuardedBy("mService") private final SparseBooleanArray mUidCached = new SparseBooleanArray(); private final BroadcastConstants mConstants; private final BroadcastConstants mFgConstants; private final BroadcastConstants mBgConstants; Loading @@ -258,6 +248,7 @@ class BroadcastQueueModernImpl extends BroadcastQueue { private static final int MSG_BG_ACTIVITY_START_TIMEOUT = 4; private static final int MSG_CHECK_HEALTH = 5; private static final int MSG_CHECK_PENDING_COLD_START_VALIDITY = 6; private static final int MSG_PROCESS_FREEZABLE_CHANGED = 7; private void enqueueUpdateRunningList() { mLocalHandler.removeMessages(MSG_UPDATE_RUNNING_LIST); Loading Loading @@ -298,6 +289,12 @@ class BroadcastQueueModernImpl extends BroadcastQueue { checkPendingColdStartValidity(); return true; } case MSG_PROCESS_FREEZABLE_CHANGED: { synchronized (mService) { refreshProcessQueueLocked((ProcessRecord) msg.obj); } return true; } } return false; }; Loading Loading @@ -672,6 +669,12 @@ class BroadcastQueueModernImpl extends BroadcastQueue { enqueueUpdateRunningList(); } @Override public void onProcessFreezableChangedLocked(@NonNull ProcessRecord app) { mLocalHandler.removeMessages(MSG_PROCESS_FREEZABLE_CHANGED, app); mLocalHandler.sendMessage(mHandler.obtainMessage(MSG_PROCESS_FREEZABLE_CHANGED, app)); } @Override public int getPreferredSchedulingGroupLocked(@NonNull ProcessRecord app) { final BroadcastProcessQueue queue = getProcessQueue(app); Loading Loading @@ -1465,7 +1468,6 @@ class BroadcastQueueModernImpl extends BroadcastQueue { }; broadcastPredicate = BROADCAST_PREDICATE_ANY; cleanupUserStateLocked(mUidCached, userId); cleanupUserStateLocked(mUidForeground, userId); } return forEachMatchingBroadcast(queuePredicate, broadcastPredicate, Loading Loading @@ -1611,22 +1613,6 @@ class BroadcastQueueModernImpl extends BroadcastQueue { }, ActivityManager.UID_OBSERVER_PROCSTATE, ActivityManager.PROCESS_STATE_TOP, "android"); mService.registerUidObserver(new UidObserver() { @Override public void onUidStateChanged(int uid, int procState, long procStateSeq, int capability) { synchronized (mService) { if (procState > ActivityManager.PROCESS_STATE_LAST_ACTIVITY) { mUidCached.put(uid, true); } else { mUidCached.delete(uid); } refreshProcessQueuesLocked(uid); } } }, ActivityManager.UID_OBSERVER_PROCSTATE, ActivityManager.PROCESS_STATE_LAST_ACTIVITY, "android"); // Kick off periodic health checks mLocalHandler.sendEmptyMessage(MSG_CHECK_HEALTH); } Loading Loading @@ -1814,10 +1800,9 @@ class BroadcastQueueModernImpl extends BroadcastQueue { // warm via this operation, we're going to immediately promote it to // be running, and any side effect of this operation will then apply // after it's finished and is returned to the runnable list. queue.setProcessAndUidState( mService.getProcessRecordLocked(queue.processName, queue.uid), mUidForeground.get(queue.uid, false), mUidCached.get(queue.uid, false)); final ProcessRecord app = mService.getProcessRecordLocked(queue.processName, queue.uid); queue.setProcessAndUidState(app, mUidForeground.get(queue.uid, false), isProcessFreezable(app)); } } Loading @@ -1829,11 +1814,21 @@ class BroadcastQueueModernImpl extends BroadcastQueue { private void setQueueProcess(@NonNull BroadcastProcessQueue queue, @Nullable ProcessRecord app) { if (queue.setProcessAndUidState(app, mUidForeground.get(queue.uid, false), mUidCached.get(queue.uid, false))) { isProcessFreezable(app))) { updateRunnableList(queue); } } @GuardedBy("mService") private boolean isProcessFreezable(@Nullable ProcessRecord app) { if (app == null) { return false; } synchronized (mService.mProcLock) { return app.mOptRecord.isPendingFreeze() || app.mOptRecord.isFrozen(); } } /** * Refresh the process queues with the latest process state so that runnableAt * can be updated. Loading @@ -1850,6 +1845,20 @@ class BroadcastQueueModernImpl extends BroadcastQueue { enqueueUpdateRunningList(); } /** * Refresh the process queue corresponding to {@code app} with the latest process state * so that runnableAt can be updated. */ @GuardedBy("mService") private void refreshProcessQueueLocked(@NonNull ProcessRecord app) { final BroadcastProcessQueue queue = getProcessQueue(app.processName, app.uid); if (queue == null || queue.app == null || queue.app.getPid() != app.getPid()) { return; } setQueueProcess(queue, queue.app); enqueueUpdateRunningList(); } /** * Inform other parts of OS that the given broadcast queue has started * running, typically for internal bookkeeping. Loading Loading @@ -2176,12 +2185,6 @@ class BroadcastQueueModernImpl extends BroadcastQueue { ipw.decreaseIndent(); ipw.println(); ipw.println("Cached UIDs:"); ipw.increaseIndent(); ipw.println(mUidCached); ipw.decreaseIndent(); ipw.println(); ipw.println("Foreground UIDs:"); ipw.increaseIndent(); ipw.println(mUidForeground); Loading Loading
services/core/java/com/android/server/am/ActivityManagerService.java +27 −19 Original line number Diff line number Diff line Loading @@ -17311,6 +17311,12 @@ public class ActivityManagerService extends IActivityManager.Stub } } void onProcessFreezableChangedLocked(ProcessRecord app) { if (mEnableModernQueue) { mBroadcastQueues[0].onProcessFreezableChangedLocked(app); } } @VisibleForTesting public final class LocalService extends ActivityManagerInternal implements ActivityManagerLocal { Loading Loading @@ -19022,6 +19028,7 @@ public class ActivityManagerService extends IActivityManager.Stub // too quickly in parallel below pingCount.incrementAndGet(); synchronized (ActivityManagerService.this) { synchronized (mProcLock) { final ArrayMap<String, SparseArray<ProcessRecord>> pmap = mProcessList.getProcessNamesLOSP().getMap(); Loading @@ -19046,6 +19053,7 @@ public class ActivityManagerService extends IActivityManager.Stub } } } } // Now that we've dispatched all "ping" events above, we can send our // "pong" sentinel value
services/core/java/com/android/server/am/BroadcastProcessQueue.java +12 −12 Original line number Diff line number Diff line Loading @@ -208,7 +208,7 @@ class BroadcastProcessQueue { private boolean mLastDeferredStates; private boolean mUidForeground; private boolean mUidCached; private boolean mProcessFreezable; private boolean mProcessInstrumented; private boolean mProcessPersistent; Loading Loading @@ -440,7 +440,7 @@ class BroadcastProcessQueue { */ @CheckResult public boolean setProcessAndUidState(@Nullable ProcessRecord app, boolean uidForeground, boolean uidCached) { boolean processFreezable) { this.app = app; // Since we may have just changed our PID, invalidate cached strings Loading @@ -449,13 +449,13 @@ class BroadcastProcessQueue { boolean didSomething = false; if (app != null) { didSomething |= setUidCached(uidCached); didSomething |= setUidForeground(uidForeground); didSomething |= setProcessFreezable(processFreezable); didSomething |= setProcessInstrumented(app.getActiveInstrumentation() != null); didSomething |= setProcessPersistent(app.isPersistent()); } else { didSomething |= setUidCached(uidCached); didSomething |= setUidForeground(false); didSomething |= setProcessFreezable(false); didSomething |= setProcessInstrumented(false); didSomething |= setProcessPersistent(false); } Loading @@ -479,13 +479,13 @@ class BroadcastProcessQueue { } /** * Update if this process is in the "cached" state, typically signaling that * Update if this process is in the "freezable" state, typically signaling that * broadcast dispatch should be paused or delayed. */ @CheckResult private boolean setUidCached(boolean uidCached) { if (mUidCached != uidCached) { mUidCached = uidCached; private boolean setProcessFreezable(boolean freezable) { if (mProcessFreezable != freezable) { mProcessFreezable = freezable; invalidateRunnableAt(); return true; } else { Loading Loading @@ -1150,7 +1150,7 @@ class BroadcastProcessQueue { } else if (mCountManifest > 0) { mRunnableAt = runnableAt; mRunnableAtReason = REASON_CONTAINS_MANIFEST; } else if (mUidCached) { } else if (mProcessFreezable) { if (r.deferUntilActive) { // All enqueued broadcasts are deferrable, defer if (mCountDeferred == mCountEnqueued) { Loading Loading @@ -1220,7 +1220,7 @@ class BroadcastProcessQueue { // When all we have pending is deferred broadcasts, and we're cached, // then we want everything to be marked deferred final boolean wantDeferredStates = (mCountDeferred > 0) && (mCountDeferred == mCountEnqueued) && mUidCached; && (mCountDeferred == mCountEnqueued) && mProcessFreezable; if (mLastDeferredStates != wantDeferredStates) { mLastDeferredStates = wantDeferredStates; Loading Loading @@ -1407,9 +1407,9 @@ class BroadcastProcessQueue { if (mUidForeground) { sb.append("FG"); } if (mUidCached) { if (mProcessFreezable) { if (sb.length() > 0) sb.append("|"); sb.append("CACHED"); sb.append("FRZ"); } if (mProcessInstrumented) { if (sb.length() > 0) sb.append("|"); Loading
services/core/java/com/android/server/am/BroadcastQueue.java +7 −0 Original line number Diff line number Diff line Loading @@ -173,6 +173,13 @@ public abstract class BroadcastQueue { @GuardedBy("mService") public abstract void onApplicationCleanupLocked(@NonNull ProcessRecord app); /** * Signal from OS internals that the given process is in a freezable state and will be * frozen soon after. */ @GuardedBy("mService") public abstract void onProcessFreezableChangedLocked(@NonNull ProcessRecord app); /** * Signal from OS internals that the given package (or some subset of that * package) has been disabled or uninstalled, and that any pending Loading
services/core/java/com/android/server/am/BroadcastQueueImpl.java +4 −0 Original line number Diff line number Diff line Loading @@ -466,6 +466,10 @@ public class BroadcastQueueImpl extends BroadcastQueue { skipCurrentOrPendingReceiverLocked(app); } public void onProcessFreezableChangedLocked(ProcessRecord app) { // Not supported; ignore } public boolean sendPendingBroadcastsLocked(ProcessRecord app) throws BroadcastDeliveryFailedException { boolean didSomething = false; Loading
services/core/java/com/android/server/am/BroadcastQueueModernImpl.java +41 −38 Original line number Diff line number Diff line Loading @@ -232,16 +232,6 @@ class BroadcastQueueModernImpl extends BroadcastQueue { @GuardedBy("mService") private final SparseBooleanArray mUidForeground = new SparseBooleanArray(); /** * Map from UID to its last known "cached" state. * <p> * We manually maintain this data structure since the lifecycle of * {@link ProcessRecord} and {@link BroadcastProcessQueue} can be * mismatched. */ @GuardedBy("mService") private final SparseBooleanArray mUidCached = new SparseBooleanArray(); private final BroadcastConstants mConstants; private final BroadcastConstants mFgConstants; private final BroadcastConstants mBgConstants; Loading @@ -258,6 +248,7 @@ class BroadcastQueueModernImpl extends BroadcastQueue { private static final int MSG_BG_ACTIVITY_START_TIMEOUT = 4; private static final int MSG_CHECK_HEALTH = 5; private static final int MSG_CHECK_PENDING_COLD_START_VALIDITY = 6; private static final int MSG_PROCESS_FREEZABLE_CHANGED = 7; private void enqueueUpdateRunningList() { mLocalHandler.removeMessages(MSG_UPDATE_RUNNING_LIST); Loading Loading @@ -298,6 +289,12 @@ class BroadcastQueueModernImpl extends BroadcastQueue { checkPendingColdStartValidity(); return true; } case MSG_PROCESS_FREEZABLE_CHANGED: { synchronized (mService) { refreshProcessQueueLocked((ProcessRecord) msg.obj); } return true; } } return false; }; Loading Loading @@ -672,6 +669,12 @@ class BroadcastQueueModernImpl extends BroadcastQueue { enqueueUpdateRunningList(); } @Override public void onProcessFreezableChangedLocked(@NonNull ProcessRecord app) { mLocalHandler.removeMessages(MSG_PROCESS_FREEZABLE_CHANGED, app); mLocalHandler.sendMessage(mHandler.obtainMessage(MSG_PROCESS_FREEZABLE_CHANGED, app)); } @Override public int getPreferredSchedulingGroupLocked(@NonNull ProcessRecord app) { final BroadcastProcessQueue queue = getProcessQueue(app); Loading Loading @@ -1465,7 +1468,6 @@ class BroadcastQueueModernImpl extends BroadcastQueue { }; broadcastPredicate = BROADCAST_PREDICATE_ANY; cleanupUserStateLocked(mUidCached, userId); cleanupUserStateLocked(mUidForeground, userId); } return forEachMatchingBroadcast(queuePredicate, broadcastPredicate, Loading Loading @@ -1611,22 +1613,6 @@ class BroadcastQueueModernImpl extends BroadcastQueue { }, ActivityManager.UID_OBSERVER_PROCSTATE, ActivityManager.PROCESS_STATE_TOP, "android"); mService.registerUidObserver(new UidObserver() { @Override public void onUidStateChanged(int uid, int procState, long procStateSeq, int capability) { synchronized (mService) { if (procState > ActivityManager.PROCESS_STATE_LAST_ACTIVITY) { mUidCached.put(uid, true); } else { mUidCached.delete(uid); } refreshProcessQueuesLocked(uid); } } }, ActivityManager.UID_OBSERVER_PROCSTATE, ActivityManager.PROCESS_STATE_LAST_ACTIVITY, "android"); // Kick off periodic health checks mLocalHandler.sendEmptyMessage(MSG_CHECK_HEALTH); } Loading Loading @@ -1814,10 +1800,9 @@ class BroadcastQueueModernImpl extends BroadcastQueue { // warm via this operation, we're going to immediately promote it to // be running, and any side effect of this operation will then apply // after it's finished and is returned to the runnable list. queue.setProcessAndUidState( mService.getProcessRecordLocked(queue.processName, queue.uid), mUidForeground.get(queue.uid, false), mUidCached.get(queue.uid, false)); final ProcessRecord app = mService.getProcessRecordLocked(queue.processName, queue.uid); queue.setProcessAndUidState(app, mUidForeground.get(queue.uid, false), isProcessFreezable(app)); } } Loading @@ -1829,11 +1814,21 @@ class BroadcastQueueModernImpl extends BroadcastQueue { private void setQueueProcess(@NonNull BroadcastProcessQueue queue, @Nullable ProcessRecord app) { if (queue.setProcessAndUidState(app, mUidForeground.get(queue.uid, false), mUidCached.get(queue.uid, false))) { isProcessFreezable(app))) { updateRunnableList(queue); } } @GuardedBy("mService") private boolean isProcessFreezable(@Nullable ProcessRecord app) { if (app == null) { return false; } synchronized (mService.mProcLock) { return app.mOptRecord.isPendingFreeze() || app.mOptRecord.isFrozen(); } } /** * Refresh the process queues with the latest process state so that runnableAt * can be updated. Loading @@ -1850,6 +1845,20 @@ class BroadcastQueueModernImpl extends BroadcastQueue { enqueueUpdateRunningList(); } /** * Refresh the process queue corresponding to {@code app} with the latest process state * so that runnableAt can be updated. */ @GuardedBy("mService") private void refreshProcessQueueLocked(@NonNull ProcessRecord app) { final BroadcastProcessQueue queue = getProcessQueue(app.processName, app.uid); if (queue == null || queue.app == null || queue.app.getPid() != app.getPid()) { return; } setQueueProcess(queue, queue.app); enqueueUpdateRunningList(); } /** * Inform other parts of OS that the given broadcast queue has started * running, typically for internal bookkeeping. Loading Loading @@ -2176,12 +2185,6 @@ class BroadcastQueueModernImpl extends BroadcastQueue { ipw.decreaseIndent(); ipw.println(); ipw.println("Cached UIDs:"); ipw.increaseIndent(); ipw.println(mUidCached); ipw.decreaseIndent(); ipw.println(); ipw.println("Foreground UIDs:"); ipw.increaseIndent(); ipw.println(mUidForeground); Loading