1. 程式人生 > >【Android】dumpsys --proto簡介

【Android】dumpsys --proto簡介

dumpsys --proto

2018-11-9

在Android 8.0開始,在有些dump方法中添加了—proto的處理,如batteryService中

private final class BinderService extends Binder {

        @Override protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {

            if (!DumpUtils.checkDumpPermission(mContext, TAG, pw)) return;

            if (args.length > 0 && "--proto".equals(args[0])) {

                dumpProto(fd);

            } else {

                dumpInternal(fd, pw, args);

            }

        }

檢視dumpProto的實現

    private void dumpProto(FileDescriptor fd) {

        final ProtoOutputStream proto = new ProtoOutputStream(fd);

        synchronized (mLock) {

            proto.write(BatteryServiceDumpProto.ARE_UPDATES_STOPPED, mUpdatesStopped);

            int batteryPluggedValue = BatteryServiceDumpProto.BATTERY_PLUGGED_NONE;

            if (mBatteryProps.chargerAcOnline) {

                batteryPluggedValue = BatteryServiceDumpProto.BATTERY_PLUGGED_AC;

            } else if (mBatteryProps.chargerUsbOnline) {

                batteryPluggedValue = BatteryServiceDumpProto.BATTERY_PLUGGED_USB;

            } else if (mBatteryProps.chargerWirelessOnline) {

                batteryPluggedValue = BatteryServiceDumpProto.BATTERY_PLUGGED_WIRELESS;

            }

            proto.write(BatteryServiceDumpProto.PLUGGED, batteryPluggedValue);

            proto.write(BatteryServiceDumpProto.MAX_CHARGING_CURRENT, mBatteryProps.maxChargingCurrent);

            proto.write(BatteryServiceDumpProto.MAX_CHARGING_VOLTAGE, mBatteryProps.maxChargingVoltage);

            proto.write(BatteryServiceDumpProto.CHARGE_COUNTER, mBatteryProps.batteryChargeCounter);

            proto.write(BatteryServiceDumpProto.STATUS, mBatteryProps.batteryStatus);

            proto.write(BatteryServiceDumpProto.HEALTH, mBatteryProps.batteryHealth);

            proto.write(BatteryServiceDumpProto.IS_PRESENT, mBatteryProps.batteryPresent);

            proto.write(BatteryServiceDumpProto.LEVEL, mBatteryProps.batteryLevel);

            proto.write(BatteryServiceDumpProto.SCALE, BATTERY_SCALE);

            proto.write(BatteryServiceDumpProto.VOLTAGE, mBatteryProps.batteryVoltage);

            proto.write(BatteryServiceDumpProto.TEMPERATURE, mBatteryProps.batteryTemperature);

            proto.write(BatteryServiceDumpProto.TECHNOLOGY, mBatteryProps.batteryTechnology);

        }

        proto.flush();

    }

檢視其修改記錄,是為cts測試新增的

Protobufferize BatteryManager dumpsysBug: 34227623 Test: cts-tradefed run cts-dev -t CtsIncidentHostTestCases Change-Id: I6e36d725c50105ad1f6f86f890db49ea253907c0

25
29
31            /* If the battery isn't present, no need to run this test. */
32            return;
33        }
34
39
44 

getDump的實現為

81    }

可以看出,通過這種Proto存取資料的方式,獲取到batteryService中的變數值,用來進行後續的處理。

BatteryServiceDumpProto的定義在

out$ find . -name BatteryServiceDumpProto.java

./target/common/obj/JAVA_LIBRARIES/framework_intermediates/proto/src/android/service/battery/BatteryServiceDumpProto.java

// Generated by protoc-gen-javastream. DO NOT MODIFY.

// source: frameworks/base/core/proto/android/service/battery.proto

package android.service.battery;

/** @hide */

// message BatteryServiceDumpProto

public final class BatteryServiceDumpProto {

    // enum BatteryPlugged

    public static final int BATTERY_PLUGGED_NONE = 0;

    public static final int BATTERY_PLUGGED_AC = 1;

    public static final int BATTERY_PLUGGED_USB = 2;

    public static final int BATTERY_PLUGGED_WIRELESS = 4;

    // enum BatteryStatus

    public static final int BATTERY_STATUS_INVALID = 0;

    public static final int BATTERY_STATUS_UNKNOWN = 1;

    public static final int BATTERY_STATUS_CHARGING = 2;

    public static final int BATTERY_STATUS_DISCHARGING = 3;

    public static final int BATTERY_STATUS_NOT_CHARGING = 4;

    public static final int BATTERY_STATUS_FULL = 5;

    // enum BatteryHealth

    public static final int BATTERY_HEALTH_INVALID = 0;

    public static final int BATTERY_HEALTH_UNKNOWN = 1;

    public static final int BATTERY_HEALTH_GOOD = 2;

    public static final int BATTERY_HEALTH_OVERHEAT = 3;

    public static final int BATTERY_HEALTH_DEAD = 4;

    public static final int BATTERY_HEALTH_OVER_VOLTAGE = 5;

    public static final int BATTERY_HEALTH_UNSPECIFIED_FAILURE = 6;

    public static final int BATTERY_HEALTH_COLD = 7;

    // optional bool are_updates_stopped = 1;

    public static final long ARE_UPDATES_STOPPED = 0x0000010d00000001L;

    // optional .android.service.battery.BatteryServiceDumpProto.BatteryPlugged plugged = 2;

    public static final long PLUGGED = 0x0000011000000002L;

    // optional int32 max_charging_current = 3;

    public static final long MAX_CHARGING_CURRENT = 0x0000010300000003L;

    // optional int32 max_charging_voltage = 4;

    public static final long MAX_CHARGING_VOLTAGE = 0x0000010300000004L;

    // optional int32 charge_counter = 5;

    public static final long CHARGE_COUNTER = 0x0000010300000005L;

    // optional .android.service.battery.BatteryServiceDumpProto.BatteryStatus status = 6;

    public static final long STATUS = 0x0000011000000006L;

    // optional .android.service.battery.BatteryServiceDumpProto.BatteryHealth health = 7;

    public static final long HEALTH = 0x0000011000000007L;

    // optional bool is_present = 8;

    public static final long IS_PRESENT = 0x0000010d00000008L;

    // optional int32 level = 9;

    public static final long LEVEL = 0x0000010300000009L;

    // optional int32 scale = 10;

    public static final long SCALE = 0x000001030000000aL;

    // optional int32 voltage = 11;

    public static final long VOLTAGE = 0x000001030000000bL;

    // optional int32 temperature = 12;

    public static final long TEMPERATURE = 0x000001030000000cL;

    // optional string technology = 13;

    public static final long TECHNOLOGY = 0x0000010e0000000dL;

}