Loading apct-tests/perftests/multiuser/Android.bp +1 −0 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ android_test { srcs: ["src/**/*.java"], static_libs: [ "androidx.test.rules", "collector-device-lib-platform", "apct-perftests-utils", ], platform_apis: true, Loading apct-tests/perftests/multiuser/AndroidManifest.xml +4 −0 Original line number Diff line number Diff line Loading @@ -17,12 +17,16 @@ <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.android.perftests.multiuser"> <uses-sdk android:targetSdkVersion="28" /> <uses-permission android:name="android.permission.CONTROL_KEYGUARD" /> <uses-permission android:name="android.permission.MANAGE_USERS" /> <uses-permission android:name="android.permission.INSTALL_PACKAGES" /> <uses-permission android:name="android.permission.INTERACT_ACROSS_USERS" /> <uses-permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL" /> <uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.REAL_GET_TASKS" /> <application> <uses-library android:name="android.test.runner" /> Loading apex/jobscheduler/framework/java/com/android/server/usage/AppStandbyInternal.java +3 −5 Original line number Diff line number Diff line Loading @@ -71,7 +71,7 @@ public interface AppStandbyInternal { */ void postOneTimeCheckIdleStates(); void reportEvent(UsageEvents.Event event, long elapsedRealtime, int userId); void reportEvent(UsageEvents.Event event, int userId); void setLastJobRunTime(String packageName, int userId, long elapsedRealtime); Loading Loading @@ -150,9 +150,7 @@ public interface AppStandbyInternal { void clearCarrierPrivilegedApps(); void flushToDisk(int userId); void flushDurationsToDisk(); void flushToDisk(); void initializeDefaultsForSystemApps(int userId); Loading @@ -162,7 +160,7 @@ public interface AppStandbyInternal { void postReportExemptedSyncStart(String packageName, int userId); void dumpUser(IndentingPrintWriter idpw, int userId, List<String> pkgs); void dumpUsers(IndentingPrintWriter idpw, int[] userIds, List<String> pkgs); void dumpState(String[] args, PrintWriter pw); Loading apex/jobscheduler/service/java/com/android/server/usage/AppIdleHistory.java +20 −2 Original line number Diff line number Diff line Loading @@ -675,6 +675,14 @@ public class AppIdleHistory { return Long.parseLong(value); } public void writeAppIdleTimes() { final int size = mIdleHistory.size(); for (int i = 0; i < size; i++) { writeAppIdleTimes(mIdleHistory.keyAt(i)); } } public void writeAppIdleTimes(int userId) { FileOutputStream fos = null; AtomicFile appIdleFile = new AtomicFile(getUserFile(userId)); Loading Loading @@ -743,7 +751,17 @@ public class AppIdleHistory { } } public void dump(IndentingPrintWriter idpw, int userId, List<String> pkgs) { public void dumpUsers(IndentingPrintWriter idpw, int[] userIds, List<String> pkgs) { final int numUsers = userIds.length; for (int i = 0; i < numUsers; i++) { idpw.println(); dumpUser(idpw, userIds[i], pkgs); } } private void dumpUser(IndentingPrintWriter idpw, int userId, List<String> pkgs) { idpw.print("User "); idpw.print(userId); idpw.println(" App Standby States:"); idpw.increaseIndent(); ArrayMap<String, AppUsageHistory> userHistory = mIdleHistory.get(userId); Loading apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java +30 −14 Original line number Diff line number Diff line Loading @@ -90,6 +90,7 @@ import android.os.Process; import android.os.RemoteException; import android.os.ServiceManager; import android.os.SystemClock; import android.os.Trace; import android.os.UserHandle; import android.provider.Settings.Global; import android.telephony.TelephonyManager; Loading Loading @@ -241,6 +242,14 @@ public class AppStandbyController implements AppStandbyInternal { private final CountDownLatch mAdminDataAvailableLatch = new CountDownLatch(1); // Cache the active network scorer queried from the network scorer service private volatile String mCachedNetworkScorer = null; // The last time the network scorer service was queried private volatile long mCachedNetworkScorerAtMillis = 0L; // How long before querying the network scorer again. During this time, subsequent queries will // get the cached value private static final long NETWORK_SCORER_CACHE_DURATION_MILLIS = 5000L; // Messages for the handler static final int MSG_INFORM_LISTENERS = 3; static final int MSG_FORCE_IDLE_STATE = 4; Loading Loading @@ -857,7 +866,7 @@ public class AppStandbyController implements AppStandbyInternal { } @Override public void reportEvent(UsageEvents.Event event, long elapsedRealtime, int userId) { public void reportEvent(UsageEvents.Event event, int userId) { if (!mAppIdleEnabled) return; final int eventType = event.getEventType(); if ((eventType == UsageEvents.Event.ACTIVITY_RESUMED Loading @@ -871,6 +880,7 @@ public class AppStandbyController implements AppStandbyInternal { final String pkg = event.getPackageName(); final List<UserHandle> linkedProfiles = getCrossProfileTargets(pkg, userId); synchronized (mAppIdleLock) { final long elapsedRealtime = mInjector.elapsedRealtime(); reportEventLocked(pkg, eventType, elapsedRealtime, userId); final int size = linkedProfiles.size(); Loading Loading @@ -1160,6 +1170,8 @@ public class AppStandbyController implements AppStandbyInternal { return new int[0]; } Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "getIdleUidsForUser"); final long elapsedRealtime = mInjector.elapsedRealtime(); List<ApplicationInfo> apps; Loading Loading @@ -1195,6 +1207,7 @@ public class AppStandbyController implements AppStandbyInternal { uidStates.setValueAt(index, value + 1 + (idle ? 1<<16 : 0)); } } if (DEBUG) { Slog.d(TAG, "getIdleUids took " + (mInjector.elapsedRealtime() - elapsedRealtime)); } Loading @@ -1216,6 +1229,8 @@ public class AppStandbyController implements AppStandbyInternal { } } Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER); return res; } Loading Loading @@ -1582,8 +1597,16 @@ public class AppStandbyController implements AppStandbyInternal { } private boolean isActiveNetworkScorer(String packageName) { String activeScorer = mInjector.getActiveNetworkScorer(); return packageName != null && packageName.equals(activeScorer); // Validity of network scorer cache is limited to a few seconds. Fetch it again // if longer since query. // This is a temporary optimization until there's a callback mechanism for changes to network scorer. final long now = SystemClock.elapsedRealtime(); if (mCachedNetworkScorer == null || mCachedNetworkScorerAtMillis < now - NETWORK_SCORER_CACHE_DURATION_MILLIS) { mCachedNetworkScorer = mInjector.getActiveNetworkScorer(); mCachedNetworkScorerAtMillis = now; } return packageName != null && packageName.equals(mCachedNetworkScorer); } private void informListeners(String packageName, int userId, int bucket, int reason, Loading @@ -1608,18 +1631,11 @@ public class AppStandbyController implements AppStandbyInternal { } } @Override public void flushToDisk(int userId) { synchronized (mAppIdleLock) { mAppIdleHistory.writeAppIdleTimes(userId); } } @Override public void flushDurationsToDisk() { // Persist elapsed and screen on time. If this fails for whatever reason, the apps will be // considered not-idle, which is the safest outcome in such an event. public void flushToDisk() { synchronized (mAppIdleLock) { mAppIdleHistory.writeAppIdleTimes(); mAppIdleHistory.writeAppIdleDurations(); } } Loading Loading @@ -1796,9 +1812,9 @@ public class AppStandbyController implements AppStandbyInternal { } @Override public void dumpUser(IndentingPrintWriter idpw, int userId, List<String> pkgs) { public void dumpUsers(IndentingPrintWriter idpw, int[] userIds, List<String> pkgs) { synchronized (mAppIdleLock) { mAppIdleHistory.dump(idpw, userId, pkgs); mAppIdleHistory.dumpUsers(idpw, userIds, pkgs); } } Loading Loading
apct-tests/perftests/multiuser/Android.bp +1 −0 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ android_test { srcs: ["src/**/*.java"], static_libs: [ "androidx.test.rules", "collector-device-lib-platform", "apct-perftests-utils", ], platform_apis: true, Loading
apct-tests/perftests/multiuser/AndroidManifest.xml +4 −0 Original line number Diff line number Diff line Loading @@ -17,12 +17,16 @@ <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.android.perftests.multiuser"> <uses-sdk android:targetSdkVersion="28" /> <uses-permission android:name="android.permission.CONTROL_KEYGUARD" /> <uses-permission android:name="android.permission.MANAGE_USERS" /> <uses-permission android:name="android.permission.INSTALL_PACKAGES" /> <uses-permission android:name="android.permission.INTERACT_ACROSS_USERS" /> <uses-permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL" /> <uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.REAL_GET_TASKS" /> <application> <uses-library android:name="android.test.runner" /> Loading
apex/jobscheduler/framework/java/com/android/server/usage/AppStandbyInternal.java +3 −5 Original line number Diff line number Diff line Loading @@ -71,7 +71,7 @@ public interface AppStandbyInternal { */ void postOneTimeCheckIdleStates(); void reportEvent(UsageEvents.Event event, long elapsedRealtime, int userId); void reportEvent(UsageEvents.Event event, int userId); void setLastJobRunTime(String packageName, int userId, long elapsedRealtime); Loading Loading @@ -150,9 +150,7 @@ public interface AppStandbyInternal { void clearCarrierPrivilegedApps(); void flushToDisk(int userId); void flushDurationsToDisk(); void flushToDisk(); void initializeDefaultsForSystemApps(int userId); Loading @@ -162,7 +160,7 @@ public interface AppStandbyInternal { void postReportExemptedSyncStart(String packageName, int userId); void dumpUser(IndentingPrintWriter idpw, int userId, List<String> pkgs); void dumpUsers(IndentingPrintWriter idpw, int[] userIds, List<String> pkgs); void dumpState(String[] args, PrintWriter pw); Loading
apex/jobscheduler/service/java/com/android/server/usage/AppIdleHistory.java +20 −2 Original line number Diff line number Diff line Loading @@ -675,6 +675,14 @@ public class AppIdleHistory { return Long.parseLong(value); } public void writeAppIdleTimes() { final int size = mIdleHistory.size(); for (int i = 0; i < size; i++) { writeAppIdleTimes(mIdleHistory.keyAt(i)); } } public void writeAppIdleTimes(int userId) { FileOutputStream fos = null; AtomicFile appIdleFile = new AtomicFile(getUserFile(userId)); Loading Loading @@ -743,7 +751,17 @@ public class AppIdleHistory { } } public void dump(IndentingPrintWriter idpw, int userId, List<String> pkgs) { public void dumpUsers(IndentingPrintWriter idpw, int[] userIds, List<String> pkgs) { final int numUsers = userIds.length; for (int i = 0; i < numUsers; i++) { idpw.println(); dumpUser(idpw, userIds[i], pkgs); } } private void dumpUser(IndentingPrintWriter idpw, int userId, List<String> pkgs) { idpw.print("User "); idpw.print(userId); idpw.println(" App Standby States:"); idpw.increaseIndent(); ArrayMap<String, AppUsageHistory> userHistory = mIdleHistory.get(userId); Loading
apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java +30 −14 Original line number Diff line number Diff line Loading @@ -90,6 +90,7 @@ import android.os.Process; import android.os.RemoteException; import android.os.ServiceManager; import android.os.SystemClock; import android.os.Trace; import android.os.UserHandle; import android.provider.Settings.Global; import android.telephony.TelephonyManager; Loading Loading @@ -241,6 +242,14 @@ public class AppStandbyController implements AppStandbyInternal { private final CountDownLatch mAdminDataAvailableLatch = new CountDownLatch(1); // Cache the active network scorer queried from the network scorer service private volatile String mCachedNetworkScorer = null; // The last time the network scorer service was queried private volatile long mCachedNetworkScorerAtMillis = 0L; // How long before querying the network scorer again. During this time, subsequent queries will // get the cached value private static final long NETWORK_SCORER_CACHE_DURATION_MILLIS = 5000L; // Messages for the handler static final int MSG_INFORM_LISTENERS = 3; static final int MSG_FORCE_IDLE_STATE = 4; Loading Loading @@ -857,7 +866,7 @@ public class AppStandbyController implements AppStandbyInternal { } @Override public void reportEvent(UsageEvents.Event event, long elapsedRealtime, int userId) { public void reportEvent(UsageEvents.Event event, int userId) { if (!mAppIdleEnabled) return; final int eventType = event.getEventType(); if ((eventType == UsageEvents.Event.ACTIVITY_RESUMED Loading @@ -871,6 +880,7 @@ public class AppStandbyController implements AppStandbyInternal { final String pkg = event.getPackageName(); final List<UserHandle> linkedProfiles = getCrossProfileTargets(pkg, userId); synchronized (mAppIdleLock) { final long elapsedRealtime = mInjector.elapsedRealtime(); reportEventLocked(pkg, eventType, elapsedRealtime, userId); final int size = linkedProfiles.size(); Loading Loading @@ -1160,6 +1170,8 @@ public class AppStandbyController implements AppStandbyInternal { return new int[0]; } Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "getIdleUidsForUser"); final long elapsedRealtime = mInjector.elapsedRealtime(); List<ApplicationInfo> apps; Loading Loading @@ -1195,6 +1207,7 @@ public class AppStandbyController implements AppStandbyInternal { uidStates.setValueAt(index, value + 1 + (idle ? 1<<16 : 0)); } } if (DEBUG) { Slog.d(TAG, "getIdleUids took " + (mInjector.elapsedRealtime() - elapsedRealtime)); } Loading @@ -1216,6 +1229,8 @@ public class AppStandbyController implements AppStandbyInternal { } } Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER); return res; } Loading Loading @@ -1582,8 +1597,16 @@ public class AppStandbyController implements AppStandbyInternal { } private boolean isActiveNetworkScorer(String packageName) { String activeScorer = mInjector.getActiveNetworkScorer(); return packageName != null && packageName.equals(activeScorer); // Validity of network scorer cache is limited to a few seconds. Fetch it again // if longer since query. // This is a temporary optimization until there's a callback mechanism for changes to network scorer. final long now = SystemClock.elapsedRealtime(); if (mCachedNetworkScorer == null || mCachedNetworkScorerAtMillis < now - NETWORK_SCORER_CACHE_DURATION_MILLIS) { mCachedNetworkScorer = mInjector.getActiveNetworkScorer(); mCachedNetworkScorerAtMillis = now; } return packageName != null && packageName.equals(mCachedNetworkScorer); } private void informListeners(String packageName, int userId, int bucket, int reason, Loading @@ -1608,18 +1631,11 @@ public class AppStandbyController implements AppStandbyInternal { } } @Override public void flushToDisk(int userId) { synchronized (mAppIdleLock) { mAppIdleHistory.writeAppIdleTimes(userId); } } @Override public void flushDurationsToDisk() { // Persist elapsed and screen on time. If this fails for whatever reason, the apps will be // considered not-idle, which is the safest outcome in such an event. public void flushToDisk() { synchronized (mAppIdleLock) { mAppIdleHistory.writeAppIdleTimes(); mAppIdleHistory.writeAppIdleDurations(); } } Loading Loading @@ -1796,9 +1812,9 @@ public class AppStandbyController implements AppStandbyInternal { } @Override public void dumpUser(IndentingPrintWriter idpw, int userId, List<String> pkgs) { public void dumpUsers(IndentingPrintWriter idpw, int[] userIds, List<String> pkgs) { synchronized (mAppIdleLock) { mAppIdleHistory.dump(idpw, userId, pkgs); mAppIdleHistory.dumpUsers(idpw, userIds, pkgs); } } Loading