diff options
3 files changed, 74 insertions, 16 deletions
diff --git a/core/java/android/os/BatteryUsageStats.java b/core/java/android/os/BatteryUsageStats.java index a5f8844a2921..cd52b5c0f7f3 100644 --- a/core/java/android/os/BatteryUsageStats.java +++ b/core/java/android/os/BatteryUsageStats.java @@ -115,6 +115,7 @@ public final class BatteryUsageStats implements Parcelable, Closeable { static final String XML_ATTR_HIGHEST_DRAIN_PACKAGE = "highest_drain_package"; static final String XML_ATTR_TIME_IN_FOREGROUND = "time_in_foreground"; static final String XML_ATTR_TIME_IN_BACKGROUND = "time_in_background"; + static final String XML_ATTR_TIME_IN_FOREGROUND_SERVICE = "time_in_foreground_service"; // We need about 700 bytes per UID private static final long BATTERY_CONSUMER_CURSOR_WINDOW_SIZE = 5_000 * 700; diff --git a/core/java/android/os/UidBatteryConsumer.java b/core/java/android/os/UidBatteryConsumer.java index 03a1b6f7fe01..3eea94eaf2e6 100644 --- a/core/java/android/os/UidBatteryConsumer.java +++ b/core/java/android/os/UidBatteryConsumer.java @@ -71,7 +71,8 @@ public final class UidBatteryConsumer extends BatteryConsumer { static final int COLUMN_INDEX_PACKAGE_WITH_HIGHEST_DRAIN = COLUMN_INDEX_UID + 1; static final int COLUMN_INDEX_TIME_IN_FOREGROUND = COLUMN_INDEX_UID + 2; static final int COLUMN_INDEX_TIME_IN_BACKGROUND = COLUMN_INDEX_UID + 3; - static final int COLUMN_COUNT = BatteryConsumer.COLUMN_COUNT + 4; + static final int COLUMN_INDEX_TIME_IN_FOREGROUND_SERVICE = COLUMN_INDEX_UID + 4; + static final int COLUMN_COUNT = BatteryConsumer.COLUMN_COUNT + 5; UidBatteryConsumer(BatteryConsumerData data) { super(data); @@ -92,17 +93,35 @@ public final class UidBatteryConsumer extends BatteryConsumer { /** * Returns the amount of time in milliseconds this UID spent in the specified state. + * @deprecated use {@link #getTimeInProcessStateMs} instead. */ + @Deprecated public long getTimeInStateMs(@State int state) { switch (state) { case STATE_BACKGROUND: - return mData.getInt(COLUMN_INDEX_TIME_IN_BACKGROUND); + return mData.getInt(COLUMN_INDEX_TIME_IN_BACKGROUND) + + mData.getInt(COLUMN_INDEX_TIME_IN_FOREGROUND_SERVICE); case STATE_FOREGROUND: return mData.getInt(COLUMN_INDEX_TIME_IN_FOREGROUND); } return 0; } + /** + * Returns the amount of time in milliseconds this UID spent in the specified process state. + */ + public long getTimeInProcessStateMs(@ProcessState int state) { + switch (state) { + case PROCESS_STATE_BACKGROUND: + return mData.getInt(COLUMN_INDEX_TIME_IN_BACKGROUND); + case PROCESS_STATE_FOREGROUND: + return mData.getInt(COLUMN_INDEX_TIME_IN_FOREGROUND); + case PROCESS_STATE_FOREGROUND_SERVICE: + return mData.getInt(COLUMN_INDEX_TIME_IN_FOREGROUND_SERVICE); + } + return 0; + } + @Override public void dump(PrintWriter pw, boolean skipEmptyComponents) { pw.print("UID "); @@ -158,9 +177,11 @@ public final class UidBatteryConsumer extends BatteryConsumer { packageWithHighestDrain); } serializer.attributeLong(null, BatteryUsageStats.XML_ATTR_TIME_IN_FOREGROUND, - getTimeInStateMs(STATE_FOREGROUND)); + getTimeInProcessStateMs(PROCESS_STATE_FOREGROUND)); serializer.attributeLong(null, BatteryUsageStats.XML_ATTR_TIME_IN_BACKGROUND, - getTimeInStateMs(STATE_BACKGROUND)); + getTimeInProcessStateMs(PROCESS_STATE_BACKGROUND)); + serializer.attributeLong(null, BatteryUsageStats.XML_ATTR_TIME_IN_FOREGROUND_SERVICE, + getTimeInProcessStateMs(PROCESS_STATE_FOREGROUND_SERVICE)); mPowerComponents.writeToXml(serializer); serializer.endTag(null, BatteryUsageStats.XML_TAG_UID); } @@ -180,10 +201,13 @@ public final class UidBatteryConsumer extends BatteryConsumer { consumerBuilder.setPackageWithHighestDrain( parser.getAttributeValue(null, BatteryUsageStats.XML_ATTR_HIGHEST_DRAIN_PACKAGE)); - consumerBuilder.setTimeInStateMs(STATE_FOREGROUND, + consumerBuilder.setTimeInProcessStateMs(PROCESS_STATE_FOREGROUND, parser.getAttributeLong(null, BatteryUsageStats.XML_ATTR_TIME_IN_FOREGROUND)); - consumerBuilder.setTimeInStateMs(STATE_BACKGROUND, + consumerBuilder.setTimeInProcessStateMs(PROCESS_STATE_BACKGROUND, parser.getAttributeLong(null, BatteryUsageStats.XML_ATTR_TIME_IN_BACKGROUND)); + consumerBuilder.setTimeInProcessStateMs(PROCESS_STATE_FOREGROUND_SERVICE, + parser.getAttributeLong(null, + BatteryUsageStats.XML_ATTR_TIME_IN_FOREGROUND_SERVICE)); while (!(eventType == XmlPullParser.END_TAG && parser.getName().equals(BatteryUsageStats.XML_TAG_UID)) && eventType != XmlPullParser.END_DOCUMENT) { @@ -255,7 +279,9 @@ public final class UidBatteryConsumer extends BatteryConsumer { /** * Sets the duration, in milliseconds, that this UID was active in a particular state, * such as foreground or background. + * @deprecated use {@link #setTimeInProcessStateMs} instead. */ + @Deprecated @NonNull public Builder setTimeInStateMs(@State int state, long timeInStateMs) { switch (state) { @@ -272,6 +298,28 @@ public final class UidBatteryConsumer extends BatteryConsumer { } /** + * Sets the duration, in milliseconds, that this UID was active in a particular process + * state, such as foreground service. + */ + @NonNull + public Builder setTimeInProcessStateMs(@ProcessState int state, long timeInProcessStateMs) { + switch (state) { + case PROCESS_STATE_FOREGROUND: + mData.putLong(COLUMN_INDEX_TIME_IN_FOREGROUND, timeInProcessStateMs); + break; + case PROCESS_STATE_BACKGROUND: + mData.putLong(COLUMN_INDEX_TIME_IN_BACKGROUND, timeInProcessStateMs); + break; + case PROCESS_STATE_FOREGROUND_SERVICE: + mData.putLong(COLUMN_INDEX_TIME_IN_FOREGROUND_SERVICE, timeInProcessStateMs); + break; + default: + throw new IllegalArgumentException("Unsupported process state: " + state); + } + return this; + } + + /** * Marks the UidBatteryConsumer for exclusion from the result set. */ public Builder excludeFromBatteryUsageStats() { @@ -285,12 +333,15 @@ public final class UidBatteryConsumer extends BatteryConsumer { public Builder add(UidBatteryConsumer consumer) { mPowerComponentsBuilder.addPowerAndDuration(consumer.mPowerComponents); - setTimeInStateMs(STATE_FOREGROUND, + setTimeInProcessStateMs(PROCESS_STATE_FOREGROUND, mData.getLong(COLUMN_INDEX_TIME_IN_FOREGROUND) - + consumer.getTimeInStateMs(STATE_FOREGROUND)); - setTimeInStateMs(STATE_BACKGROUND, + + consumer.getTimeInProcessStateMs(PROCESS_STATE_FOREGROUND)); + setTimeInProcessStateMs(PROCESS_STATE_BACKGROUND, mData.getLong(COLUMN_INDEX_TIME_IN_BACKGROUND) - + consumer.getTimeInStateMs(STATE_BACKGROUND)); + + consumer.getTimeInProcessStateMs(PROCESS_STATE_BACKGROUND)); + setTimeInProcessStateMs(PROCESS_STATE_FOREGROUND_SERVICE, + mData.getLong(COLUMN_INDEX_TIME_IN_FOREGROUND_SERVICE) + + consumer.getTimeInProcessStateMs(PROCESS_STATE_FOREGROUND_SERVICE)); if (mPackageWithHighestDrain == PACKAGE_NAME_UNINITIALIZED) { mPackageWithHighestDrain = consumer.getPackageWithHighestDrain(); diff --git a/services/core/java/com/android/server/power/stats/BatteryUsageStatsProvider.java b/services/core/java/com/android/server/power/stats/BatteryUsageStatsProvider.java index 851a3f7bdaba..83d7d72059b4 100644 --- a/services/core/java/com/android/server/power/stats/BatteryUsageStatsProvider.java +++ b/services/core/java/com/android/server/power/stats/BatteryUsageStatsProvider.java @@ -188,10 +188,12 @@ public class BatteryUsageStatsProvider { } batteryUsageStatsBuilder.getOrCreateUidBatteryConsumerBuilder(uid) - .setTimeInStateMs(UidBatteryConsumer.STATE_BACKGROUND, + .setTimeInProcessStateMs(UidBatteryConsumer.PROCESS_STATE_BACKGROUND, getProcessBackgroundTimeMs(uid, realtimeUs)) - .setTimeInStateMs(UidBatteryConsumer.STATE_FOREGROUND, - getProcessForegroundTimeMs(uid, realtimeUs)); + .setTimeInProcessStateMs(UidBatteryConsumer.PROCESS_STATE_FOREGROUND, + getProcessForegroundTimeMs(uid, realtimeUs)) + .setTimeInProcessStateMs(UidBatteryConsumer.PROCESS_STATE_FOREGROUND_SERVICE, + getProcessForegroundServiceTimeMs(uid, realtimeUs)); } final int[] powerComponents = query.getPowerComponents(); @@ -295,10 +297,14 @@ public class BatteryUsageStatsProvider { } private long getProcessBackgroundTimeMs(BatteryStats.Uid uid, long realtimeUs) { - return (uid.getProcessStateTime(BatteryStats.Uid.PROCESS_STATE_BACKGROUND, + return uid.getProcessStateTime(BatteryStats.Uid.PROCESS_STATE_BACKGROUND, + realtimeUs, BatteryStats.STATS_SINCE_CHARGED) + / 1000; + } + + private long getProcessForegroundServiceTimeMs(BatteryStats.Uid uid, long realtimeUs) { + return uid.getProcessStateTime(BatteryStats.Uid.PROCESS_STATE_FOREGROUND_SERVICE, realtimeUs, BatteryStats.STATS_SINCE_CHARGED) - + uid.getProcessStateTime(BatteryStats.Uid.PROCESS_STATE_FOREGROUND_SERVICE, - realtimeUs, BatteryStats.STATS_SINCE_CHARGED)) / 1000; } |