Loading core/java/android/os/BatteryStats.java +148 −55 Original line number Diff line number Diff line Loading @@ -52,10 +52,9 @@ import android.util.proto.ProtoOutputStream; import android.view.Display; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.os.BatterySipper; import com.android.internal.os.BatteryStatsHelper; import com.android.internal.os.BatteryUsageStatsProvider; import com.android.internal.os.PowerCalculator; import com.google.android.collect.Lists; import java.io.FileDescriptor; import java.io.PrintWriter; Loading @@ -70,6 +69,7 @@ import java.util.Formatter; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Locale; import java.util.Map; /** Loading Loading @@ -3539,6 +3539,44 @@ public abstract class BatteryStats implements Parcelable { } } /** * Converts charge in mAh to string. */ public static String formatCharge(double power) { return formatValue(power); } /** * Converts double to string, limiting small values to 3 significant figures. */ private static String formatValue(double value) { if (value == 0) return "0"; final String format; if (value < .00001) { format = "%.8f"; } else if (value < .0001) { format = "%.7f"; } else if (value < .001) { format = "%.6f"; } else if (value < .01) { format = "%.5f"; } else if (value < .1) { format = "%.4f"; } else if (value < 1) { format = "%.3f"; } else if (value < 10) { format = "%.2f"; } else if (value < 100) { format = "%.1f"; } else { format = "%.0f"; } // Use English locale because this is never used in UI (only in checkin and dump). return String.format(Locale.ENGLISH, format, value); } private static long roundUsToMs(long timeUs) { return (timeUs + 500) / 1000; } Loading Loading @@ -4025,7 +4063,7 @@ public abstract class BatteryStats implements Parcelable { sb.append(" "); sb.append(controllerName); sb.append(" Battery drain: ").append( PowerCalculator.formatCharge(powerDrainMaMs / MILLISECONDS_IN_HOUR)); formatCharge(powerDrainMaMs / MILLISECONDS_IN_HOUR)); sb.append("mAh"); pw.println(sb.toString()); } Loading Loading @@ -4424,10 +4462,10 @@ public abstract class BatteryStats implements Parcelable { final BatteryUsageStats stats = getBatteryUsageStats(context); dumpLine(pw, 0 /* uid */, category, POWER_USE_SUMMARY_DATA, PowerCalculator.formatCharge(stats.getBatteryCapacity()), PowerCalculator.formatCharge(stats.getConsumedPower()), PowerCalculator.formatCharge(stats.getDischargedPowerRange().getLower()), PowerCalculator.formatCharge(stats.getDischargedPowerRange().getUpper())); formatCharge(stats.getBatteryCapacity()), formatCharge(stats.getConsumedPower()), formatCharge(stats.getDischargedPowerRange().getLower()), formatCharge(stats.getDischargedPowerRange().getUpper())); final BatteryConsumer deviceConsumer = stats.getAggregateBatteryConsumer( BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_DEVICE); for (@BatteryConsumer.PowerComponent int powerComponent = 0; Loading @@ -4437,7 +4475,7 @@ public abstract class BatteryStats implements Parcelable { label = "???"; } dumpLine(pw, 0 /* uid */, category, POWER_USE_ITEM_DATA, label, PowerCalculator.formatCharge(deviceConsumer.getConsumedPower(powerComponent)), formatCharge(deviceConsumer.getConsumedPower(powerComponent)), shouldHidePowerComponent(powerComponent) ? 1 : 0, "0", "0"); } Loading @@ -4447,11 +4485,10 @@ public abstract class BatteryStats implements Parcelable { for (int i = 0; i < uidBatteryConsumers.size(); i++) { UidBatteryConsumer consumer = uidBatteryConsumers.get(i); dumpLine(pw, consumer.getUid(), category, POWER_USE_ITEM_DATA, "uid", PowerCalculator.formatCharge(consumer.getConsumedPower()), formatCharge(consumer.getConsumedPower()), proportionalAttributionCalculator.isSystemBatteryConsumer(consumer) ? 1 : 0, PowerCalculator.formatCharge( consumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_SCREEN)), PowerCalculator.formatCharge( formatCharge(consumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_SCREEN)), formatCharge( proportionalAttributionCalculator.getProportionalPowerMah(consumer))); } Loading Loading @@ -4885,11 +4922,11 @@ public abstract class BatteryStats implements Parcelable { } private void printmAh(PrintWriter printer, double power) { printer.print(PowerCalculator.formatCharge(power)); printer.print(formatCharge(power)); } private void printmAh(StringBuilder sb, double power) { sb.append(PowerCalculator.formatCharge(power)); sb.append(formatCharge(power)); } /** Loading Loading @@ -4936,7 +4973,7 @@ public abstract class BatteryStats implements Parcelable { sb.setLength(0); sb.append(prefix); sb.append(" Estimated battery capacity: "); sb.append(PowerCalculator.formatCharge(estimatedBatteryCapacity)); sb.append(formatCharge(estimatedBatteryCapacity)); sb.append(" mAh"); pw.println(sb.toString()); } Loading @@ -4946,7 +4983,7 @@ public abstract class BatteryStats implements Parcelable { sb.setLength(0); sb.append(prefix); sb.append(" Last learned battery capacity: "); sb.append(PowerCalculator.formatCharge(lastLearnedBatteryCapacity / 1000)); sb.append(formatCharge(lastLearnedBatteryCapacity / 1000)); sb.append(" mAh"); pw.println(sb.toString()); } Loading @@ -4955,7 +4992,7 @@ public abstract class BatteryStats implements Parcelable { sb.setLength(0); sb.append(prefix); sb.append(" Min learned battery capacity: "); sb.append(PowerCalculator.formatCharge(minLearnedBatteryCapacity / 1000)); sb.append(formatCharge(minLearnedBatteryCapacity / 1000)); sb.append(" mAh"); pw.println(sb.toString()); } Loading @@ -4964,7 +5001,7 @@ public abstract class BatteryStats implements Parcelable { sb.setLength(0); sb.append(prefix); sb.append(" Max learned battery capacity: "); sb.append(PowerCalculator.formatCharge(maxLearnedBatteryCapacity / 1000)); sb.append(formatCharge(maxLearnedBatteryCapacity / 1000)); sb.append(" mAh"); pw.println(sb.toString()); } Loading Loading @@ -5028,7 +5065,7 @@ public abstract class BatteryStats implements Parcelable { sb.setLength(0); sb.append(prefix); sb.append(" Discharge: "); sb.append(PowerCalculator.formatCharge(dischargeCount / 1000.0)); sb.append(formatCharge(dischargeCount / 1000.0)); sb.append(" mAh"); pw.println(sb.toString()); } Loading @@ -5038,7 +5075,7 @@ public abstract class BatteryStats implements Parcelable { sb.setLength(0); sb.append(prefix); sb.append(" Screen off discharge: "); sb.append(PowerCalculator.formatCharge(dischargeScreenOffCount / 1000.0)); sb.append(formatCharge(dischargeScreenOffCount / 1000.0)); sb.append(" mAh"); pw.println(sb.toString()); } Loading @@ -5048,7 +5085,7 @@ public abstract class BatteryStats implements Parcelable { sb.setLength(0); sb.append(prefix); sb.append(" Screen doze discharge: "); sb.append(PowerCalculator.formatCharge(dischargeScreenDozeCount / 1000.0)); sb.append(formatCharge(dischargeScreenDozeCount / 1000.0)); sb.append(" mAh"); pw.println(sb.toString()); } Loading @@ -5058,7 +5095,7 @@ public abstract class BatteryStats implements Parcelable { sb.setLength(0); sb.append(prefix); sb.append(" Screen on discharge: "); sb.append(PowerCalculator.formatCharge(dischargeScreenOnCount / 1000.0)); sb.append(formatCharge(dischargeScreenOnCount / 1000.0)); sb.append(" mAh"); pw.println(sb.toString()); } Loading @@ -5068,7 +5105,7 @@ public abstract class BatteryStats implements Parcelable { sb.setLength(0); sb.append(prefix); sb.append(" Device light doze discharge: "); sb.append(PowerCalculator.formatCharge(dischargeLightDozeCount / 1000.0)); sb.append(formatCharge(dischargeLightDozeCount / 1000.0)); sb.append(" mAh"); pw.println(sb.toString()); } Loading @@ -5078,7 +5115,7 @@ public abstract class BatteryStats implements Parcelable { sb.setLength(0); sb.append(prefix); sb.append(" Device deep doze discharge: "); sb.append(PowerCalculator.formatCharge(dischargeDeepDozeCount / 1000.0)); sb.append(formatCharge(dischargeDeepDozeCount / 1000.0)); sb.append(" mAh"); pw.println(sb.toString()); } Loading Loading @@ -5212,7 +5249,7 @@ public abstract class BatteryStats implements Parcelable { for (int iu = 0; iu < NU; iu++) { final Uid u = uidStats.valueAt(iu); final ArrayMap<String, ? extends BatteryStats.Uid.Wakelock> wakelocks final ArrayMap<String, ? extends Uid.Wakelock> wakelocks = u.getWakelockStats(); for (int iw=wakelocks.size()-1; iw>=0; iw--) { final Uid.Wakelock wl = wakelocks.valueAt(iw); Loading Loading @@ -5621,34 +5658,38 @@ public abstract class BatteryStats implements Parcelable { .build()); stats.dump(pw, prefix); final BatteryStatsHelper helper = new BatteryStatsHelper(context, false, wifiOnly); helper.create(this); helper.refreshStats(which, UserHandle.USER_ALL); final List<BatterySipper> sippers = helper.getMobilemsppList(); if (sippers != null && sippers.size() > 0) { pw.print(prefix); pw.println(" Per-app mobile ms per packet:"); List<UidMobileRadioStats> uidMobileRadioStats = getUidMobileRadioStats(stats.getUidBatteryConsumers()); if (uidMobileRadioStats.size() > 0) { pw.print(prefix); pw.println(" Per-app mobile ms per packet:"); long totalTime = 0; for (int i=0; i<sippers.size(); i++) { final BatterySipper bs = sippers.get(i); for (int i = 0; i < uidMobileRadioStats.size(); i++) { final UidMobileRadioStats mrs = uidMobileRadioStats.get(i); sb.setLength(0); sb.append(prefix); sb.append(" Uid "); UserHandle.formatUid(sb, bs.uidObj.getUid()); sb.append(prefix); sb.append(" Uid "); UserHandle.formatUid(sb, mrs.uid); sb.append(": "); sb.append(PowerCalculator.formatCharge(bs.mobilemspp)); sb.append(" ("); sb.append(bs.mobileRxPackets+bs.mobileTxPackets); sb.append(" packets over "); formatTimeMsNoSpace(sb, bs.mobileActive); sb.append(") "); sb.append(bs.mobileActiveCount); sb.append("x"); pw.println(sb.toString()); totalTime += bs.mobileActive; sb.append(formatValue(mrs.millisecondsPerPacket)); sb.append(" ("); sb.append(mrs.rxPackets + mrs.txPackets); sb.append(" packets over "); formatTimeMsNoSpace(sb, mrs.radioActiveMs); sb.append(") "); sb.append(mrs.radioActiveCount); sb.append("x"); pw.println(sb); totalTime += mrs.radioActiveMs; } sb.setLength(0); sb.append(prefix); sb.append(" TOTAL TIME: "); formatTimeMs(sb, totalTime); sb.append("("); sb.append(formatRatioLocked(totalTime, whichBatteryRealtime)); sb.append("("); sb.append(formatRatioLocked(totalTime, whichBatteryRealtime)); sb.append(")"); pw.println(sb.toString()); pw.println(sb); pw.println(); } Loading @@ -5668,13 +5709,13 @@ public abstract class BatteryStats implements Parcelable { }; if (reqUid < 0) { final Map<String, ? extends BatteryStats.Timer> kernelWakelocks final Map<String, ? extends Timer> kernelWakelocks = getKernelWakelockStats(); if (kernelWakelocks.size() > 0) { final ArrayList<TimerEntry> ktimers = new ArrayList<>(); for (Map.Entry<String, ? extends BatteryStats.Timer> ent for (Map.Entry<String, ? extends Timer> ent : kernelWakelocks.entrySet()) { final BatteryStats.Timer timer = ent.getValue(); final Timer timer = ent.getValue(); final long totalTimeMillis = computeWakeLock(timer, rawRealtime, which); if (totalTimeMillis > 0) { ktimers.add(new TimerEntry(ent.getKey(), 0, timer, totalTimeMillis)); Loading Loading @@ -5859,8 +5900,7 @@ public abstract class BatteryStats implements Parcelable { packets = 1; } sb.append(" @ "); sb.append(PowerCalculator.formatCharge( uidMobileActiveTime / 1000 / (double) packets)); sb.append(formatCharge(uidMobileActiveTime / 1000 / (double) packets)); sb.append(" mspp"); pw.println(sb.toString()); } Loading Loading @@ -6068,7 +6108,7 @@ public abstract class BatteryStats implements Parcelable { } } final ArrayMap<String, ? extends BatteryStats.Uid.Wakelock> wakelocks final ArrayMap<String, ? extends Uid.Wakelock> wakelocks = u.getWakelockStats(); long totalFullWakelock = 0, totalPartialWakelock = 0, totalWindowWakelock = 0; long totalDrawWakelock = 0; Loading Loading @@ -6296,7 +6336,7 @@ public abstract class BatteryStats implements Parcelable { uidActivity |= printTimer(pw, sb, u.getAudioTurnedOnTimer(), rawRealtime, which, prefix, "Audio"); final SparseArray<? extends BatteryStats.Uid.Sensor> sensors = u.getSensorStats(); final SparseArray<? extends Uid.Sensor> sensors = u.getSensorStats(); final int NSE = sensors.size(); for (int ise=0; ise<NSE; ise++) { final Uid.Sensor se = sensors.valueAt(ise); Loading Loading @@ -6439,7 +6479,7 @@ public abstract class BatteryStats implements Parcelable { } } final ArrayMap<String, ? extends BatteryStats.Uid.Proc> processStats final ArrayMap<String, ? extends Uid.Proc> processStats = u.getProcessStats(); for (int ipr=processStats.size()-1; ipr>=0; ipr--) { final Uid.Proc ps = processStats.valueAt(ipr); Loading Loading @@ -6513,7 +6553,7 @@ public abstract class BatteryStats implements Parcelable { } } final ArrayMap<String, ? extends BatteryStats.Uid.Pkg> packageStats final ArrayMap<String, ? extends Uid.Pkg> packageStats = u.getPackageStats(); for (int ipkg=packageStats.size()-1; ipkg>=0; ipkg--) { pw.print(prefix); pw.print(" Apk "); pw.print(packageStats.keyAt(ipkg)); Loading @@ -6530,7 +6570,7 @@ public abstract class BatteryStats implements Parcelable { } final ArrayMap<String, ? extends Uid.Pkg.Serv> serviceStats = ps.getServiceStats(); for (int isvc=serviceStats.size()-1; isvc>=0; isvc--) { final BatteryStats.Uid.Pkg.Serv ss = serviceStats.valueAt(isvc); final Uid.Pkg.Serv ss = serviceStats.valueAt(isvc); final long startTime = ss.getStartTime(batteryUptime, which); final int starts = ss.getStarts(which); final int launches = ss.getLaunches(which); Loading Loading @@ -8652,4 +8692,57 @@ public abstract class BatteryStats implements Parcelable { return false; } } private static class UidMobileRadioStats { public final int uid; public final long rxPackets; public final long txPackets; public final long radioActiveMs; public final int radioActiveCount; public final double millisecondsPerPacket; private UidMobileRadioStats(int uid, long rxPackets, long txPackets, long radioActiveMs, int radioActiveCount, double millisecondsPerPacket) { this.uid = uid; this.txPackets = txPackets; this.rxPackets = rxPackets; this.radioActiveMs = radioActiveMs; this.radioActiveCount = radioActiveCount; this.millisecondsPerPacket = millisecondsPerPacket; } } private List<UidMobileRadioStats> getUidMobileRadioStats( List<UidBatteryConsumer> uidBatteryConsumers) { final SparseArray<? extends Uid> uidStats = getUidStats(); List<UidMobileRadioStats> uidMobileRadioStats = Lists.newArrayList(); for (int i = 0; i < uidBatteryConsumers.size(); i++) { final UidBatteryConsumer consumer = uidBatteryConsumers.get(i); if (consumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO) == 0) { continue; } final int uid = consumer.getUid(); final Uid u = uidStats.get(uid); final long rxPackets = u.getNetworkActivityPackets( BatteryStats.NETWORK_MOBILE_RX_DATA, STATS_SINCE_CHARGED); final long txPackets = u.getNetworkActivityPackets( BatteryStats.NETWORK_MOBILE_TX_DATA, STATS_SINCE_CHARGED); if (rxPackets == 0 && txPackets == 0) { continue; } final long radioActiveMs = u.getMobileRadioActiveTime(STATS_SINCE_CHARGED) / 1000; final int radioActiveCount = u.getMobileRadioActiveCount(STATS_SINCE_CHARGED); final double msPerPacket = (double) radioActiveMs / (rxPackets + txPackets); if (msPerPacket == 0) { continue; } uidMobileRadioStats.add( new UidMobileRadioStats(uid, rxPackets, txPackets, radioActiveMs, radioActiveCount, msPerPacket)); } uidMobileRadioStats.sort( (lhs, rhs) -> Double.compare(rhs.millisecondsPerPacket, lhs.millisecondsPerPacket)); return uidMobileRadioStats; } } core/java/android/os/BatteryUsageStats.java +3 −2 Original line number Diff line number Diff line Loading @@ -597,20 +597,21 @@ public final class BatteryUsageStats implements Parcelable, Closeable { dumpSortedBatteryConsumers(pw, prefix, getUidBatteryConsumers()); dumpSortedBatteryConsumers(pw, prefix, getUserBatteryConsumers()); pw.println(); } private void printPowerComponent(PrintWriter pw, String prefix, String label, double devicePowerMah, double appsPowerMah, int powerModel, long durationMs) { StringBuilder sb = new StringBuilder(); sb.append(prefix).append(" ").append(label).append(": ") .append(PowerCalculator.formatCharge(devicePowerMah)); .append(BatteryStats.formatCharge(devicePowerMah)); if (powerModel != BatteryConsumer.POWER_MODEL_UNDEFINED && powerModel != BatteryConsumer.POWER_MODEL_POWER_PROFILE) { sb.append(" ["); sb.append(BatteryConsumer.powerModelToString(powerModel)); sb.append("]"); } sb.append(" apps: ").append(PowerCalculator.formatCharge(appsPowerMah)); sb.append(" apps: ").append(BatteryStats.formatCharge(appsPowerMah)); if (durationMs != 0) { sb.append(" duration: "); BatteryStats.formatTimeMs(sb, durationMs); Loading core/java/android/os/PowerComponents.java +2 −4 Original line number Diff line number Diff line Loading @@ -26,8 +26,6 @@ import android.util.TypedXmlPullParser; import android.util.TypedXmlSerializer; import android.util.proto.ProtoOutputStream; import com.android.internal.os.PowerCalculator; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; Loading Loading @@ -170,7 +168,7 @@ class PowerComponents { separator = " "; sb.append(key.toShortString()); sb.append("="); sb.append(PowerCalculator.formatCharge(componentPower)); sb.append(BatteryStats.formatCharge(componentPower)); if (durationMs != 0) { sb.append(" ("); Loading @@ -194,7 +192,7 @@ class PowerComponents { separator = " "; sb.append(getCustomPowerComponentName(customComponentId)); sb.append("="); sb.append(PowerCalculator.formatCharge(customComponentPower)); sb.append(BatteryStats.formatCharge(customComponentPower)); } pw.print(sb); Loading core/java/android/os/UidBatteryConsumer.java +1 −1 Original line number Diff line number Diff line Loading @@ -136,7 +136,7 @@ public final class UidBatteryConsumer extends BatteryConsumer { } sb.append(" ").append(processStateToString(processState)).append(": ") .append(PowerCalculator.formatCharge(power)); .append(BatteryStats.formatCharge(power)); } static UidBatteryConsumer create(BatteryConsumerData data) { Loading core/java/com/android/internal/os/BatteryStatsHelper.java +4 −4 Original line number Diff line number Diff line Loading @@ -396,9 +396,9 @@ public class BatteryStatsHelper { } if (DEBUG) { Log.d(TAG, "Accuracy: total computed=" + PowerCalculator.formatCharge(mComputedPower) + ", min discharge=" + PowerCalculator.formatCharge(mMinDrainedPower) + ", max discharge=" + PowerCalculator.formatCharge(mMaxDrainedPower)); Log.d(TAG, "Accuracy: total computed=" + BatteryStats.formatCharge(mComputedPower) + ", min discharge=" + BatteryStats.formatCharge(mMinDrainedPower) + ", max discharge=" + BatteryStats.formatCharge(mMaxDrainedPower)); } mTotalPower = mComputedPower; Loading Loading @@ -466,7 +466,7 @@ public class BatteryStatsHelper { final double totalPower = sipper.sumPower(); if (DEBUG && totalPower != 0) { Log.d(TAG, String.format("UID %d: total power=%s", sipper.getUid(), PowerCalculator.formatCharge(totalPower))); BatteryStats.formatCharge(totalPower))); } // Add the sipper to the list if it is consuming power. Loading Loading
core/java/android/os/BatteryStats.java +148 −55 Original line number Diff line number Diff line Loading @@ -52,10 +52,9 @@ import android.util.proto.ProtoOutputStream; import android.view.Display; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.os.BatterySipper; import com.android.internal.os.BatteryStatsHelper; import com.android.internal.os.BatteryUsageStatsProvider; import com.android.internal.os.PowerCalculator; import com.google.android.collect.Lists; import java.io.FileDescriptor; import java.io.PrintWriter; Loading @@ -70,6 +69,7 @@ import java.util.Formatter; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Locale; import java.util.Map; /** Loading Loading @@ -3539,6 +3539,44 @@ public abstract class BatteryStats implements Parcelable { } } /** * Converts charge in mAh to string. */ public static String formatCharge(double power) { return formatValue(power); } /** * Converts double to string, limiting small values to 3 significant figures. */ private static String formatValue(double value) { if (value == 0) return "0"; final String format; if (value < .00001) { format = "%.8f"; } else if (value < .0001) { format = "%.7f"; } else if (value < .001) { format = "%.6f"; } else if (value < .01) { format = "%.5f"; } else if (value < .1) { format = "%.4f"; } else if (value < 1) { format = "%.3f"; } else if (value < 10) { format = "%.2f"; } else if (value < 100) { format = "%.1f"; } else { format = "%.0f"; } // Use English locale because this is never used in UI (only in checkin and dump). return String.format(Locale.ENGLISH, format, value); } private static long roundUsToMs(long timeUs) { return (timeUs + 500) / 1000; } Loading Loading @@ -4025,7 +4063,7 @@ public abstract class BatteryStats implements Parcelable { sb.append(" "); sb.append(controllerName); sb.append(" Battery drain: ").append( PowerCalculator.formatCharge(powerDrainMaMs / MILLISECONDS_IN_HOUR)); formatCharge(powerDrainMaMs / MILLISECONDS_IN_HOUR)); sb.append("mAh"); pw.println(sb.toString()); } Loading Loading @@ -4424,10 +4462,10 @@ public abstract class BatteryStats implements Parcelable { final BatteryUsageStats stats = getBatteryUsageStats(context); dumpLine(pw, 0 /* uid */, category, POWER_USE_SUMMARY_DATA, PowerCalculator.formatCharge(stats.getBatteryCapacity()), PowerCalculator.formatCharge(stats.getConsumedPower()), PowerCalculator.formatCharge(stats.getDischargedPowerRange().getLower()), PowerCalculator.formatCharge(stats.getDischargedPowerRange().getUpper())); formatCharge(stats.getBatteryCapacity()), formatCharge(stats.getConsumedPower()), formatCharge(stats.getDischargedPowerRange().getLower()), formatCharge(stats.getDischargedPowerRange().getUpper())); final BatteryConsumer deviceConsumer = stats.getAggregateBatteryConsumer( BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_DEVICE); for (@BatteryConsumer.PowerComponent int powerComponent = 0; Loading @@ -4437,7 +4475,7 @@ public abstract class BatteryStats implements Parcelable { label = "???"; } dumpLine(pw, 0 /* uid */, category, POWER_USE_ITEM_DATA, label, PowerCalculator.formatCharge(deviceConsumer.getConsumedPower(powerComponent)), formatCharge(deviceConsumer.getConsumedPower(powerComponent)), shouldHidePowerComponent(powerComponent) ? 1 : 0, "0", "0"); } Loading @@ -4447,11 +4485,10 @@ public abstract class BatteryStats implements Parcelable { for (int i = 0; i < uidBatteryConsumers.size(); i++) { UidBatteryConsumer consumer = uidBatteryConsumers.get(i); dumpLine(pw, consumer.getUid(), category, POWER_USE_ITEM_DATA, "uid", PowerCalculator.formatCharge(consumer.getConsumedPower()), formatCharge(consumer.getConsumedPower()), proportionalAttributionCalculator.isSystemBatteryConsumer(consumer) ? 1 : 0, PowerCalculator.formatCharge( consumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_SCREEN)), PowerCalculator.formatCharge( formatCharge(consumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_SCREEN)), formatCharge( proportionalAttributionCalculator.getProportionalPowerMah(consumer))); } Loading Loading @@ -4885,11 +4922,11 @@ public abstract class BatteryStats implements Parcelable { } private void printmAh(PrintWriter printer, double power) { printer.print(PowerCalculator.formatCharge(power)); printer.print(formatCharge(power)); } private void printmAh(StringBuilder sb, double power) { sb.append(PowerCalculator.formatCharge(power)); sb.append(formatCharge(power)); } /** Loading Loading @@ -4936,7 +4973,7 @@ public abstract class BatteryStats implements Parcelable { sb.setLength(0); sb.append(prefix); sb.append(" Estimated battery capacity: "); sb.append(PowerCalculator.formatCharge(estimatedBatteryCapacity)); sb.append(formatCharge(estimatedBatteryCapacity)); sb.append(" mAh"); pw.println(sb.toString()); } Loading @@ -4946,7 +4983,7 @@ public abstract class BatteryStats implements Parcelable { sb.setLength(0); sb.append(prefix); sb.append(" Last learned battery capacity: "); sb.append(PowerCalculator.formatCharge(lastLearnedBatteryCapacity / 1000)); sb.append(formatCharge(lastLearnedBatteryCapacity / 1000)); sb.append(" mAh"); pw.println(sb.toString()); } Loading @@ -4955,7 +4992,7 @@ public abstract class BatteryStats implements Parcelable { sb.setLength(0); sb.append(prefix); sb.append(" Min learned battery capacity: "); sb.append(PowerCalculator.formatCharge(minLearnedBatteryCapacity / 1000)); sb.append(formatCharge(minLearnedBatteryCapacity / 1000)); sb.append(" mAh"); pw.println(sb.toString()); } Loading @@ -4964,7 +5001,7 @@ public abstract class BatteryStats implements Parcelable { sb.setLength(0); sb.append(prefix); sb.append(" Max learned battery capacity: "); sb.append(PowerCalculator.formatCharge(maxLearnedBatteryCapacity / 1000)); sb.append(formatCharge(maxLearnedBatteryCapacity / 1000)); sb.append(" mAh"); pw.println(sb.toString()); } Loading Loading @@ -5028,7 +5065,7 @@ public abstract class BatteryStats implements Parcelable { sb.setLength(0); sb.append(prefix); sb.append(" Discharge: "); sb.append(PowerCalculator.formatCharge(dischargeCount / 1000.0)); sb.append(formatCharge(dischargeCount / 1000.0)); sb.append(" mAh"); pw.println(sb.toString()); } Loading @@ -5038,7 +5075,7 @@ public abstract class BatteryStats implements Parcelable { sb.setLength(0); sb.append(prefix); sb.append(" Screen off discharge: "); sb.append(PowerCalculator.formatCharge(dischargeScreenOffCount / 1000.0)); sb.append(formatCharge(dischargeScreenOffCount / 1000.0)); sb.append(" mAh"); pw.println(sb.toString()); } Loading @@ -5048,7 +5085,7 @@ public abstract class BatteryStats implements Parcelable { sb.setLength(0); sb.append(prefix); sb.append(" Screen doze discharge: "); sb.append(PowerCalculator.formatCharge(dischargeScreenDozeCount / 1000.0)); sb.append(formatCharge(dischargeScreenDozeCount / 1000.0)); sb.append(" mAh"); pw.println(sb.toString()); } Loading @@ -5058,7 +5095,7 @@ public abstract class BatteryStats implements Parcelable { sb.setLength(0); sb.append(prefix); sb.append(" Screen on discharge: "); sb.append(PowerCalculator.formatCharge(dischargeScreenOnCount / 1000.0)); sb.append(formatCharge(dischargeScreenOnCount / 1000.0)); sb.append(" mAh"); pw.println(sb.toString()); } Loading @@ -5068,7 +5105,7 @@ public abstract class BatteryStats implements Parcelable { sb.setLength(0); sb.append(prefix); sb.append(" Device light doze discharge: "); sb.append(PowerCalculator.formatCharge(dischargeLightDozeCount / 1000.0)); sb.append(formatCharge(dischargeLightDozeCount / 1000.0)); sb.append(" mAh"); pw.println(sb.toString()); } Loading @@ -5078,7 +5115,7 @@ public abstract class BatteryStats implements Parcelable { sb.setLength(0); sb.append(prefix); sb.append(" Device deep doze discharge: "); sb.append(PowerCalculator.formatCharge(dischargeDeepDozeCount / 1000.0)); sb.append(formatCharge(dischargeDeepDozeCount / 1000.0)); sb.append(" mAh"); pw.println(sb.toString()); } Loading Loading @@ -5212,7 +5249,7 @@ public abstract class BatteryStats implements Parcelable { for (int iu = 0; iu < NU; iu++) { final Uid u = uidStats.valueAt(iu); final ArrayMap<String, ? extends BatteryStats.Uid.Wakelock> wakelocks final ArrayMap<String, ? extends Uid.Wakelock> wakelocks = u.getWakelockStats(); for (int iw=wakelocks.size()-1; iw>=0; iw--) { final Uid.Wakelock wl = wakelocks.valueAt(iw); Loading Loading @@ -5621,34 +5658,38 @@ public abstract class BatteryStats implements Parcelable { .build()); stats.dump(pw, prefix); final BatteryStatsHelper helper = new BatteryStatsHelper(context, false, wifiOnly); helper.create(this); helper.refreshStats(which, UserHandle.USER_ALL); final List<BatterySipper> sippers = helper.getMobilemsppList(); if (sippers != null && sippers.size() > 0) { pw.print(prefix); pw.println(" Per-app mobile ms per packet:"); List<UidMobileRadioStats> uidMobileRadioStats = getUidMobileRadioStats(stats.getUidBatteryConsumers()); if (uidMobileRadioStats.size() > 0) { pw.print(prefix); pw.println(" Per-app mobile ms per packet:"); long totalTime = 0; for (int i=0; i<sippers.size(); i++) { final BatterySipper bs = sippers.get(i); for (int i = 0; i < uidMobileRadioStats.size(); i++) { final UidMobileRadioStats mrs = uidMobileRadioStats.get(i); sb.setLength(0); sb.append(prefix); sb.append(" Uid "); UserHandle.formatUid(sb, bs.uidObj.getUid()); sb.append(prefix); sb.append(" Uid "); UserHandle.formatUid(sb, mrs.uid); sb.append(": "); sb.append(PowerCalculator.formatCharge(bs.mobilemspp)); sb.append(" ("); sb.append(bs.mobileRxPackets+bs.mobileTxPackets); sb.append(" packets over "); formatTimeMsNoSpace(sb, bs.mobileActive); sb.append(") "); sb.append(bs.mobileActiveCount); sb.append("x"); pw.println(sb.toString()); totalTime += bs.mobileActive; sb.append(formatValue(mrs.millisecondsPerPacket)); sb.append(" ("); sb.append(mrs.rxPackets + mrs.txPackets); sb.append(" packets over "); formatTimeMsNoSpace(sb, mrs.radioActiveMs); sb.append(") "); sb.append(mrs.radioActiveCount); sb.append("x"); pw.println(sb); totalTime += mrs.radioActiveMs; } sb.setLength(0); sb.append(prefix); sb.append(" TOTAL TIME: "); formatTimeMs(sb, totalTime); sb.append("("); sb.append(formatRatioLocked(totalTime, whichBatteryRealtime)); sb.append("("); sb.append(formatRatioLocked(totalTime, whichBatteryRealtime)); sb.append(")"); pw.println(sb.toString()); pw.println(sb); pw.println(); } Loading @@ -5668,13 +5709,13 @@ public abstract class BatteryStats implements Parcelable { }; if (reqUid < 0) { final Map<String, ? extends BatteryStats.Timer> kernelWakelocks final Map<String, ? extends Timer> kernelWakelocks = getKernelWakelockStats(); if (kernelWakelocks.size() > 0) { final ArrayList<TimerEntry> ktimers = new ArrayList<>(); for (Map.Entry<String, ? extends BatteryStats.Timer> ent for (Map.Entry<String, ? extends Timer> ent : kernelWakelocks.entrySet()) { final BatteryStats.Timer timer = ent.getValue(); final Timer timer = ent.getValue(); final long totalTimeMillis = computeWakeLock(timer, rawRealtime, which); if (totalTimeMillis > 0) { ktimers.add(new TimerEntry(ent.getKey(), 0, timer, totalTimeMillis)); Loading Loading @@ -5859,8 +5900,7 @@ public abstract class BatteryStats implements Parcelable { packets = 1; } sb.append(" @ "); sb.append(PowerCalculator.formatCharge( uidMobileActiveTime / 1000 / (double) packets)); sb.append(formatCharge(uidMobileActiveTime / 1000 / (double) packets)); sb.append(" mspp"); pw.println(sb.toString()); } Loading Loading @@ -6068,7 +6108,7 @@ public abstract class BatteryStats implements Parcelable { } } final ArrayMap<String, ? extends BatteryStats.Uid.Wakelock> wakelocks final ArrayMap<String, ? extends Uid.Wakelock> wakelocks = u.getWakelockStats(); long totalFullWakelock = 0, totalPartialWakelock = 0, totalWindowWakelock = 0; long totalDrawWakelock = 0; Loading Loading @@ -6296,7 +6336,7 @@ public abstract class BatteryStats implements Parcelable { uidActivity |= printTimer(pw, sb, u.getAudioTurnedOnTimer(), rawRealtime, which, prefix, "Audio"); final SparseArray<? extends BatteryStats.Uid.Sensor> sensors = u.getSensorStats(); final SparseArray<? extends Uid.Sensor> sensors = u.getSensorStats(); final int NSE = sensors.size(); for (int ise=0; ise<NSE; ise++) { final Uid.Sensor se = sensors.valueAt(ise); Loading Loading @@ -6439,7 +6479,7 @@ public abstract class BatteryStats implements Parcelable { } } final ArrayMap<String, ? extends BatteryStats.Uid.Proc> processStats final ArrayMap<String, ? extends Uid.Proc> processStats = u.getProcessStats(); for (int ipr=processStats.size()-1; ipr>=0; ipr--) { final Uid.Proc ps = processStats.valueAt(ipr); Loading Loading @@ -6513,7 +6553,7 @@ public abstract class BatteryStats implements Parcelable { } } final ArrayMap<String, ? extends BatteryStats.Uid.Pkg> packageStats final ArrayMap<String, ? extends Uid.Pkg> packageStats = u.getPackageStats(); for (int ipkg=packageStats.size()-1; ipkg>=0; ipkg--) { pw.print(prefix); pw.print(" Apk "); pw.print(packageStats.keyAt(ipkg)); Loading @@ -6530,7 +6570,7 @@ public abstract class BatteryStats implements Parcelable { } final ArrayMap<String, ? extends Uid.Pkg.Serv> serviceStats = ps.getServiceStats(); for (int isvc=serviceStats.size()-1; isvc>=0; isvc--) { final BatteryStats.Uid.Pkg.Serv ss = serviceStats.valueAt(isvc); final Uid.Pkg.Serv ss = serviceStats.valueAt(isvc); final long startTime = ss.getStartTime(batteryUptime, which); final int starts = ss.getStarts(which); final int launches = ss.getLaunches(which); Loading Loading @@ -8652,4 +8692,57 @@ public abstract class BatteryStats implements Parcelable { return false; } } private static class UidMobileRadioStats { public final int uid; public final long rxPackets; public final long txPackets; public final long radioActiveMs; public final int radioActiveCount; public final double millisecondsPerPacket; private UidMobileRadioStats(int uid, long rxPackets, long txPackets, long radioActiveMs, int radioActiveCount, double millisecondsPerPacket) { this.uid = uid; this.txPackets = txPackets; this.rxPackets = rxPackets; this.radioActiveMs = radioActiveMs; this.radioActiveCount = radioActiveCount; this.millisecondsPerPacket = millisecondsPerPacket; } } private List<UidMobileRadioStats> getUidMobileRadioStats( List<UidBatteryConsumer> uidBatteryConsumers) { final SparseArray<? extends Uid> uidStats = getUidStats(); List<UidMobileRadioStats> uidMobileRadioStats = Lists.newArrayList(); for (int i = 0; i < uidBatteryConsumers.size(); i++) { final UidBatteryConsumer consumer = uidBatteryConsumers.get(i); if (consumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO) == 0) { continue; } final int uid = consumer.getUid(); final Uid u = uidStats.get(uid); final long rxPackets = u.getNetworkActivityPackets( BatteryStats.NETWORK_MOBILE_RX_DATA, STATS_SINCE_CHARGED); final long txPackets = u.getNetworkActivityPackets( BatteryStats.NETWORK_MOBILE_TX_DATA, STATS_SINCE_CHARGED); if (rxPackets == 0 && txPackets == 0) { continue; } final long radioActiveMs = u.getMobileRadioActiveTime(STATS_SINCE_CHARGED) / 1000; final int radioActiveCount = u.getMobileRadioActiveCount(STATS_SINCE_CHARGED); final double msPerPacket = (double) radioActiveMs / (rxPackets + txPackets); if (msPerPacket == 0) { continue; } uidMobileRadioStats.add( new UidMobileRadioStats(uid, rxPackets, txPackets, radioActiveMs, radioActiveCount, msPerPacket)); } uidMobileRadioStats.sort( (lhs, rhs) -> Double.compare(rhs.millisecondsPerPacket, lhs.millisecondsPerPacket)); return uidMobileRadioStats; } }
core/java/android/os/BatteryUsageStats.java +3 −2 Original line number Diff line number Diff line Loading @@ -597,20 +597,21 @@ public final class BatteryUsageStats implements Parcelable, Closeable { dumpSortedBatteryConsumers(pw, prefix, getUidBatteryConsumers()); dumpSortedBatteryConsumers(pw, prefix, getUserBatteryConsumers()); pw.println(); } private void printPowerComponent(PrintWriter pw, String prefix, String label, double devicePowerMah, double appsPowerMah, int powerModel, long durationMs) { StringBuilder sb = new StringBuilder(); sb.append(prefix).append(" ").append(label).append(": ") .append(PowerCalculator.formatCharge(devicePowerMah)); .append(BatteryStats.formatCharge(devicePowerMah)); if (powerModel != BatteryConsumer.POWER_MODEL_UNDEFINED && powerModel != BatteryConsumer.POWER_MODEL_POWER_PROFILE) { sb.append(" ["); sb.append(BatteryConsumer.powerModelToString(powerModel)); sb.append("]"); } sb.append(" apps: ").append(PowerCalculator.formatCharge(appsPowerMah)); sb.append(" apps: ").append(BatteryStats.formatCharge(appsPowerMah)); if (durationMs != 0) { sb.append(" duration: "); BatteryStats.formatTimeMs(sb, durationMs); Loading
core/java/android/os/PowerComponents.java +2 −4 Original line number Diff line number Diff line Loading @@ -26,8 +26,6 @@ import android.util.TypedXmlPullParser; import android.util.TypedXmlSerializer; import android.util.proto.ProtoOutputStream; import com.android.internal.os.PowerCalculator; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; Loading Loading @@ -170,7 +168,7 @@ class PowerComponents { separator = " "; sb.append(key.toShortString()); sb.append("="); sb.append(PowerCalculator.formatCharge(componentPower)); sb.append(BatteryStats.formatCharge(componentPower)); if (durationMs != 0) { sb.append(" ("); Loading @@ -194,7 +192,7 @@ class PowerComponents { separator = " "; sb.append(getCustomPowerComponentName(customComponentId)); sb.append("="); sb.append(PowerCalculator.formatCharge(customComponentPower)); sb.append(BatteryStats.formatCharge(customComponentPower)); } pw.print(sb); Loading
core/java/android/os/UidBatteryConsumer.java +1 −1 Original line number Diff line number Diff line Loading @@ -136,7 +136,7 @@ public final class UidBatteryConsumer extends BatteryConsumer { } sb.append(" ").append(processStateToString(processState)).append(": ") .append(PowerCalculator.formatCharge(power)); .append(BatteryStats.formatCharge(power)); } static UidBatteryConsumer create(BatteryConsumerData data) { Loading
core/java/com/android/internal/os/BatteryStatsHelper.java +4 −4 Original line number Diff line number Diff line Loading @@ -396,9 +396,9 @@ public class BatteryStatsHelper { } if (DEBUG) { Log.d(TAG, "Accuracy: total computed=" + PowerCalculator.formatCharge(mComputedPower) + ", min discharge=" + PowerCalculator.formatCharge(mMinDrainedPower) + ", max discharge=" + PowerCalculator.formatCharge(mMaxDrainedPower)); Log.d(TAG, "Accuracy: total computed=" + BatteryStats.formatCharge(mComputedPower) + ", min discharge=" + BatteryStats.formatCharge(mMinDrainedPower) + ", max discharge=" + BatteryStats.formatCharge(mMaxDrainedPower)); } mTotalPower = mComputedPower; Loading Loading @@ -466,7 +466,7 @@ public class BatteryStatsHelper { final double totalPower = sipper.sumPower(); if (DEBUG && totalPower != 0) { Log.d(TAG, String.format("UID %d: total power=%s", sipper.getUid(), PowerCalculator.formatCharge(totalPower))); BatteryStats.formatCharge(totalPower))); } // Add the sipper to the list if it is consuming power. Loading