in android/os/BatteryStats.java [7668:8057]
private void dumpProtoSystemLocked(ProtoOutputStream proto, BatteryStatsHelper helper) {
final long sToken = proto.start(BatteryStatsProto.SYSTEM);
final long rawUptimeUs = SystemClock.uptimeMillis() * 1000;
final long rawRealtimeMs = SystemClock.elapsedRealtime();
final long rawRealtimeUs = rawRealtimeMs * 1000;
final int which = STATS_SINCE_CHARGED;
// Battery data (BATTERY_DATA)
final long bToken = proto.start(SystemProto.BATTERY);
proto.write(SystemProto.Battery.START_CLOCK_TIME_MS, getStartClockTime());
proto.write(SystemProto.Battery.START_COUNT, getStartCount());
proto.write(SystemProto.Battery.TOTAL_REALTIME_MS,
computeRealtime(rawRealtimeUs, which) / 1000);
proto.write(SystemProto.Battery.TOTAL_UPTIME_MS,
computeUptime(rawUptimeUs, which) / 1000);
proto.write(SystemProto.Battery.BATTERY_REALTIME_MS,
computeBatteryRealtime(rawRealtimeUs, which) / 1000);
proto.write(SystemProto.Battery.BATTERY_UPTIME_MS,
computeBatteryUptime(rawUptimeUs, which) / 1000);
proto.write(SystemProto.Battery.SCREEN_OFF_REALTIME_MS,
computeBatteryScreenOffRealtime(rawRealtimeUs, which) / 1000);
proto.write(SystemProto.Battery.SCREEN_OFF_UPTIME_MS,
computeBatteryScreenOffUptime(rawUptimeUs, which) / 1000);
proto.write(SystemProto.Battery.SCREEN_DOZE_DURATION_MS,
getScreenDozeTime(rawRealtimeUs, which) / 1000);
proto.write(SystemProto.Battery.ESTIMATED_BATTERY_CAPACITY_MAH,
getEstimatedBatteryCapacity());
proto.write(SystemProto.Battery.MIN_LEARNED_BATTERY_CAPACITY_UAH,
getMinLearnedBatteryCapacity());
proto.write(SystemProto.Battery.MAX_LEARNED_BATTERY_CAPACITY_UAH,
getMaxLearnedBatteryCapacity());
proto.end(bToken);
// Battery discharge (BATTERY_DISCHARGE_DATA)
final long bdToken = proto.start(SystemProto.BATTERY_DISCHARGE);
proto.write(SystemProto.BatteryDischarge.LOWER_BOUND_SINCE_CHARGE,
getLowDischargeAmountSinceCharge());
proto.write(SystemProto.BatteryDischarge.UPPER_BOUND_SINCE_CHARGE,
getHighDischargeAmountSinceCharge());
proto.write(SystemProto.BatteryDischarge.SCREEN_ON_SINCE_CHARGE,
getDischargeAmountScreenOnSinceCharge());
proto.write(SystemProto.BatteryDischarge.SCREEN_OFF_SINCE_CHARGE,
getDischargeAmountScreenOffSinceCharge());
proto.write(SystemProto.BatteryDischarge.SCREEN_DOZE_SINCE_CHARGE,
getDischargeAmountScreenDozeSinceCharge());
proto.write(SystemProto.BatteryDischarge.TOTAL_MAH,
getUahDischarge(which) / 1000);
proto.write(SystemProto.BatteryDischarge.TOTAL_MAH_SCREEN_OFF,
getUahDischargeScreenOff(which) / 1000);
proto.write(SystemProto.BatteryDischarge.TOTAL_MAH_SCREEN_DOZE,
getUahDischargeScreenDoze(which) / 1000);
proto.write(SystemProto.BatteryDischarge.TOTAL_MAH_LIGHT_DOZE,
getUahDischargeLightDoze(which) / 1000);
proto.write(SystemProto.BatteryDischarge.TOTAL_MAH_DEEP_DOZE,
getUahDischargeDeepDoze(which) / 1000);
proto.end(bdToken);
// Time remaining
long timeRemainingUs = computeChargeTimeRemaining(rawRealtimeUs);
// These are part of a oneof, so we should only set one of them.
if (timeRemainingUs >= 0) {
// Charge time remaining (CHARGE_TIME_REMAIN_DATA)
proto.write(SystemProto.CHARGE_TIME_REMAINING_MS, timeRemainingUs / 1000);
} else {
timeRemainingUs = computeBatteryTimeRemaining(rawRealtimeUs);
// Discharge time remaining (DISCHARGE_TIME_REMAIN_DATA)
if (timeRemainingUs >= 0) {
proto.write(SystemProto.DISCHARGE_TIME_REMAINING_MS, timeRemainingUs / 1000);
} else {
proto.write(SystemProto.DISCHARGE_TIME_REMAINING_MS, -1);
}
}
// Charge step (CHARGE_STEP_DATA)
dumpDurationSteps(proto, SystemProto.CHARGE_STEP, getChargeLevelStepTracker());
// Phone data connection (DATA_CONNECTION_TIME_DATA and DATA_CONNECTION_COUNT_DATA)
for (int i = 0; i < NUM_DATA_CONNECTION_TYPES; ++i) {
// Map OTHER to TelephonyManager.NETWORK_TYPE_UNKNOWN and mark NONE as a boolean.
boolean isNone = (i == DATA_CONNECTION_NONE);
int telephonyNetworkType = i;
if (i == DATA_CONNECTION_OTHER) {
telephonyNetworkType = TelephonyManager.NETWORK_TYPE_UNKNOWN;
}
final long pdcToken = proto.start(SystemProto.DATA_CONNECTION);
if (isNone) {
proto.write(SystemProto.DataConnection.IS_NONE, isNone);
} else {
proto.write(SystemProto.DataConnection.NAME, telephonyNetworkType);
}
dumpTimer(proto, SystemProto.DataConnection.TOTAL, getPhoneDataConnectionTimer(i),
rawRealtimeUs, which);
proto.end(pdcToken);
}
// Discharge step (DISCHARGE_STEP_DATA)
dumpDurationSteps(proto, SystemProto.DISCHARGE_STEP, getDischargeLevelStepTracker());
// CPU frequencies (GLOBAL_CPU_FREQ_DATA)
final long[] cpuFreqs = getCpuFreqs();
if (cpuFreqs != null) {
for (long i : cpuFreqs) {
proto.write(SystemProto.CPU_FREQUENCY, i);
}
}
// Bluetooth controller (GLOBAL_BLUETOOTH_CONTROLLER_DATA)
dumpControllerActivityProto(proto, SystemProto.GLOBAL_BLUETOOTH_CONTROLLER,
getBluetoothControllerActivity(), which);
// Modem controller (GLOBAL_MODEM_CONTROLLER_DATA)
dumpControllerActivityProto(proto, SystemProto.GLOBAL_MODEM_CONTROLLER,
getModemControllerActivity(), which);
// Global network data (GLOBAL_NETWORK_DATA)
final long gnToken = proto.start(SystemProto.GLOBAL_NETWORK);
proto.write(SystemProto.GlobalNetwork.MOBILE_BYTES_RX,
getNetworkActivityBytes(NETWORK_MOBILE_RX_DATA, which));
proto.write(SystemProto.GlobalNetwork.MOBILE_BYTES_TX,
getNetworkActivityBytes(NETWORK_MOBILE_TX_DATA, which));
proto.write(SystemProto.GlobalNetwork.MOBILE_PACKETS_RX,
getNetworkActivityPackets(NETWORK_MOBILE_RX_DATA, which));
proto.write(SystemProto.GlobalNetwork.MOBILE_PACKETS_TX,
getNetworkActivityPackets(NETWORK_MOBILE_TX_DATA, which));
proto.write(SystemProto.GlobalNetwork.WIFI_BYTES_RX,
getNetworkActivityBytes(NETWORK_WIFI_RX_DATA, which));
proto.write(SystemProto.GlobalNetwork.WIFI_BYTES_TX,
getNetworkActivityBytes(NETWORK_WIFI_TX_DATA, which));
proto.write(SystemProto.GlobalNetwork.WIFI_PACKETS_RX,
getNetworkActivityPackets(NETWORK_WIFI_RX_DATA, which));
proto.write(SystemProto.GlobalNetwork.WIFI_PACKETS_TX,
getNetworkActivityPackets(NETWORK_WIFI_TX_DATA, which));
proto.write(SystemProto.GlobalNetwork.BT_BYTES_RX,
getNetworkActivityBytes(NETWORK_BT_RX_DATA, which));
proto.write(SystemProto.GlobalNetwork.BT_BYTES_TX,
getNetworkActivityBytes(NETWORK_BT_TX_DATA, which));
proto.end(gnToken);
// Wifi controller (GLOBAL_WIFI_CONTROLLER_DATA)
dumpControllerActivityProto(proto, SystemProto.GLOBAL_WIFI_CONTROLLER,
getWifiControllerActivity(), which);
// Global wifi (GLOBAL_WIFI_DATA)
final long gwToken = proto.start(SystemProto.GLOBAL_WIFI);
proto.write(SystemProto.GlobalWifi.ON_DURATION_MS,
getWifiOnTime(rawRealtimeUs, which) / 1000);
proto.write(SystemProto.GlobalWifi.RUNNING_DURATION_MS,
getGlobalWifiRunningTime(rawRealtimeUs, which) / 1000);
proto.end(gwToken);
// Kernel wakelock (KERNEL_WAKELOCK_DATA)
final Map<String, ? extends Timer> kernelWakelocks = getKernelWakelockStats();
for (Map.Entry<String, ? extends Timer> ent : kernelWakelocks.entrySet()) {
final long kwToken = proto.start(SystemProto.KERNEL_WAKELOCK);
proto.write(SystemProto.KernelWakelock.NAME, ent.getKey());
dumpTimer(proto, SystemProto.KernelWakelock.TOTAL, ent.getValue(),
rawRealtimeUs, which);
proto.end(kwToken);
}
// Misc (MISC_DATA)
// Calculate wakelock times across all uids.
long fullWakeLockTimeTotalUs = 0;
long partialWakeLockTimeTotalUs = 0;
final SparseArray<? extends Uid> uidStats = getUidStats();
for (int iu = 0; iu < uidStats.size(); iu++) {
final Uid u = uidStats.valueAt(iu);
final ArrayMap<String, ? extends BatteryStats.Uid.Wakelock> wakelocks =
u.getWakelockStats();
for (int iw = wakelocks.size() - 1; iw >= 0; --iw) {
final Uid.Wakelock wl = wakelocks.valueAt(iw);
final Timer fullWakeTimer = wl.getWakeTime(WAKE_TYPE_FULL);
if (fullWakeTimer != null) {
fullWakeLockTimeTotalUs += fullWakeTimer.getTotalTimeLocked(rawRealtimeUs,
which);
}
final Timer partialWakeTimer = wl.getWakeTime(WAKE_TYPE_PARTIAL);
if (partialWakeTimer != null) {
partialWakeLockTimeTotalUs += partialWakeTimer.getTotalTimeLocked(
rawRealtimeUs, which);
}
}
}
final long mToken = proto.start(SystemProto.MISC);
proto.write(SystemProto.Misc.SCREEN_ON_DURATION_MS,
getScreenOnTime(rawRealtimeUs, which) / 1000);
proto.write(SystemProto.Misc.PHONE_ON_DURATION_MS,
getPhoneOnTime(rawRealtimeUs, which) / 1000);
proto.write(SystemProto.Misc.FULL_WAKELOCK_TOTAL_DURATION_MS,
fullWakeLockTimeTotalUs / 1000);
proto.write(SystemProto.Misc.PARTIAL_WAKELOCK_TOTAL_DURATION_MS,
partialWakeLockTimeTotalUs / 1000);
proto.write(SystemProto.Misc.MOBILE_RADIO_ACTIVE_DURATION_MS,
getMobileRadioActiveTime(rawRealtimeUs, which) / 1000);
proto.write(SystemProto.Misc.MOBILE_RADIO_ACTIVE_ADJUSTED_TIME_MS,
getMobileRadioActiveAdjustedTime(which) / 1000);
proto.write(SystemProto.Misc.MOBILE_RADIO_ACTIVE_COUNT,
getMobileRadioActiveCount(which));
proto.write(SystemProto.Misc.MOBILE_RADIO_ACTIVE_UNKNOWN_DURATION_MS,
getMobileRadioActiveUnknownTime(which) / 1000);
proto.write(SystemProto.Misc.INTERACTIVE_DURATION_MS,
getInteractiveTime(rawRealtimeUs, which) / 1000);
proto.write(SystemProto.Misc.BATTERY_SAVER_MODE_ENABLED_DURATION_MS,
getPowerSaveModeEnabledTime(rawRealtimeUs, which) / 1000);
proto.write(SystemProto.Misc.NUM_CONNECTIVITY_CHANGES,
getNumConnectivityChange(which));
proto.write(SystemProto.Misc.DEEP_DOZE_ENABLED_DURATION_MS,
getDeviceIdleModeTime(DEVICE_IDLE_MODE_DEEP, rawRealtimeUs, which) / 1000);
proto.write(SystemProto.Misc.DEEP_DOZE_COUNT,
getDeviceIdleModeCount(DEVICE_IDLE_MODE_DEEP, which));
proto.write(SystemProto.Misc.DEEP_DOZE_IDLING_DURATION_MS,
getDeviceIdlingTime(DEVICE_IDLE_MODE_DEEP, rawRealtimeUs, which) / 1000);
proto.write(SystemProto.Misc.DEEP_DOZE_IDLING_COUNT,
getDeviceIdlingCount(DEVICE_IDLE_MODE_DEEP, which));
proto.write(SystemProto.Misc.LONGEST_DEEP_DOZE_DURATION_MS,
getLongestDeviceIdleModeTime(DEVICE_IDLE_MODE_DEEP));
proto.write(SystemProto.Misc.LIGHT_DOZE_ENABLED_DURATION_MS,
getDeviceIdleModeTime(DEVICE_IDLE_MODE_LIGHT, rawRealtimeUs, which) / 1000);
proto.write(SystemProto.Misc.LIGHT_DOZE_COUNT,
getDeviceIdleModeCount(DEVICE_IDLE_MODE_LIGHT, which));
proto.write(SystemProto.Misc.LIGHT_DOZE_IDLING_DURATION_MS,
getDeviceIdlingTime(DEVICE_IDLE_MODE_LIGHT, rawRealtimeUs, which) / 1000);
proto.write(SystemProto.Misc.LIGHT_DOZE_IDLING_COUNT,
getDeviceIdlingCount(DEVICE_IDLE_MODE_LIGHT, which));
proto.write(SystemProto.Misc.LONGEST_LIGHT_DOZE_DURATION_MS,
getLongestDeviceIdleModeTime(DEVICE_IDLE_MODE_LIGHT));
proto.end(mToken);
// Wifi multicast wakelock total stats (WIFI_MULTICAST_WAKELOCK_TOTAL_DATA)
final long multicastWakeLockTimeTotalUs =
getWifiMulticastWakelockTime(rawRealtimeUs, which);
final int multicastWakeLockCountTotal = getWifiMulticastWakelockCount(which);
final long wmctToken = proto.start(SystemProto.WIFI_MULTICAST_WAKELOCK_TOTAL);
proto.write(SystemProto.WifiMulticastWakelockTotal.DURATION_MS,
multicastWakeLockTimeTotalUs / 1000);
proto.write(SystemProto.WifiMulticastWakelockTotal.COUNT,
multicastWakeLockCountTotal);
proto.end(wmctToken);
// Power use item (POWER_USE_ITEM_DATA)
final List<BatterySipper> sippers = helper.getUsageList();
if (sippers != null) {
for (int i = 0; i < sippers.size(); ++i) {
final BatterySipper bs = sippers.get(i);
int n = SystemProto.PowerUseItem.UNKNOWN_SIPPER;
int uid = 0;
switch (bs.drainType) {
case AMBIENT_DISPLAY:
n = SystemProto.PowerUseItem.AMBIENT_DISPLAY;
break;
case IDLE:
n = SystemProto.PowerUseItem.IDLE;
break;
case CELL:
n = SystemProto.PowerUseItem.CELL;
break;
case PHONE:
n = SystemProto.PowerUseItem.PHONE;
break;
case WIFI:
n = SystemProto.PowerUseItem.WIFI;
break;
case BLUETOOTH:
n = SystemProto.PowerUseItem.BLUETOOTH;
break;
case SCREEN:
n = SystemProto.PowerUseItem.SCREEN;
break;
case FLASHLIGHT:
n = SystemProto.PowerUseItem.FLASHLIGHT;
break;
case APP:
// dumpProtoAppsLocked will handle this.
continue;
case USER:
n = SystemProto.PowerUseItem.USER;
uid = UserHandle.getUid(bs.userId, 0);
break;
case UNACCOUNTED:
n = SystemProto.PowerUseItem.UNACCOUNTED;
break;
case OVERCOUNTED:
n = SystemProto.PowerUseItem.OVERCOUNTED;
break;
case CAMERA:
n = SystemProto.PowerUseItem.CAMERA;
break;
case MEMORY:
n = SystemProto.PowerUseItem.MEMORY;
break;
}
final long puiToken = proto.start(SystemProto.POWER_USE_ITEM);
proto.write(SystemProto.PowerUseItem.NAME, n);
proto.write(SystemProto.PowerUseItem.UID, uid);
proto.write(SystemProto.PowerUseItem.COMPUTED_POWER_MAH, bs.totalPowerMah);
proto.write(SystemProto.PowerUseItem.SHOULD_HIDE, bs.shouldHide);
proto.write(SystemProto.PowerUseItem.SCREEN_POWER_MAH, bs.screenPowerMah);
proto.write(SystemProto.PowerUseItem.PROPORTIONAL_SMEAR_MAH,
bs.proportionalSmearMah);
proto.end(puiToken);
}
}
// Power use summary (POWER_USE_SUMMARY_DATA)
final long pusToken = proto.start(SystemProto.POWER_USE_SUMMARY);
proto.write(SystemProto.PowerUseSummary.BATTERY_CAPACITY_MAH,
helper.getPowerProfile().getBatteryCapacity());
proto.write(SystemProto.PowerUseSummary.COMPUTED_POWER_MAH, helper.getComputedPower());
proto.write(SystemProto.PowerUseSummary.MIN_DRAINED_POWER_MAH, helper.getMinDrainedPower());
proto.write(SystemProto.PowerUseSummary.MAX_DRAINED_POWER_MAH, helper.getMaxDrainedPower());
proto.end(pusToken);
// RPM stats (RESOURCE_POWER_MANAGER_DATA)
final Map<String, ? extends Timer> rpmStats = getRpmStats();
final Map<String, ? extends Timer> screenOffRpmStats = getScreenOffRpmStats();
for (Map.Entry<String, ? extends Timer> ent : rpmStats.entrySet()) {
final long rpmToken = proto.start(SystemProto.RESOURCE_POWER_MANAGER);
proto.write(SystemProto.ResourcePowerManager.NAME, ent.getKey());
dumpTimer(proto, SystemProto.ResourcePowerManager.TOTAL,
ent.getValue(), rawRealtimeUs, which);
dumpTimer(proto, SystemProto.ResourcePowerManager.SCREEN_OFF,
screenOffRpmStats.get(ent.getKey()), rawRealtimeUs, which);
proto.end(rpmToken);
}
// Screen brightness (SCREEN_BRIGHTNESS_DATA)
for (int i = 0; i < NUM_SCREEN_BRIGHTNESS_BINS; ++i) {
final long sbToken = proto.start(SystemProto.SCREEN_BRIGHTNESS);
proto.write(SystemProto.ScreenBrightness.NAME, i);
dumpTimer(proto, SystemProto.ScreenBrightness.TOTAL, getScreenBrightnessTimer(i),
rawRealtimeUs, which);
proto.end(sbToken);
}
// Signal scanning time (SIGNAL_SCANNING_TIME_DATA)
dumpTimer(proto, SystemProto.SIGNAL_SCANNING, getPhoneSignalScanningTimer(), rawRealtimeUs,
which);
// Phone signal strength (SIGNAL_STRENGTH_TIME_DATA and SIGNAL_STRENGTH_COUNT_DATA)
for (int i = 0; i < SignalStrength.NUM_SIGNAL_STRENGTH_BINS; ++i) {
final long pssToken = proto.start(SystemProto.PHONE_SIGNAL_STRENGTH);
proto.write(SystemProto.PhoneSignalStrength.NAME, i);
dumpTimer(proto, SystemProto.PhoneSignalStrength.TOTAL, getPhoneSignalStrengthTimer(i),
rawRealtimeUs, which);
proto.end(pssToken);
}
// Wakeup reasons (WAKEUP_REASON_DATA)
final Map<String, ? extends Timer> wakeupReasons = getWakeupReasonStats();
for (Map.Entry<String, ? extends Timer> ent : wakeupReasons.entrySet()) {
final long wrToken = proto.start(SystemProto.WAKEUP_REASON);
proto.write(SystemProto.WakeupReason.NAME, ent.getKey());
dumpTimer(proto, SystemProto.WakeupReason.TOTAL, ent.getValue(), rawRealtimeUs, which);
proto.end(wrToken);
}
// Wifi signal strength (WIFI_SIGNAL_STRENGTH_TIME_DATA and WIFI_SIGNAL_STRENGTH_COUNT_DATA)
for (int i = 0; i < NUM_WIFI_SIGNAL_STRENGTH_BINS; ++i) {
final long wssToken = proto.start(SystemProto.WIFI_SIGNAL_STRENGTH);
proto.write(SystemProto.WifiSignalStrength.NAME, i);
dumpTimer(proto, SystemProto.WifiSignalStrength.TOTAL, getWifiSignalStrengthTimer(i),
rawRealtimeUs, which);
proto.end(wssToken);
}
// Wifi state (WIFI_STATE_TIME_DATA and WIFI_STATE_COUNT_DATA)
for (int i = 0; i < NUM_WIFI_STATES; ++i) {
final long wsToken = proto.start(SystemProto.WIFI_STATE);
proto.write(SystemProto.WifiState.NAME, i);
dumpTimer(proto, SystemProto.WifiState.TOTAL, getWifiStateTimer(i),
rawRealtimeUs, which);
proto.end(wsToken);
}
// Wifi supplicant state (WIFI_SUPPL_STATE_TIME_DATA and WIFI_SUPPL_STATE_COUNT_DATA)
for (int i = 0; i < NUM_WIFI_SUPPL_STATES; ++i) {
final long wssToken = proto.start(SystemProto.WIFI_SUPPLICANT_STATE);
proto.write(SystemProto.WifiSupplicantState.NAME, i);
dumpTimer(proto, SystemProto.WifiSupplicantState.TOTAL, getWifiSupplStateTimer(i),
rawRealtimeUs, which);
proto.end(wssToken);
}
proto.end(sToken);
}