summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apex/jobscheduler/framework/java/com/android/server/usage/AppStandbyInternal.java8
-rw-r--r--apex/jobscheduler/service/java/com/android/server/usage/AppIdleHistory.java22
-rw-r--r--apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java18
-rw-r--r--services/tests/servicestests/src/com/android/server/usage/AppStandbyControllerTests.java2
-rw-r--r--services/usage/java/com/android/server/usage/UsageStatsService.java117
5 files changed, 96 insertions, 71 deletions
diff --git a/apex/jobscheduler/framework/java/com/android/server/usage/AppStandbyInternal.java b/apex/jobscheduler/framework/java/com/android/server/usage/AppStandbyInternal.java
index 887d82c6413f..e15f0f37fc62 100644
--- a/apex/jobscheduler/framework/java/com/android/server/usage/AppStandbyInternal.java
+++ b/apex/jobscheduler/framework/java/com/android/server/usage/AppStandbyInternal.java
@@ -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);
@@ -150,9 +150,7 @@ public interface AppStandbyInternal {
void clearCarrierPrivilegedApps();
- void flushToDisk(int userId);
-
- void flushDurationsToDisk();
+ void flushToDisk();
void initializeDefaultsForSystemApps(int userId);
@@ -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);
diff --git a/apex/jobscheduler/service/java/com/android/server/usage/AppIdleHistory.java b/apex/jobscheduler/service/java/com/android/server/usage/AppIdleHistory.java
index 372ec981df02..70155ee84720 100644
--- a/apex/jobscheduler/service/java/com/android/server/usage/AppIdleHistory.java
+++ b/apex/jobscheduler/service/java/com/android/server/usage/AppIdleHistory.java
@@ -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));
@@ -743,8 +751,18 @@ public class AppIdleHistory {
}
}
- public void dump(IndentingPrintWriter idpw, int userId, List<String> pkgs) {
- idpw.println("App Standby States:");
+ 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);
final long elapsedRealtime = SystemClock.elapsedRealtime();
diff --git a/apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java b/apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java
index 5ceea2aedb85..7e60da6945fa 100644
--- a/apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java
+++ b/apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java
@@ -857,7 +857,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
@@ -871,6 +871,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();
@@ -1608,18 +1609,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();
}
}
@@ -1796,9 +1790,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);
}
}
diff --git a/services/tests/servicestests/src/com/android/server/usage/AppStandbyControllerTests.java b/services/tests/servicestests/src/com/android/server/usage/AppStandbyControllerTests.java
index 7d20da198371..1a04d2ff8c29 100644
--- a/services/tests/servicestests/src/com/android/server/usage/AppStandbyControllerTests.java
+++ b/services/tests/servicestests/src/com/android/server/usage/AppStandbyControllerTests.java
@@ -516,7 +516,7 @@ public class AppStandbyControllerTests {
UsageEvents.Event ev = new UsageEvents.Event();
ev.mPackage = packageName;
ev.mEventType = eventType;
- controller.reportEvent(ev, elapsedTime, USER_ID);
+ controller.reportEvent(ev, USER_ID);
}
private int getStandbyBucket(AppStandbyController controller, String packageName) {
diff --git a/services/usage/java/com/android/server/usage/UsageStatsService.java b/services/usage/java/com/android/server/usage/UsageStatsService.java
index a98da959aff9..321657d5d626 100644
--- a/services/usage/java/com/android/server/usage/UsageStatsService.java
+++ b/services/usage/java/com/android/server/usage/UsageStatsService.java
@@ -681,6 +681,8 @@ public class UsageStatsService extends SystemService implements
reportEventToAllUserId(event);
flushToDiskLocked();
}
+
+ mAppStandby.flushToDisk();
}
/**
@@ -806,8 +808,6 @@ public class UsageStatsService extends SystemService implements
return;
}
- final long elapsedRealtime = SystemClock.elapsedRealtime();
-
switch (event.mEventType) {
case Event.ACTIVITY_RESUMED:
FrameworkStatsLog.write(
@@ -914,9 +914,9 @@ public class UsageStatsService extends SystemService implements
return; // user was stopped or removed
}
service.reportEvent(event);
-
- mAppStandby.reportEvent(event, elapsedRealtime, userId);
}
+
+ mAppStandby.reportEvent(event, userId);
}
/**
@@ -948,6 +948,7 @@ public class UsageStatsService extends SystemService implements
reportEventToAllUserId(event);
flushToDiskLocked();
}
+ mAppStandby.flushToDisk();
}
/**
@@ -957,9 +958,9 @@ public class UsageStatsService extends SystemService implements
synchronized (mLock) {
Slog.i(TAG, "Removing user " + userId + " and all data.");
mUserState.remove(userId);
- mAppStandby.onUserRemoved(userId);
mAppTimeLimit.onUserRemoved(userId);
}
+ mAppStandby.onUserRemoved(userId);
// Cancel any scheduled jobs for this user since the user is being removed.
UsageStatsIdleService.cancelJob(getContext(), userId);
UsageStatsIdleService.cancelUpdateMappingsJob(getContext());
@@ -1158,10 +1159,7 @@ public class UsageStatsService extends SystemService implements
if (service != null) {
service.persistActiveStats();
}
- mAppStandby.flushToDisk(userId);
}
- mAppStandby.flushDurationsToDisk();
-
mHandler.removeMessages(MSG_FLUSH_TO_DISK);
}
@@ -1169,28 +1167,31 @@ public class UsageStatsService extends SystemService implements
* Called by the Binder stub.
*/
void dump(String[] args, PrintWriter pw) {
- synchronized (mLock) {
- IndentingPrintWriter idpw = new IndentingPrintWriter(pw, " ");
-
- boolean checkin = false;
- boolean compact = false;
- final ArrayList<String> pkgs = new ArrayList<>();
-
- if (args != null) {
- for (int i = 0; i < args.length; i++) {
- String arg = args[i];
- if ("--checkin".equals(arg)) {
- checkin = true;
- } else if ("-c".equals(arg)) {
- compact = true;
- } else if ("flush".equals(arg)) {
+ IndentingPrintWriter idpw = new IndentingPrintWriter(pw, " ");
+
+ boolean checkin = false;
+ boolean compact = false;
+ final ArrayList<String> pkgs = new ArrayList<>();
+
+ if (args != null) {
+ for (int i = 0; i < args.length; i++) {
+ String arg = args[i];
+ if ("--checkin".equals(arg)) {
+ checkin = true;
+ } else if ("-c".equals(arg)) {
+ compact = true;
+ } else if ("flush".equals(arg)) {
+ synchronized (mLock) {
flushToDiskLocked();
- pw.println("Flushed stats to disk");
- return;
- } else if ("is-app-standby-enabled".equals(arg)) {
- pw.println(mAppStandby.isAppIdleEnabled());
- return;
- } else if ("apptimelimit".equals(arg)) {
+ }
+ mAppStandby.flushToDisk();
+ pw.println("Flushed stats to disk");
+ return;
+ } else if ("is-app-standby-enabled".equals(arg)) {
+ pw.println(mAppStandby.isAppIdleEnabled());
+ return;
+ } else if ("apptimelimit".equals(arg)) {
+ synchronized (mLock) {
if (i + 1 >= args.length) {
mAppTimeLimit.dump(null, pw);
} else {
@@ -1199,8 +1200,10 @@ public class UsageStatsService extends SystemService implements
mAppTimeLimit.dump(remainingArgs, pw);
}
return;
- } else if ("file".equals(arg)) {
- final IndentingPrintWriter ipw = new IndentingPrintWriter(pw, " ");
+ }
+ } else if ("file".equals(arg)) {
+ final IndentingPrintWriter ipw = new IndentingPrintWriter(pw, " ");
+ synchronized (mLock) {
if (i + 1 >= args.length) {
// dump everything for all users
final int numUsers = mUserState.size();
@@ -1224,8 +1227,10 @@ public class UsageStatsService extends SystemService implements
}
}
return;
- } else if ("database-info".equals(arg)) {
- final IndentingPrintWriter ipw = new IndentingPrintWriter(pw, " ");
+ }
+ } else if ("database-info".equals(arg)) {
+ final IndentingPrintWriter ipw = new IndentingPrintWriter(pw, " ");
+ synchronized (mLock) {
if (i + 1 >= args.length) {
// dump info for all users
final int numUsers = mUserState.size();
@@ -1247,34 +1252,43 @@ public class UsageStatsService extends SystemService implements
}
}
return;
- } else if ("appstandby".equals(arg)) {
- mAppStandby.dumpState(args, pw);
- return;
- } else if ("stats-directory".equals(arg)) {
- final IndentingPrintWriter ipw = new IndentingPrintWriter(pw, " ");
+ }
+ } else if ("appstandby".equals(arg)) {
+ mAppStandby.dumpState(args, pw);
+ return;
+ } else if ("stats-directory".equals(arg)) {
+ final IndentingPrintWriter ipw = new IndentingPrintWriter(pw, " ");
+ synchronized (mLock) {
final int userId = parseUserIdFromArgs(args, i, ipw);
if (userId != UserHandle.USER_NULL) {
ipw.println(new File(Environment.getDataSystemCeDirectory(userId),
"usagestats").getAbsolutePath());
}
return;
- } else if ("mappings".equals(arg)) {
- final IndentingPrintWriter ipw = new IndentingPrintWriter(pw, " ");
- final int userId = parseUserIdFromArgs(args, i, ipw);
+ }
+ } else if ("mappings".equals(arg)) {
+ final IndentingPrintWriter ipw = new IndentingPrintWriter(pw, " ");
+ final int userId = parseUserIdFromArgs(args, i, ipw);
+ synchronized (mLock) {
if (userId != UserHandle.USER_NULL) {
mUserState.get(userId).dumpMappings(ipw);
}
return;
- } else if (arg != null && !arg.startsWith("-")) {
- // Anything else that doesn't start with '-' is a pkg to filter
- pkgs.add(arg);
}
+ } else if (arg != null && !arg.startsWith("-")) {
+ // Anything else that doesn't start with '-' is a pkg to filter
+ pkgs.add(arg);
}
}
+ }
+ final int[] userIds;
+ synchronized (mLock) {
final int userCount = mUserState.size();
+ userIds = new int[userCount];
for (int i = 0; i < userCount; i++) {
- int userId = mUserState.keyAt(i);
+ final int userId = mUserState.keyAt(i);
+ userIds[i] = userId;
idpw.printPair("user", userId);
idpw.println();
idpw.increaseIndent();
@@ -1286,21 +1300,22 @@ public class UsageStatsService extends SystemService implements
idpw.println();
}
}
- mAppStandby.dumpUser(idpw, userId, pkgs);
idpw.decreaseIndent();
}
- if (CollectionUtils.isEmpty(pkgs)) {
- pw.println();
- mAppStandby.dumpState(args, pw);
- }
-
idpw.println();
idpw.printPair("Usage Source", UsageStatsManager.usageSourceToString(mUsageSource));
idpw.println();
mAppTimeLimit.dump(null, pw);
}
+
+ mAppStandby.dumpUsers(idpw, userIds, pkgs);
+
+ if (CollectionUtils.isEmpty(pkgs)) {
+ pw.println();
+ mAppStandby.dumpState(args, pw);
+ }
}
private int parseUserIdFromArgs(String[] args, int index, IndentingPrintWriter ipw) {