dumpsys battery
未充电
console:/ # dumpsys battery
Current Battery Service state:
AC powered: false
USB powered: false
Wireless powered: false
Max charging current: 0
Max charging voltage: 0
Charge counter: 1000
status: 4
health: 2
present: true
level: 90
scale: 100
voltage: 13
temperature: 26
technology: Li-ion
console:/ #
充电中
console:/ # dumpsys battery
Current Battery Service state:
AC powered: true
USB powered: false
Wireless powered: false
Max charging current: 0
Max charging voltage: 0
Charge counter: 1000
status: 2
health: 2
present: true
level: 90
scale: 100
voltage: 13
temperature: 26
technology: Li-ion
console:/ #
dumpsys battery -h
console:/ # dumpsys battery -h
Battery service (battery) commands:
help
Print this help text.
get [-f] [ac|usb|wireless|status|level|temp|present|counter|invalid]
set [-f] [ac|usb|wireless|status|level|temp|present|counter|invalid] <value>
Force a battery property value, freezing battery state.
-f: force a battery change broadcast be sent, prints new sequence.
unplug [-f]
Force battery unplugged, freezing battery state.
-f: force a battery change broadcast be sent, prints new sequence.
reset [-f]
Unfreeze battery state, returning to current hardware values.
-f: force a battery change broadcast be sent, prints new sequence.
suspend_input
Suspend charging even if plugged in.
console:/ #
模拟设置电量
模拟设置电量为 20 。
本质上电池电量没有改变,只是UI和软件流程上电量变为 20 ,方便看状态栏电池的变化、低电量的提示等。
dumpsys battery set level 20
模拟充电
模拟 AC 充电,
status 状态对应
- 1 未知。
- 2 充电中。
- 3 未充电。
- 4 已连接,未充电。
- 5 已充满电
在安卓原生设置-电池选项可以看出差异。
dumpsys battery set ac 1
dumpsys battery set status 1/2/3/4/5
清除调试信息
清除前面章节设置的调试信息
dumpsys battery reset
源码
源码在 frameworks/base/services/core/java/com/android/server/BatteryService.java
,
class Shell extends ShellCommand {
@Override
public int onCommand(String cmd) {
return onShellCommand(this, cmd);
}
@Override
public void onHelp() {
PrintWriter pw = getOutPrintWriter();
dumpHelp(pw);
}
}
static void dumpHelp(PrintWriter pw) {
pw.println("Battery service (battery) commands:");
pw.println(" help");
pw.println(" Print this help text.");
pw.println(" get [-f] [ac|usb|wireless|status|level|temp|present|counter|invalid]");
pw.println(
" set [-f] [ac|usb|wireless|status|level|temp|present|counter|invalid] <value>");
pw.println(" Force a battery property value, freezing battery state.");
pw.println(" -f: force a battery change broadcast be sent, prints new sequence.");
pw.println(" unplug [-f]");
pw.println(" Force battery unplugged, freezing battery state.");
pw.println(" -f: force a battery change broadcast be sent, prints new sequence.");
pw.println(" reset [-f]");
pw.println(" Unfreeze battery state, returning to current hardware values.");
pw.println(" -f: force a battery change broadcast be sent, prints new sequence.");
if (Build.IS_DEBUGGABLE) {
pw.println(" suspend_input");
pw.println(" Suspend charging even if plugged in. ");
}
}
static final int OPTION_FORCE_UPDATE = 1<<0;
int parseOptions(Shell shell) {
String opt;
int opts = 0;
while ((opt = shell.getNextOption()) != null) {
if ("-f".equals(opt)) {
opts |= OPTION_FORCE_UPDATE;
}
}
return opts;
}
int onShellCommand(Shell shell, String cmd) {
if (cmd == null) {
return shell.handleDefaultCommands(cmd);
}
PrintWriter pw = shell.getOutPrintWriter();
switch (cmd) {
case "unplug": {
int opts = parseOptions(shell);
getContext().enforceCallingOrSelfPermission(
android.Manifest.permission.DEVICE_POWER, null);
unplugBattery(/* forceUpdate= */ (opts & OPTION_FORCE_UPDATE) != 0, pw);
} break;
case "get": {
final String key = shell.getNextArg();
if (key == null) {
pw.println("No property specified");
return -1;
}
switch (key) {
case "present":
pw.println(mHealthInfo.batteryPresent);
break;
case "ac":
pw.println(mHealthInfo.chargerAcOnline);
break;
case "usb":
pw.println(mHealthInfo.chargerUsbOnline);
break;
case "wireless":
pw.println(mHealthInfo.chargerWirelessOnline);
break;
case "status":
pw.println(mHealthInfo.batteryStatus);
break;
case "level":
pw.println(mHealthInfo.batteryLevel);
break;
case "counter":
pw.println(mHealthInfo.batteryChargeCounterUah);
break;
case "temp":
pw.println(mHealthInfo.batteryTemperatureTenthsCelsius);
break;
case "invalid":
pw.println(mInvalidCharger);
break;
default:
pw.println("Unknown get option: " + key);
break;
}
} break;
case "set": {
int opts = parseOptions(shell);
getContext().enforceCallingOrSelfPermission(
android.Manifest.permission.DEVICE_POWER, null);
final String key = shell.getNextArg();
if (key == null) {
pw.println("No property specified");
return -1;
}
final String value = shell.getNextArg();
if (value == null) {
pw.println("No value specified");
return -1;
}
try {
if (!mUpdatesStopped) {
copyV1Battery(mLastHealthInfo, mHealthInfo);
}
boolean update = true;
switch (key) {
case "present":
mHealthInfo.batteryPresent = Integer.parseInt(value) != 0;
break;
case "ac":
mHealthInfo.chargerAcOnline = Integer.parseInt(value) != 0;
break;
case "usb":
mHealthInfo.chargerUsbOnline = Integer.parseInt(value) != 0;
break;
case "wireless":
mHealthInfo.chargerWirelessOnline = Integer.parseInt(value) != 0;
break;
case "status":
mHealthInfo.batteryStatus = Integer.parseInt(value);
break;
case "level":
mHealthInfo.batteryLevel = Integer.parseInt(value);
break;
case "counter":
mHealthInfo.batteryChargeCounterUah = Integer.parseInt(value);
break;
case "temp":
mHealthInfo.batteryTemperatureTenthsCelsius = Integer.parseInt(value);
break;
case "invalid":
mInvalidCharger = Integer.parseInt(value);
break;
default:
pw.println("Unknown set option: " + key);
update = false;
break;
}
if (update) {
final long ident = Binder.clearCallingIdentity();
try {
mUpdatesStopped = true;
processValuesLocked(
/* forceUpdate= */ (opts & OPTION_FORCE_UPDATE) != 0, pw);
} finally {
Binder.restoreCallingIdentity(ident);
}
}
} catch (NumberFormatException ex) {
pw.println("Bad value: " + value);
return -1;
}
} break;
case "reset": {
int opts = parseOptions(shell);
getContext().enforceCallingOrSelfPermission(
android.Manifest.permission.DEVICE_POWER, null);
resetBattery(/* forceUpdate= */ (opts & OPTION_FORCE_UPDATE) != 0, pw);
} break;
case "suspend_input": {
getContext().enforceCallingOrSelfPermission(
android.Manifest.permission.DEVICE_POWER, null);
suspendBatteryInput();
} break;
default:
return shell.handleDefaultCommands(cmd);
}
return 0;
}