private void dumpProtoSystemLocked()

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);
    }