Loading core/java/android/os/BatteryUsageStats.java +1 −0 Original line number Diff line number Diff line Loading @@ -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; Loading core/java/android/os/UidBatteryConsumer.java +61 −10 Original line number Diff line number Diff line Loading @@ -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); Loading @@ -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 "); Loading Loading @@ -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); } Loading @@ -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) { Loading Loading @@ -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) { Loading @@ -271,6 +297,28 @@ public final class UidBatteryConsumer extends BatteryConsumer { return this; } /** * 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. */ Loading @@ -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(); Loading services/core/java/com/android/server/power/stats/BatteryUsageStatsProvider.java +12 −6 Original line number Diff line number Diff line Loading @@ -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(); Loading Loading @@ -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; } Loading Loading
core/java/android/os/BatteryUsageStats.java +1 −0 Original line number Diff line number Diff line Loading @@ -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; Loading
core/java/android/os/UidBatteryConsumer.java +61 −10 Original line number Diff line number Diff line Loading @@ -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); Loading @@ -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 "); Loading Loading @@ -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); } Loading @@ -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) { Loading Loading @@ -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) { Loading @@ -271,6 +297,28 @@ public final class UidBatteryConsumer extends BatteryConsumer { return this; } /** * 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. */ Loading @@ -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(); Loading
services/core/java/com/android/server/power/stats/BatteryUsageStatsProvider.java +12 −6 Original line number Diff line number Diff line Loading @@ -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(); Loading Loading @@ -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; } Loading