Merge "Add a dumpsys for UsageStatsDatabase info." into qt-dev

am: 88f46c6cd6

Change-Id: Ieb6b1e1e08c117c87b6f5db9ff3edc101e7d766a
This commit is contained in:
Varun Shah
2019-05-10 00:38:06 -07:00
committed by android-build-merger
3 changed files with 156 additions and 0 deletions

View File

@@ -1172,4 +1172,16 @@ public class UsageStatsDatabase {
pw.decreaseIndent();
}
}
IntervalStats readIntervalStatsForFile(int interval, long fileName) {
synchronized (mLock) {
final IntervalStats stats = new IntervalStats();
try {
readLocked(mSortedStatFiles[interval].get(fileName, null), stats);
return stats;
} catch (Exception e) {
return null;
}
}
}
}

View File

@@ -774,6 +774,62 @@ public class UsageStatsService extends SystemService implements
mAppTimeLimit.dump(remainingArgs, pw);
}
return;
} else if ("file".equals(arg)) {
final IndentingPrintWriter ipw = new IndentingPrintWriter(pw, " ");
if (i + 1 >= args.length) {
// dump everything for all users
final int numUsers = mUserState.size();
for (int user = 0; user < numUsers; user++) {
ipw.println("user=" + mUserState.keyAt(user));
ipw.increaseIndent();
mUserState.valueAt(user).dumpFile(ipw, null);
ipw.decreaseIndent();
}
} else {
final int user;
try {
user = Integer.valueOf(args[i + 1]);
} catch (NumberFormatException nfe) {
ipw.println("invalid user specified.");
return;
}
if (mUserState.indexOfKey(user) < 0) {
ipw.println("the specified user does not exist.");
return;
}
final String[] remainingArgs = Arrays.copyOfRange(
args, i + 2, args.length);
// dump everything for the specified user
mUserState.get(user).dumpFile(ipw, remainingArgs);
}
return;
} else if ("database-info".equals(arg)) {
final IndentingPrintWriter ipw = new IndentingPrintWriter(pw, " ");
if (i + 1 >= args.length) {
// dump info for all users
final int numUsers = mUserState.size();
for (int user = 0; user < numUsers; user++) {
ipw.println("user=" + mUserState.keyAt(user));
ipw.increaseIndent();
mUserState.valueAt(user).dumpDatabaseInfo(ipw);
ipw.decreaseIndent();
}
} else {
final int user;
try {
user = Integer.valueOf(args[i + 1]);
} catch (NumberFormatException nfe) {
ipw.println("invalid user specified.");
return;
}
if (mUserState.indexOfKey(user) < 0) {
ipw.println("the specified user does not exist.");
return;
}
// dump info only for the specified user
mUserState.get(user).dumpDatabaseInfo(ipw);
}
return;
} else if (arg != null && !arg.startsWith("-")) {
// Anything else that doesn't start with '-' is a pkg to filter
pkg = arg;

View File

@@ -28,6 +28,7 @@ import static android.app.usage.UsageStatsManager.INTERVAL_YEARLY;
import android.app.usage.ConfigurationStats;
import android.app.usage.EventList;
import android.app.usage.EventStats;
import android.app.usage.TimeSparseArray;
import android.app.usage.UsageEvents;
import android.app.usage.UsageEvents.Event;
import android.app.usage.UsageStats;
@@ -38,6 +39,7 @@ import android.os.SystemClock;
import android.text.format.DateUtils;
import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.AtomicFile;
import android.util.Slog;
import android.util.SparseIntArray;
@@ -665,6 +667,77 @@ class UserUsageStatsService {
mDatabase.dump(pw, compact);
}
void dumpDatabaseInfo(IndentingPrintWriter ipw) {
mDatabase.dump(ipw, false);
}
void dumpFile(IndentingPrintWriter ipw, String[] args) {
if (args == null || args.length == 0) {
// dump all files for every interval for specified user
final int numIntervals = mDatabase.mSortedStatFiles.length;
for (int interval = 0; interval < numIntervals; interval++) {
ipw.println("interval=" + intervalToString(interval));
ipw.increaseIndent();
dumpFileDetailsForInterval(ipw, interval);
ipw.decreaseIndent();
}
} else {
final int interval;
try {
final int intervalValue = stringToInterval(args[0]);
if (intervalValue == -1) {
interval = Integer.valueOf(args[0]);
} else {
interval = intervalValue;
}
} catch (NumberFormatException nfe) {
ipw.println("invalid interval specified.");
return;
}
if (interval < 0 || interval >= mDatabase.mSortedStatFiles.length) {
ipw.println("the specified interval does not exist.");
return;
}
if (args.length == 1) {
// dump all files in the specified interval
dumpFileDetailsForInterval(ipw, interval);
} else {
// dump details only for the specified filename
final long filename;
try {
filename = Long.valueOf(args[1]);
} catch (NumberFormatException nfe) {
ipw.println("invalid filename specified.");
return;
}
final IntervalStats stats = mDatabase.readIntervalStatsForFile(interval, filename);
if (stats == null) {
ipw.println("the specified filename does not exist.");
return;
}
dumpFileDetails(ipw, stats, Long.valueOf(args[1]));
}
}
}
private void dumpFileDetailsForInterval(IndentingPrintWriter ipw, int interval) {
final TimeSparseArray<AtomicFile> files = mDatabase.mSortedStatFiles[interval];
final int numFiles = files.size();
for (int i = 0; i < numFiles; i++) {
final long filename = files.keyAt(i);
final IntervalStats stats = mDatabase.readIntervalStatsForFile(interval, filename);
dumpFileDetails(ipw, stats, filename);
ipw.println();
}
}
private void dumpFileDetails(IndentingPrintWriter ipw, IntervalStats stats, long filename) {
ipw.println("file=" + filename);
ipw.increaseIndent();
printIntervalStats(ipw, stats, false, false, null);
ipw.decreaseIndent();
}
static String formatDateTime(long dateTime, boolean pretty) {
if (pretty) {
return "\"" + sDateFormat.format(dateTime)+ "\"";
@@ -908,6 +981,21 @@ class UserUsageStatsService {
}
}
private static int stringToInterval(String interval) {
switch (interval.toLowerCase()) {
case "daily":
return INTERVAL_DAILY;
case "weekly":
return INTERVAL_WEEKLY;
case "monthly":
return INTERVAL_MONTHLY;
case "yearly":
return INTERVAL_YEARLY;
default:
return -1;
}
}
private static String eventToString(int eventType) {
switch (eventType) {
case Event.NONE: