Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2479d73d authored by Suprabh Shukla's avatar Suprabh Shukla
Browse files

Move allow-while-idle throttling to quotas

Moving the allow-while-idle throttling to a rolling window quota system.
The current quota is 7 per hour to be the same as the existing once
every 9 minutes.

Test: atest CtsAlarmManagerTestCases
atest FrameworksMockingServicesTests:com.android.server.alarm
atest FrameworksMockingServicesTests:AppStateTrackerTest

Bug: 154655798
Change-Id: I818b280fdaacd079fbc55997e1353d622f4e3a96
parent 77bb0b72
Loading
Loading
Loading
Loading
+1 −86
Original line number Diff line number Diff line
@@ -105,10 +105,6 @@ public class AppStateTrackerImpl implements AppStateTracker {
    @GuardedBy("mLock")
    final SparseBooleanArray mActiveUids = new SparseBooleanArray();

    /** UIDs that are in the foreground. */
    @GuardedBy("mLock")
    final SparseBooleanArray mForegroundUids = new SparseBooleanArray();

    /**
     * System except-idle + user exemption list in the device idle controller.
     */
@@ -285,13 +281,6 @@ public class AppStateTrackerImpl implements AppStateTracker {
            }
        }

        /**
         * This is called when the foreground state changed for a UID.
         */
        private void onUidForegroundStateChanged(AppStateTrackerImpl sender, int uid) {
            onUidForeground(uid, sender.isUidInForeground(uid));
        }

        /**
         * This is called when the active/idle state changed for a UID.
         */
@@ -415,14 +404,6 @@ public class AppStateTrackerImpl implements AppStateTracker {
        public void unblockAlarmsForUidPackage(int uid, String packageName) {
        }

        /**
         * Called when a UID comes into the foreground or the background.
         *
         * @see #isUidInForeground(int)
         */
        public void onUidForeground(int uid, boolean foreground) {
        }

        /**
         * Called when an ephemeral uid goes to the background, so its alarms need to be removed.
         */
@@ -460,7 +441,6 @@ public class AppStateTrackerImpl implements AppStateTracker {
                        mExemptedBucketPackages.remove(userId, pkgName);
                        mRunAnyRestrictedPackages.remove(Pair.create(uid, pkgName));
                        mActiveUids.delete(uid);
                        mForegroundUids.delete(uid);
                    }
                    break;
            }
@@ -496,8 +476,7 @@ public class AppStateTrackerImpl implements AppStateTracker {
                mIActivityManager.registerUidObserver(new UidObserver(),
                        ActivityManager.UID_OBSERVER_GONE
                                | ActivityManager.UID_OBSERVER_IDLE
                                | ActivityManager.UID_OBSERVER_ACTIVE
                                | ActivityManager.UID_OBSERVER_PROCSTATE,
                                | ActivityManager.UID_OBSERVER_ACTIVE,
                        ActivityManager.PROCESS_STATE_UNKNOWN, null);
                mAppOpsService.startWatchingMode(TARGET_OP, null,
                        new AppOpsWatcher());
@@ -698,7 +677,6 @@ public class AppStateTrackerImpl implements AppStateTracker {
    private final class UidObserver extends IUidObserver.Stub {
        @Override
        public void onUidStateChanged(int uid, int procState, long procStateSeq, int capability) {
            mHandler.onUidStateChanged(uid, procState);
        }

        @Override
@@ -769,7 +747,6 @@ public class AppStateTrackerImpl implements AppStateTracker {

    private class MyHandler extends Handler {
        private static final int MSG_UID_ACTIVE_STATE_CHANGED = 0;
        private static final int MSG_UID_FG_STATE_CHANGED = 1;
        private static final int MSG_RUN_ANY_CHANGED = 3;
        private static final int MSG_ALL_UNEXEMPTED = 4;
        private static final int MSG_ALL_EXEMPTION_LIST_CHANGED = 5;
@@ -779,7 +756,6 @@ public class AppStateTrackerImpl implements AppStateTracker {
        private static final int MSG_FORCE_APP_STANDBY_FEATURE_FLAG_CHANGED = 9;
        private static final int MSG_EXEMPTED_BUCKET_CHANGED = 10;

        private static final int MSG_ON_UID_STATE_CHANGED = 11;
        private static final int MSG_ON_UID_ACTIVE = 12;
        private static final int MSG_ON_UID_GONE = 13;
        private static final int MSG_ON_UID_IDLE = 14;
@@ -792,10 +768,6 @@ public class AppStateTrackerImpl implements AppStateTracker {
            obtainMessage(MSG_UID_ACTIVE_STATE_CHANGED, uid, 0).sendToTarget();
        }

        public void notifyUidForegroundStateChanged(int uid) {
            obtainMessage(MSG_UID_FG_STATE_CHANGED, uid, 0).sendToTarget();
        }

        public void notifyRunAnyAppOpsChanged(int uid, @NonNull String packageName) {
            obtainMessage(MSG_RUN_ANY_CHANGED, uid, 0, packageName).sendToTarget();
        }
@@ -834,10 +806,6 @@ public class AppStateTrackerImpl implements AppStateTracker {
            obtainMessage(MSG_USER_REMOVED, userId, 0).sendToTarget();
        }

        public void onUidStateChanged(int uid, int procState) {
            obtainMessage(MSG_ON_UID_STATE_CHANGED, uid, procState).sendToTarget();
        }

        public void onUidActive(int uid) {
            obtainMessage(MSG_ON_UID_ACTIVE, uid, 0).sendToTarget();
        }
@@ -875,13 +843,6 @@ public class AppStateTrackerImpl implements AppStateTracker {
                    mStatLogger.logDurationStat(Stats.UID_ACTIVE_STATE_CHANGED, start);
                    return;

                case MSG_UID_FG_STATE_CHANGED:
                    for (Listener l : cloneListeners()) {
                        l.onUidForegroundStateChanged(sender, msg.arg1);
                    }
                    mStatLogger.logDurationStat(Stats.UID_FG_STATE_CHANGED, start);
                    return;

                case MSG_RUN_ANY_CHANGED:
                    for (Listener l : cloneListeners()) {
                        l.onRunAnyAppOpsChanged(sender, msg.arg1, (String) msg.obj);
@@ -944,9 +905,6 @@ public class AppStateTrackerImpl implements AppStateTracker {
                    handleUserRemoved(msg.arg1);
                    return;

                case MSG_ON_UID_STATE_CHANGED:
                    handleUidStateChanged(msg.arg1, msg.arg2);
                    return;
                case MSG_ON_UID_ACTIVE:
                    handleUidActive(msg.arg1);
                    return;
@@ -971,20 +929,6 @@ public class AppStateTrackerImpl implements AppStateTracker {
            }
        }

        public void handleUidStateChanged(int uid, int procState) {
            synchronized (mLock) {
                if (procState > ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND) {
                    if (removeUidFromArray(mForegroundUids, uid, false)) {
                        mHandler.notifyUidForegroundStateChanged(uid);
                    }
                } else {
                    if (addUidToArray(mForegroundUids, uid)) {
                        mHandler.notifyUidForegroundStateChanged(uid);
                    }
                }
            }
        }

        public void handleUidActive(int uid) {
            synchronized (mLock) {
                if (addUidToArray(mActiveUids, uid)) {
@@ -1007,9 +951,6 @@ public class AppStateTrackerImpl implements AppStateTracker {
                if (removeUidFromArray(mActiveUids, uid, remove)) {
                    mHandler.notifyUidActiveStateChanged(uid);
                }
                if (removeUidFromArray(mForegroundUids, uid, remove)) {
                    mHandler.notifyUidForegroundStateChanged(uid);
                }
            }
        }
    }
@@ -1026,7 +967,6 @@ public class AppStateTrackerImpl implements AppStateTracker {
                }
            }
            cleanUpArrayForUser(mActiveUids, removedUserId);
            cleanUpArrayForUser(mForegroundUids, removedUserId);
            mExemptedBucketPackages.remove(removedUserId);
        }
    }
@@ -1221,22 +1161,6 @@ public class AppStateTrackerImpl implements AppStateTracker {
        return ret;
    }

    /**
     * @return whether a UID is in the foreground or not.
     *
     * Note this information is based on the UID proc state callback, meaning it's updated
     * asynchronously and may subtly be stale. If the fresh data is needed, use
     * {@link ActivityManagerInternal#getUidProcessState} instead.
     */
    public boolean isUidInForeground(int uid) {
        if (UserHandle.isCore(uid)) {
            return true;
        }
        synchronized (mLock) {
            return mForegroundUids.get(uid);
        }
    }

    /**
     * @return whether force all apps standby is enabled or not.
     */
@@ -1315,9 +1239,6 @@ public class AppStateTrackerImpl implements AppStateTracker {
            pw.print("Active uids: ");
            dumpUids(pw, mActiveUids);

            pw.print("Foreground uids: ");
            dumpUids(pw, mForegroundUids);

            pw.print("Except-idle + user exemption list appids: ");
            pw.println(Arrays.toString(mPowerExemptAllAppIds));

@@ -1395,12 +1316,6 @@ public class AppStateTrackerImpl implements AppStateTracker {
                }
            }

            for (int i = 0; i < mForegroundUids.size(); i++) {
                if (mForegroundUids.valueAt(i)) {
                    proto.write(AppStateTrackerProto.FOREGROUND_UIDS, mForegroundUids.keyAt(i));
                }
            }

            for (int appId : mPowerExemptAllAppIds) {
                proto.write(AppStateTrackerProto.POWER_SAVE_EXEMPT_APP_IDS, appId);
            }
+92 −171

File changed.

Preview size limit exceeded, changes collapsed.

+1 −42
Original line number Diff line number Diff line
@@ -271,8 +271,7 @@ public class AppStateTrackerTest {
        verify(mMockIActivityManager).registerUidObserver(
                uidObserverArgumentCaptor.capture(),
                eq(ActivityManager.UID_OBSERVER_GONE | ActivityManager.UID_OBSERVER_IDLE
                        | ActivityManager.UID_OBSERVER_ACTIVE
                        | ActivityManager.UID_OBSERVER_PROCSTATE),
                        | ActivityManager.UID_OBSERVER_ACTIVE),
                eq(ActivityManager.PROCESS_STATE_UNKNOWN),
                isNull());
        verify(mMockIAppOpsService).startWatchingMode(
@@ -650,11 +649,6 @@ public class AppStateTrackerTest {
        assertFalse(instance.isUidActiveSynced(UID_2));
        assertTrue(instance.isUidActiveSynced(Process.SYSTEM_UID));

        assertFalse(instance.isUidInForeground(UID_1));
        assertFalse(instance.isUidInForeground(UID_2));
        assertTrue(instance.isUidInForeground(Process.SYSTEM_UID));


        mIUidObserver.onUidStateChanged(UID_2,
                ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE, 0,
                ActivityManager.PROCESS_CAPABILITY_NONE);
@@ -670,11 +664,6 @@ public class AppStateTrackerTest {
        assertFalse(instance.isUidActiveSynced(UID_2));
        assertTrue(instance.isUidActiveSynced(Process.SYSTEM_UID));

        assertFalse(instance.isUidInForeground(UID_1));
        assertTrue(instance.isUidInForeground(UID_2));
        assertTrue(instance.isUidInForeground(Process.SYSTEM_UID));


        mIUidObserver.onUidStateChanged(UID_1,
                ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE, 0,
                ActivityManager.PROCESS_CAPABILITY_NONE);
@@ -686,10 +675,6 @@ public class AppStateTrackerTest {
        assertFalse(instance.isUidActive(UID_2));
        assertTrue(instance.isUidActive(Process.SYSTEM_UID));

        assertTrue(instance.isUidInForeground(UID_1));
        assertTrue(instance.isUidInForeground(UID_2));
        assertTrue(instance.isUidInForeground(Process.SYSTEM_UID));

        mIUidObserver.onUidGone(UID_1, true);

        waitUntilMainHandlerDrain();
@@ -699,10 +684,6 @@ public class AppStateTrackerTest {
        assertFalse(instance.isUidActive(UID_2));
        assertTrue(instance.isUidActive(Process.SYSTEM_UID));

        assertFalse(instance.isUidInForeground(UID_1));
        assertTrue(instance.isUidInForeground(UID_2));
        assertTrue(instance.isUidInForeground(Process.SYSTEM_UID));

        mIUidObserver.onUidIdle(UID_2, true);

        waitUntilMainHandlerDrain();
@@ -712,10 +693,6 @@ public class AppStateTrackerTest {
        assertFalse(instance.isUidActive(UID_2));
        assertTrue(instance.isUidActive(Process.SYSTEM_UID));

        assertFalse(instance.isUidInForeground(UID_1));
        assertFalse(instance.isUidInForeground(UID_2));
        assertTrue(instance.isUidInForeground(Process.SYSTEM_UID));

        mIUidObserver.onUidStateChanged(UID_1,
                ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND, 0,
                ActivityManager.PROCESS_CAPABILITY_NONE);
@@ -727,10 +704,6 @@ public class AppStateTrackerTest {
        assertFalse(instance.isUidActive(UID_2));
        assertTrue(instance.isUidActive(Process.SYSTEM_UID));

        assertTrue(instance.isUidInForeground(UID_1));
        assertFalse(instance.isUidInForeground(UID_2));
        assertTrue(instance.isUidInForeground(Process.SYSTEM_UID));

        mIUidObserver.onUidStateChanged(UID_1,
                ActivityManager.PROCESS_STATE_TRANSIENT_BACKGROUND, 0,
                ActivityManager.PROCESS_CAPABILITY_NONE);
@@ -746,10 +719,6 @@ public class AppStateTrackerTest {
        assertFalse(instance.isUidActiveSynced(UID_2));
        assertTrue(instance.isUidActiveSynced(Process.SYSTEM_UID));

        assertFalse(instance.isUidInForeground(UID_1));
        assertFalse(instance.isUidInForeground(UID_2));
        assertTrue(instance.isUidInForeground(Process.SYSTEM_UID));

        // The result from AMI.isUidActive() only affects isUidActiveSynced().
        when(mMockIActivityManagerInternal.isUidActive(anyInt())).thenReturn(true);

@@ -760,11 +729,6 @@ public class AppStateTrackerTest {
        assertTrue(instance.isUidActiveSynced(UID_1));
        assertTrue(instance.isUidActiveSynced(UID_2));
        assertTrue(instance.isUidActiveSynced(Process.SYSTEM_UID));

        assertFalse(instance.isUidInForeground(UID_1));
        assertFalse(instance.isUidInForeground(UID_2));
        assertTrue(instance.isUidInForeground(Process.SYSTEM_UID));

    }

    @Test
@@ -1480,7 +1444,6 @@ public class AppStateTrackerTest {
        callStart(instance);

        instance.mActiveUids.put(UID_1, true);
        instance.mForegroundUids.put(UID_2, true);
        instance.mRunAnyRestrictedPackages.add(Pair.create(UID_1, PACKAGE_1));
        instance.mExemptedBucketPackages.add(UserHandle.getUserId(UID_2), PACKAGE_2);

@@ -1493,7 +1456,6 @@ public class AppStateTrackerTest {
        mReceiver.onReceive(mMockContext, packageRemoved);

        assertEquals(1, instance.mActiveUids.size());
        assertEquals(1, instance.mForegroundUids.size());
        assertEquals(1, instance.mRunAnyRestrictedPackages.size());
        assertEquals(1, instance.mExemptedBucketPackages.size());

@@ -1506,7 +1468,6 @@ public class AppStateTrackerTest {
        mReceiver.onReceive(mMockContext, packageRemoved);

        assertEquals(1, instance.mActiveUids.size());
        assertEquals(1, instance.mForegroundUids.size());
        assertEquals(1, instance.mRunAnyRestrictedPackages.size());
        assertEquals(1, instance.mExemptedBucketPackages.size());

@@ -1518,7 +1479,6 @@ public class AppStateTrackerTest {
        mReceiver.onReceive(mMockContext, packageRemoved);

        assertEquals(0, instance.mActiveUids.size());
        assertEquals(1, instance.mForegroundUids.size());
        assertEquals(0, instance.mRunAnyRestrictedPackages.size());
        assertEquals(1, instance.mExemptedBucketPackages.size());

@@ -1530,7 +1490,6 @@ public class AppStateTrackerTest {
        mReceiver.onReceive(mMockContext, packageRemoved);

        assertEquals(0, instance.mActiveUids.size());
        assertEquals(0, instance.mForegroundUids.size());
        assertEquals(0, instance.mRunAnyRestrictedPackages.size());
        assertEquals(0, instance.mExemptedBucketPackages.size());
    }
+98 −95

File changed.

Preview size limit exceeded, changes collapsed.