Loading core/java/android/app/ActivityManagerInternal.java +0 −5 Original line number Diff line number Diff line Loading @@ -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); } services/core/java/com/android/server/AlarmManagerService.java +14 −19 Original line number Diff line number Diff line Loading @@ -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. Loading Loading @@ -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<>(); Loading Loading @@ -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()); } Loading Loading @@ -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); } } Loading Loading @@ -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; } Loading Loading @@ -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(); Loading Loading @@ -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) { Loading Loading @@ -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); } Loading @@ -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; } Loading Loading @@ -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); Loading services/core/java/com/android/server/DeviceIdleController.java +1 −7 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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) { Loading Loading @@ -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); Loading Loading @@ -2621,7 +2615,7 @@ public class DeviceIdleController extends SystemService } private void passWhiteListToForceAppStandbyTrackerLocked() { mAppStateTracker.setPowerSaveWhitelistAppIds( ForceAppStandbyTracker.getInstance(getContext()).setPowerSaveWhitelistAppIds( mPowerSaveWhitelistExceptIdleAppIdArray, mTempWhitelistAppIdArray); } Loading services/core/java/com/android/server/AppStateTracker.java→services/core/java/com/android/server/ForceAppStandbyTracker.java +33 −47 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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; Loading Loading @@ -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[] { Loading @@ -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 Loading Loading @@ -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); Loading @@ -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)) { Loading @@ -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(); } Loading @@ -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. Loading @@ -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(); Loading @@ -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()) { Loading Loading @@ -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; Loading @@ -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()); Loading Loading @@ -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); Loading Loading @@ -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) { Loading Loading @@ -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)) { Loading @@ -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. * Loading services/core/java/com/android/server/StatLogger.java +2 −9 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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 Loading
core/java/android/app/ActivityManagerInternal.java +0 −5 Original line number Diff line number Diff line Loading @@ -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); }
services/core/java/com/android/server/AlarmManagerService.java +14 −19 Original line number Diff line number Diff line Loading @@ -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. Loading Loading @@ -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<>(); Loading Loading @@ -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()); } Loading Loading @@ -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); } } Loading Loading @@ -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; } Loading Loading @@ -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(); Loading Loading @@ -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) { Loading Loading @@ -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); } Loading @@ -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; } Loading Loading @@ -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); Loading
services/core/java/com/android/server/DeviceIdleController.java +1 −7 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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) { Loading Loading @@ -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); Loading Loading @@ -2621,7 +2615,7 @@ public class DeviceIdleController extends SystemService } private void passWhiteListToForceAppStandbyTrackerLocked() { mAppStateTracker.setPowerSaveWhitelistAppIds( ForceAppStandbyTracker.getInstance(getContext()).setPowerSaveWhitelistAppIds( mPowerSaveWhitelistExceptIdleAppIdArray, mTempWhitelistAppIdArray); } Loading
services/core/java/com/android/server/AppStateTracker.java→services/core/java/com/android/server/ForceAppStandbyTracker.java +33 −47 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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; Loading Loading @@ -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[] { Loading @@ -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 Loading Loading @@ -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); Loading @@ -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)) { Loading @@ -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(); } Loading @@ -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. Loading @@ -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(); Loading @@ -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()) { Loading Loading @@ -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; Loading @@ -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()); Loading Loading @@ -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); Loading Loading @@ -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) { Loading Loading @@ -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)) { Loading @@ -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. * Loading
services/core/java/com/android/server/StatLogger.java +2 −9 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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