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

Commit 159fdccd authored by Artem Iglikov's avatar Artem Iglikov Committed by Android (Google) Code Review
Browse files

Merge "Revert "JobScheduler to use UID active state for job exemption""

parents d70c53fc 0b053fec
Loading
Loading
Loading
Loading
+0 −5
Original line number Diff line number Diff line
@@ -348,9 +348,4 @@ public abstract class ActivityManagerInternal {
     * Returns is the caller has the same uid as the Recents component
     */
    public abstract boolean isCallerRecents(int callingUid);

    /**
     * Whether an UID is active or idle.
     */
    public abstract boolean isUidActive(int uid);
}
+14 −19
Original line number Diff line number Diff line
@@ -98,8 +98,7 @@ import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.ArrayUtils;
import com.android.internal.util.DumpUtils;
import com.android.internal.util.LocalLog;
import com.android.internal.util.Preconditions;
import com.android.server.AppStateTracker.Listener;
import com.android.server.ForceAppStandbyTracker.Listener;

/**
 * Alarm manager implementaion.
@@ -250,7 +249,7 @@ class AlarmManagerService extends SystemService {
    private final SparseArray<AlarmManager.AlarmClockInfo> mHandlerSparseAlarmClockArray =
            new SparseArray<>();

    private AppStateTracker mAppStateTracker;
    private final ForceAppStandbyTracker mForceAppStandbyTracker;
    private boolean mAppStandbyParole;
    private ArrayMap<Pair<String, Integer>, Long> mLastAlarmDeliveredForPackage = new ArrayMap<>();

@@ -708,6 +707,9 @@ class AlarmManagerService extends SystemService {
        super(context);
        mConstants = new Constants(mHandler);

        mForceAppStandbyTracker = ForceAppStandbyTracker.getInstance(context);
        mForceAppStandbyTracker.addListener(mForceAppStandbyListener);

        publishLocalService(AlarmManagerInternal.class, new LocalService());
    }

@@ -1327,15 +1329,13 @@ class AlarmManagerService extends SystemService {
    @Override
    public void onBootPhase(int phase) {
        if (phase == PHASE_SYSTEM_SERVICES_READY) {
            mForceAppStandbyTracker.start();
            mConstants.start(getContext().getContentResolver());
            mAppOps = (AppOpsManager) getContext().getSystemService(Context.APP_OPS_SERVICE);
            mLocalDeviceIdleController
                    = LocalServices.getService(DeviceIdleController.LocalService.class);
            mUsageStatsManagerInternal = LocalServices.getService(UsageStatsManagerInternal.class);
            mUsageStatsManagerInternal.addAppIdleStateChangeListener(new AppStandbyTracker());

            mAppStateTracker = LocalServices.getService(AppStateTracker.class);
            mAppStateTracker.addListener(mForceAppStandbyListener);
        }
    }

@@ -1729,8 +1729,7 @@ class AlarmManagerService extends SystemService {
            // timing restrictions.
            } else if (workSource == null && (callingUid < Process.FIRST_APPLICATION_UID
                    || callingUid == mSystemUiUid
                    || (mAppStateTracker != null
                        && mAppStateTracker.isUidPowerSaveWhitelisted(callingUid)))) {
                    || mForceAppStandbyTracker.isUidPowerSaveWhitelisted(callingUid))) {
                flags |= AlarmManager.FLAG_ALLOW_WHILE_IDLE_UNRESTRICTED;
                flags &= ~AlarmManager.FLAG_ALLOW_WHILE_IDLE;
            }
@@ -1813,10 +1812,8 @@ class AlarmManagerService extends SystemService {
            mConstants.dump(pw);
            pw.println();

            if (mAppStateTracker != null) {
                mAppStateTracker.dump(pw, "  ");
            mForceAppStandbyTracker.dump(pw, "  ");
            pw.println();
            }

            pw.println("  App Standby Parole: " + mAppStandbyParole);
            pw.println();
@@ -2164,10 +2161,8 @@ class AlarmManagerService extends SystemService {

            mConstants.dumpProto(proto, AlarmManagerServiceProto.SETTINGS);

            if (mAppStateTracker != null) {
                mAppStateTracker.dumpProto(proto,
            mForceAppStandbyTracker.dumpProto(proto,
                    AlarmManagerServiceProto.FORCE_APP_STANDBY_TRACKER);
            }

            proto.write(AlarmManagerServiceProto.IS_INTERACTIVE, mInteractive);
            if (!mInteractive) {
@@ -2947,7 +2942,7 @@ class AlarmManagerService extends SystemService {
        }
        final String sourcePackage = alarm.sourcePackage;
        final int sourceUid = alarm.creatorUid;
        return mAppStateTracker.areAlarmsRestricted(sourceUid, sourcePackage,
        return mForceAppStandbyTracker.areAlarmsRestricted(sourceUid, sourcePackage,
                allowWhileIdle);
    }

@@ -2960,7 +2955,7 @@ class AlarmManagerService extends SystemService {

    private long getWhileIdleMinIntervalLocked(int uid) {
        final boolean dozing = mPendingIdleUntil != null;
        final boolean ebs = mAppStateTracker.isForceAllAppsStandbyEnabled();
        final boolean ebs = mForceAppStandbyTracker.isForceAllAppsStandbyEnabled();
        if (!dozing && !ebs) {
            return mConstants.ALLOW_WHILE_IDLE_SHORT_TIME;
        }
@@ -4138,7 +4133,7 @@ class AlarmManagerService extends SystemService {
            if (allowWhileIdle) {
                // Record the last time this uid handled an ALLOW_WHILE_IDLE alarm.
                mLastAllowWhileIdleDispatch.put(alarm.creatorUid, nowELAPSED);
                if (mAppStateTracker.isUidInForeground(alarm.creatorUid)) {
                if (mForceAppStandbyTracker.isUidInForeground(alarm.creatorUid)) {
                    mUseAllowWhileIdleShortTime.put(alarm.creatorUid, true);
                } else {
                    mUseAllowWhileIdleShortTime.put(alarm.creatorUid, false);
+1 −7
Original line number Diff line number Diff line
@@ -82,7 +82,6 @@ import com.android.internal.os.AtomicFile;
import com.android.internal.os.BackgroundThread;
import com.android.internal.util.DumpUtils;
import com.android.internal.util.FastXmlSerializer;
import com.android.internal.util.Preconditions;
import com.android.internal.util.XmlUtils;
import com.android.server.am.BatteryStatsService;
import com.android.server.net.NetworkPolicyManagerInternal;
@@ -129,7 +128,6 @@ public class DeviceIdleController extends SystemService
    private Intent mIdleIntent;
    private Intent mLightIdleIntent;
    private AnyMotionDetector mAnyMotionDetector;
    private final AppStateTracker mAppStateTracker;
    private boolean mLightEnabled;
    private boolean mDeepEnabled;
    private boolean mForceIdle;
@@ -1373,8 +1371,6 @@ public class DeviceIdleController extends SystemService
        super(context);
        mConfigFile = new AtomicFile(new File(getSystemDir(), "deviceidle.xml"));
        mHandler = new MyHandler(BackgroundThread.getHandler().getLooper());
        mAppStateTracker = new AppStateTracker(context, FgThread.get().getLooper());
        LocalServices.addService(AppStateTracker.class, mAppStateTracker);
    }

    boolean isAppOnWhitelistInternal(int appid) {
@@ -1505,8 +1501,6 @@ public class DeviceIdleController extends SystemService
                        (PowerManager) getContext().getSystemService(Context.POWER_SERVICE),
                        mHandler, mSensorManager, this, angleThreshold);

                mAppStateTracker.onSystemServicesReady();

                mIdleIntent = new Intent(PowerManager.ACTION_DEVICE_IDLE_MODE_CHANGED);
                mIdleIntent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY
                        | Intent.FLAG_RECEIVER_FOREGROUND);
@@ -2621,7 +2615,7 @@ public class DeviceIdleController extends SystemService
    }

    private void passWhiteListToForceAppStandbyTrackerLocked() {
        mAppStateTracker.setPowerSaveWhitelistAppIds(
        ForceAppStandbyTracker.getInstance(getContext()).setPowerSaveWhitelistAppIds(
                mPowerSaveWhitelistExceptIdleAppIdArray,
                mTempWhitelistAppIdArray);
    }
+33 −47
Original line number Diff line number Diff line
@@ -54,6 +54,7 @@ import com.android.internal.app.IAppOpsCallback;
import com.android.internal.app.IAppOpsService;
import com.android.internal.util.ArrayUtils;
import com.android.internal.util.Preconditions;
import com.android.server.DeviceIdleController.LocalService;
import com.android.server.ForceAppStandbyTrackerProto.ExemptedPackage;
import com.android.server.ForceAppStandbyTrackerProto.RunAnyInBackgroundRestrictedPackages;

@@ -72,14 +73,14 @@ import java.util.List;
 * TODO: Make it a LocalService.
 *
 * Test:
  atest $ANDROID_BUILD_TOP/frameworks/base/services/tests/servicestests/src/com/android/server/AppStateTrackerTest.java
  atest $ANDROID_BUILD_TOP/frameworks/base/services/tests/servicestests/src/com/android/server/ForceAppStandbyTrackerTest.java
 */
public class AppStateTracker {
public class ForceAppStandbyTracker {
    private static final String TAG = "ForceAppStandbyTracker";
    private static final boolean DEBUG = true;

    @GuardedBy("AppStateTracker.class")
    private static AppStateTracker sInstance;
    @GuardedBy("ForceAppStandbyTracker.class")
    private static ForceAppStandbyTracker sInstance;

    private final Object mLock = new Object();
    private final Context mContext;
@@ -88,7 +89,6 @@ public class AppStateTracker {
    static final int TARGET_OP = AppOpsManager.OP_RUN_ANY_IN_BACKGROUND;

    IActivityManager mIActivityManager;
    ActivityManagerInternal mActivityManagerInternal;
    AppOpsManager mAppOpsManager;
    IAppOpsService mAppOpsService;
    PowerManagerInternal mPowerManagerInternal;
@@ -172,9 +172,6 @@ public class AppStateTracker {
        int EXEMPT_CHANGED = 6;
        int FORCE_ALL_CHANGED = 7;
        int FORCE_APP_STANDBY_FEATURE_FLAG_CHANGED = 8;

        int IS_UID_ACTIVE_CACHED = 9;
        int IS_UID_ACTIVE_RAW = 10;
    }

    private final StatLogger mStatLogger = new StatLogger(new String[] {
@@ -187,9 +184,6 @@ public class AppStateTracker {
            "EXEMPT_CHANGED",
            "FORCE_ALL_CHANGED",
            "FORCE_APP_STANDBY_FEATURE_FLAG_CHANGED",

            "IS_UID_ACTIVE_CACHED",
            "IS_UID_ACTIVE_RAW",
    });

    @VisibleForTesting
@@ -255,7 +249,7 @@ public class AppStateTracker {
        /**
         * This is called when the OP_RUN_ANY_IN_BACKGROUND appops changed for a package.
         */
        private void onRunAnyAppOpsChanged(AppStateTracker sender,
        private void onRunAnyAppOpsChanged(ForceAppStandbyTracker sender,
                int uid, @NonNull String packageName) {
            updateJobsForUidPackage(uid, packageName);

@@ -270,14 +264,14 @@ public class AppStateTracker {
        /**
         * This is called when the foreground state changed for a UID.
         */
        private void onUidForegroundStateChanged(AppStateTracker sender, int uid) {
        private void onUidForegroundStateChanged(ForceAppStandbyTracker sender, int uid) {
            onUidForeground(uid, sender.isUidInForeground(uid));
        }

        /**
         * This is called when the active/idle state changed for a UID.
         */
        private void onUidActiveStateChanged(AppStateTracker sender, int uid) {
        private void onUidActiveStateChanged(ForceAppStandbyTracker sender, int uid) {
            updateJobsForUid(uid);

            if (sender.isUidActive(uid)) {
@@ -288,7 +282,7 @@ public class AppStateTracker {
        /**
         * This is called when an app-id(s) is removed from the power save whitelist.
         */
        private void onPowerSaveUnwhitelisted(AppStateTracker sender) {
        private void onPowerSaveUnwhitelisted(ForceAppStandbyTracker sender) {
            updateAllJobs();
            unblockAllUnrestrictedAlarms();
        }
@@ -297,14 +291,14 @@ public class AppStateTracker {
         * This is called when the power save whitelist changes, excluding the
         * {@link #onPowerSaveUnwhitelisted} case.
         */
        private void onPowerSaveWhitelistedChanged(AppStateTracker sender) {
        private void onPowerSaveWhitelistedChanged(ForceAppStandbyTracker sender) {
            updateAllJobs();
        }

        /**
         * This is called when the temp whitelist changes.
         */
        private void onTempPowerSaveWhitelistChanged(AppStateTracker sender) {
        private void onTempPowerSaveWhitelistChanged(ForceAppStandbyTracker sender) {

            // TODO This case happens rather frequently; consider optimizing and update jobs
            // only for affected app-ids.
@@ -317,7 +311,7 @@ public class AppStateTracker {
        /**
         * This is called when the EXEMPT bucket is updated.
         */
        private void onExemptChanged(AppStateTracker sender) {
        private void onExemptChanged(ForceAppStandbyTracker sender) {
            // This doesn't happen very often, so just re-evaluate all jobs / alarms.
            updateAllJobs();
            unblockAllUnrestrictedAlarms();
@@ -326,7 +320,7 @@ public class AppStateTracker {
        /**
         * This is called when the global "force all apps standby" flag changes.
         */
        private void onForceAllAppsStandbyChanged(AppStateTracker sender) {
        private void onForceAllAppsStandbyChanged(ForceAppStandbyTracker sender) {
            updateAllJobs();

            if (!sender.isForceAllAppsStandbyEnabled()) {
@@ -383,15 +377,30 @@ public class AppStateTracker {
        }
    }

    public AppStateTracker(Context context, Looper looper) {
    @VisibleForTesting
    ForceAppStandbyTracker(Context context, Looper looper) {
        mContext = context;
        mHandler = new MyHandler(looper);
    }

    private ForceAppStandbyTracker(Context context) {
        this(context, FgThread.get().getLooper());
    }

    /**
     * Get the singleton instance.
     */
    public static synchronized ForceAppStandbyTracker getInstance(Context context) {
        if (sInstance == null) {
            sInstance = new ForceAppStandbyTracker(context);
        }
        return sInstance;
    }

    /**
     * Call it when the system is ready.
     */
    public void onSystemServicesReady() {
    public void start() {
        synchronized (mLock) {
            if (mStarted) {
                return;
@@ -399,7 +408,6 @@ public class AppStateTracker {
            mStarted = true;

            mIActivityManager = Preconditions.checkNotNull(injectIActivityManager());
            mActivityManagerInternal = Preconditions.checkNotNull(injectActivityManagerInternal());
            mAppOpsManager = Preconditions.checkNotNull(injectAppOpsManager());
            mAppOpsService = Preconditions.checkNotNull(injectIAppOpsService());
            mPowerManagerInternal = Preconditions.checkNotNull(injectPowerManagerInternal());
@@ -466,11 +474,6 @@ public class AppStateTracker {
        return ActivityManager.getService();
    }

    @VisibleForTesting
    ActivityManagerInternal injectActivityManagerInternal() {
        return LocalServices.getService(ActivityManagerInternal.class);
    }

    @VisibleForTesting
    PowerManagerInternal injectPowerManagerInternal() {
        return LocalServices.getService(PowerManagerInternal.class);
@@ -796,7 +799,7 @@ public class AppStateTracker {
                    return;
                }
            }
            final AppStateTracker sender = AppStateTracker.this;
            final ForceAppStandbyTracker sender = ForceAppStandbyTracker.this;

            long start = mStatLogger.getTime();
            switch (msg.what) {
@@ -1086,11 +1089,11 @@ public class AppStateTracker {
    }

    /**
     * @return whether a UID is in active or not *based on cached information.*
     * @return whether a UID is in active 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 #isUidActiveSynced} instead.
     * {@link ActivityManagerInternal#getUidProcessState} instead.
     */
    public boolean isUidActive(int uid) {
        if (UserHandle.isCore(uid)) {
@@ -1101,23 +1104,6 @@ public class AppStateTracker {
        }
    }

    /**
     * @return whether a UID is in active or not *right now.*
     *
     * This gives the fresh information, but may access the activity manager so is slower.
     */
    public boolean isUidActiveSynced(int uid) {
        if (isUidActive(uid)) { // Use the cached one first.
            return true;
        }
        final long start = mStatLogger.getTime();

        final boolean ret = mActivityManagerInternal.isUidActive(uid);
        mStatLogger.logDurationStat(Stats.IS_UID_ACTIVE_RAW, start);

        return ret;
    }

    /**
     * @return whether a UID is in the foreground or not.
     *
+2 −9
Original line number Diff line number Diff line
@@ -17,7 +17,6 @@
package com.android.server;

import android.os.SystemClock;
import android.util.Slog;
import android.util.proto.ProtoOutputStream;

import com.android.internal.annotations.GuardedBy;
@@ -34,8 +33,6 @@ import java.io.PrintWriter;
 * @hide
 */
public class StatLogger {
    private static final String TAG = "StatLogger";

    private final Object mLock = new Object();

    private final int SIZE;
@@ -69,12 +66,8 @@ public class StatLogger {
     */
    public void logDurationStat(int eventId, long start) {
        synchronized (mLock) {
            if (eventId >= 0 && eventId < SIZE) {
            mCountStats[eventId]++;
            mDurationStats[eventId] += (getTime() - start);
            } else {
                Slog.wtf(TAG, "Invalid event ID: " + eventId);
            }
        }
    }

Loading