一、adb 指令
1.1 让设备进入未连接充电的模式
进行doze模式命令模拟的话,需要先下发该命令,因为只要存在充电状态,是无法从Acitve状态切换到InActive状态的
adb shell dumpsys battery unplug
Z90:/ # dumpsys battery unplug
dumpsys battery unplug
1.2 退出Doze模式,让手机恢复正常需要复位充电模式
不使用doze命令模拟的时候,记得退出这个模式,不然电池电量状态可能不更新哦
adb shell dumpsys battery reset
Z90:/ # dumpsys battery reset
dumpsys battery reset
1.3 Doze Help 命令查询
adb shell dumpsys deviceidle -h
Z90:/ # dumpsys deviceidle -h
dumpsys deviceidle -h
Device idle controller (deviceidle) commands:
help
Print this help text.
step [light|deep]
Immediately step to next state, without waiting for alarm.
force-idle [light|deep]
Force directly into idle mode, regardless of other device state.
force-inactive
Force to be inactive, ready to freely step idle states.
unforce
Resume normal functioning after force-idle or force-inactive.
get [light|deep|force|screen|charging|network]
Retrieve the current given state.
disable [light|deep|all]
Completely disable device idle mode.
enable [light|deep|all]
Re-enable device idle mode after it had previously been disabled.
enabled [light|deep|all]
Print 1 if device idle mode is currently enabled, else 0.
whitelist
Print currently whitelisted apps.
whitelist [package ...]
Add (prefix with +) or remove (prefix with -) packages.
tempwhitelist
Print packages that are temporarily whitelisted.
tempwhitelist [-u] [package ..]
Temporarily place packages in whitelist for 10 seconds.
二、adb 指令 实操如下
Z90:/ # dumpsys deviceidle step light
dumpsys deviceidle step light
Stepped to light: IDLE_MAINTENANCE
Z90:/ # dumpsys deviceidle step deep
dumpsys deviceidle step deep
Stepped to deep: IDLE_PENDING
Z90:/ # dumpsys deviceidle force-idle light
dumpsys deviceidle force-idle light
Now forced in to light idle mode
Z90:/ # dumpsys deviceidle force-idle deep
dumpsys deviceidle force-idle deep
Now forced in to deep idle mode
Z90:/ # dumpsys deviceidle force-inactive
dumpsys deviceidle force-inactive
Light state: OVERRIDE, deep state: IDLE
Z90:/ # dumpsys deviceidle unforce
dumpsys deviceidle unforce
Light state: OVERRIDE, deep state: IDLE
Z90:/ # dumpsys deviceidle get light
dumpsys deviceidle get light
OVERRIDE
Z90:/ # dumpsys deviceidle get deep
dumpsys deviceidle get deep
IDLE
Z90:/ # dumpsys deviceidle get force
dumpsys deviceidle get force
false
Z90:/ # dumpsys deviceidle get screen
dumpsys deviceidle get screen
false
Z90:/ # dumpsys deviceidle get charging
dumpsys deviceidle get charging
false
Z90:/ # dumpsys deviceidle get network
dumpsys deviceidle get network
true
Z90:/ # dumpsys deviceidle disable light
dumpsys deviceidle disable light
Light idle mode disabled
Z90:/ # dumpsys deviceidle disable deep
dumpsys deviceidle disable deep
Deep idle mode disabled
Z90:/ # dumpsys deviceidle disable all
dumpsys deviceidle disable all
Z90:/ # dumpsys deviceidle enable light
dumpsys deviceidle enable light
Light idle mode enable
Z90:/ # dumpsys deviceidle enable deep
dumpsys deviceidle enable deep
Deep idle mode enabled
Z90:/ # dumpsys deviceidle enable all
dumpsys deviceidle enable all
Z90:/ # dumpsys deviceidle whitelist
dumpsys deviceidle whitelist
system-excidle,com.android.providers.downloads,10001
system-excidle,com.android.vending,10023
system-excidle,com.google.android.gms,10014
system,com.android.providers.downloads,10001
system,com.google.android.gms,10014
user,com.tencent.mm,10108
user,com.vapp.aide.intl.arm64,10068
user,com.google.android.gsf,10014
user,com.tencent.mobileqq,10110
user,com.facebook.katana,10092
user,com.vapp.aide.intl,10025
user,com.bsb.hike,10088
Z90:/ # dumpsys deviceidle tempwhitelist
dumpsys deviceidle tempwhitelist
三、具体源码
状态切换可以参考
http://blog.csdn.net/su749520/article/details/78570613
例如看状态切换
C:\Users\fadi.su>adb shell dumpsys battery unplug
C:\Users\fadi.su>adb shell dumpsys deviceidle step deep
Stepped to deep: IDLE_PENDING
C:\Users\fadi.su>adb shell dumpsys deviceidle step deep
Stepped to deep: SENSING
C:\Users\fadi.su>adb shell dumpsys deviceidle step deep
Stepped to deep: LOCATING
C:\Users\fadi.su>adb shell dumpsys deviceidle step deep
Stepped to deep: IDLE
C:\Users\fadi.su>adb shell dumpsys deviceidle step deep
Stepped to deep: IDLE_MAINTENANCE
C:\Users\fadi.su>adb shell dumpsys deviceidle step deep
Stepped to deep: IDLE
C:\Users\fadi.su>adb shell dumpsys deviceidle get deep
IDLE
package com.android.server;
/**
* Keeps track of device idleness and drives low power mode based on that.
*/
public class DeviceIdleController extends SystemService
implements AnyMotionDetector.DeviceIdleCallback {
int onShellCommand(Shell shell, String cmd) {
PrintWriter pw = shell.getOutPrintWriter();
if ("step".equals(cmd)) {
getContext().enforceCallingOrSelfPermission(android.Manifest.permission.DEVICE_POWER,
null);
synchronized (this) {
long token = Binder.clearCallingIdentity();
String arg = shell.getNextArg();
try {
if (arg == null || "deep".equals(arg)) {
stepIdleStateLocked("s:shell");
pw.print("Stepped to deep: ");
pw.println(stateToString(mState));
} else if ("light".equals(arg)) {
stepLightIdleStateLocked("s:shell");
pw.print("Stepped to light: "); pw.println(lightStateToString(mLightState));
} else {
pw.println("Unknown idle mode: " + arg);
}
} finally {
Binder.restoreCallingIdentity(token);
}
}
} else if ("force-idle".equals(cmd)) {
getContext().enforceCallingOrSelfPermission(android.Manifest.permission.DEVICE_POWER,
null);
synchronized (this) {
long token = Binder.clearCallingIdentity();
String arg = shell.getNextArg();
try {
if (arg == null || "deep".equals(arg)) {
if (!mDeepEnabled) {
pw.println("Unable to go deep idle; not enabled");
return -1;
}
mForceIdle = true;
becomeInactiveIfAppropriateLocked();
int curState = mState;
while (curState != STATE_IDLE) {
stepIdleStateLocked("s:shell");
if (curState == mState) {
pw.print("Unable to go deep idle; stopped at ");
pw.println(stateToString(mState));
exitForceIdleLocked();
return -1;
}
curState = mState;
}
pw.println("Now forced in to deep idle mode");
} else if ("light".equals(arg)) {
mForceIdle = true;
becomeInactiveIfAppropriateLocked();
int curLightState = mLightState;
while (curLightState != LIGHT_STATE_IDLE) {
stepIdleStateLocked("s:shell");
if (curLightState == mLightState) {
pw.print("Unable to go light idle; stopped at ");
pw.println(lightStateToString(mLightState));
exitForceIdleLocked();
return -1;
}
curLightState = mLightState;
}
pw.println("Now forced in to light idle mode");
} else {
pw.println("Unknown idle mode: " + arg);
}
} finally {
Binder.restoreCallingIdentity(token);
}
}
} else if ("force-inactive".equals(cmd)) {
getContext().enforceCallingOrSelfPermission(android.Manifest.permission.DEVICE_POWER,
null);
synchronized (this) {
long token = Binder.clearCallingIdentity();
try {
mForceIdle = true;
becomeInactiveIfAppropriateLocked();
pw.print("Light state: ");
pw.print(lightStateToString(mLightState));
pw.print(", deep state: ");
pw.println(stateToString(mState));
} finally {
Binder.restoreCallingIdentity(token);
}
}
} else if ("unforce".equals(cmd)) {
getContext().enforceCallingOrSelfPermission(android.Manifest.permission.DEVICE_POWER,
null);
synchronized (this) {
long token = Binder.clearCallingIdentity();
try {
exitForceIdleLocked();
pw.print("Light state: ");
pw.print(lightStateToString(mLightState));
pw.print(", deep state: ");
pw.println(stateToString(mState));
} finally {
Binder.restoreCallingIdentity(token);
}
}
} else if ("get".equals(cmd)) {
getContext().enforceCallingOrSelfPermission(android.Manifest.permission.DEVICE_POWER,
null);
synchronized (this) {
String arg = shell.getNextArg();
if (arg != null) {
long token = Binder.clearCallingIdentity();
try {
switch (arg) {
case "light": pw.println(lightStateToString(mLightState)); break;
case "deep": pw.println(stateToString(mState)); break;
case "force": pw.println(mForceIdle); break;
case "screen": pw.println(mScreenOn); break;
case "charging": pw.println(mCharging); break;
case "network": pw.println(mNetworkConnected); break;
default: pw.println("Unknown get option: " + arg); break;
}
} finally {
Binder.restoreCallingIdentity(token);
}
} else {
pw.println("Argument required");
}
}
} else if ("disable".equals(cmd)) {
getContext().enforceCallingOrSelfPermission(android.Manifest.permission.DEVICE_POWER,
null);
synchronized (this) {
long token = Binder.clearCallingIdentity();
String arg = shell.getNextArg();
try {
boolean becomeActive = false;
boolean valid = false;
if (arg == null || "deep".equals(arg) || "all".equals(arg)) {
valid = true;
if (mDeepEnabled) {
mDeepEnabled = false;
becomeActive = true;
pw.println("Deep idle mode disabled");
}
}
if (arg == null || "light".equals(arg) || "all".equals(arg)) {
valid = true;
if (mLightEnabled) {
mLightEnabled = false;
becomeActive = true;
pw.println("Light idle mode disabled");
}
}
if (becomeActive) {
becomeActiveLocked((arg == null ? "all" : arg) + "-disabled",
Process.myUid());
}
if (!valid) {
pw.println("Unknown idle mode: " + arg);
}
} finally {
Binder.restoreCallingIdentity(token);
}
}
} else if ("enable".equals(cmd)) {
getContext().enforceCallingOrSelfPermission(android.Manifest.permission.DEVICE_POWER,
null);
synchronized (this) {
long token = Binder.clearCallingIdentity();
String arg = shell.getNextArg();
try {
boolean becomeInactive = false;
boolean valid = false;
if (arg == null || "deep".equals(arg) || "all".equals(arg)) {
valid = true;
if (!mDeepEnabled) {
mDeepEnabled = true;
becomeInactive = true;
pw.println("Deep idle mode enabled");
}
}
if (arg == null || "light".equals(arg) || "all".equals(arg)) {
valid = true;
if (!mLightEnabled) {
mLightEnabled = true;
becomeInactive = true;
pw.println("Light idle mode enable");
}
}
if (becomeInactive) {
becomeInactiveIfAppropriateLocked();
}
if (!valid) {
pw.println("Unknown idle mode: " + arg);
}
} finally {
Binder.restoreCallingIdentity(token);
}
}
} else if ("enabled".equals(cmd)) {
synchronized (this) {
String arg = shell.getNextArg();
if (arg == null || "all".equals(arg)) {
pw.println(mDeepEnabled && mLightEnabled ? "1" : 0);
} else if ("deep".equals(arg)) {
pw.println(mDeepEnabled ? "1" : 0);
} else if ("light".equals(arg)) {
pw.println(mLightEnabled ? "1" : 0);
} else {
pw.println("Unknown idle mode: " + arg);
}
}
} else if ("whitelist".equals(cmd)) {
String arg = shell.getNextArg();
if (arg != null) {
getContext().enforceCallingOrSelfPermission(
android.Manifest.permission.DEVICE_POWER, null);
long token = Binder.clearCallingIdentity();
try {
do {
if (arg.length() < 1 || (arg.charAt(0) != '-'
&& arg.charAt(0) != '+' && arg.charAt(0) != '=')) {
pw.println("Package must be prefixed with +, -, or =: " + arg);
return -1;
}
char op = arg.charAt(0);
String pkg = arg.substring(1);
if (op == '+') {
if (addPowerSaveWhitelistAppInternal(pkg)) {
pw.println("Added: " + pkg);
} else {
pw.println("Unknown package: " + pkg);
}
} else if (op == '-') {
if (removePowerSaveWhitelistAppInternal(pkg)) {
pw.println("Removed: " + pkg);
}
} else {
pw.println(getPowerSaveWhitelistAppInternal(pkg));
}
} while ((arg=shell.getNextArg()) != null);
} finally {
Binder.restoreCallingIdentity(token);
}
} else {
synchronized (this) {
for (int j=0; j<mPowerSaveWhitelistAppsExceptIdle.size(); j++) {
pw.print("system-excidle,");
pw.print(mPowerSaveWhitelistAppsExceptIdle.keyAt(j));
pw.print(",");
pw.println(mPowerSaveWhitelistAppsExceptIdle.valueAt(j));
}
for (int j=0; j<mPowerSaveWhitelistApps.size(); j++) {
pw.print("system,");
pw.print(mPowerSaveWhitelistApps.keyAt(j));
pw.print(",");
pw.println(mPowerSaveWhitelistApps.valueAt(j));
}
for (int j=0; j<mPowerSaveWhitelistUserApps.size(); j++) {
pw.print("user,");
pw.print(mPowerSaveWhitelistUserApps.keyAt(j));
pw.print(",");
pw.println(mPowerSaveWhitelistUserApps.valueAt(j));
}
}
}
} else if ("tempwhitelist".equals(cmd)) {
long duration = 10000;
String opt;
while ((opt=shell.getNextOption()) != null) {
if ("-u".equals(opt)) {
opt = shell.getNextArg();
if (opt == null) {
pw.println("-u requires a user number");
return -1;
}
shell.userId = Integer.parseInt(opt);
} else if ("-d".equals(opt)) {
opt = shell.getNextArg();
if (opt == null) {
pw.println("-d requires a duration");
return -1;
}
duration = Long.parseLong(opt);
}
}
String arg = shell.getNextArg();
if (arg != null) {
try {
addPowerSaveTempWhitelistAppChecked(arg, duration, shell.userId, "shell");
} catch (Exception e) {
pw.println("Failed: " + e);
return -1;
}
} else {
dumpTempWhitelistSchedule(pw, false);
}
} else if ("except-idle-whitelist".equals(cmd)) {
getContext().enforceCallingOrSelfPermission(
android.Manifest.permission.DEVICE_POWER, null);
final long token = Binder.clearCallingIdentity();
try {
String arg = shell.getNextArg();
if (arg == null) {
pw.println("No arguments given");
return -1;
} else if ("reset".equals(arg)) {
resetPowerSaveWhitelistExceptIdleInternal();
} else {
do {
if (arg.length() < 1 || (arg.charAt(0) != '-'
&& arg.charAt(0) != '+' && arg.charAt(0) != '=')) {
pw.println("Package must be prefixed with +, -, or =: " + arg);
return -1;
}
char op = arg.charAt(0);
String pkg = arg.substring(1);
if (op == '+') {
if (addPowerSaveWhitelistExceptIdleInternal(pkg)) {
pw.println("Added: " + pkg);
} else {
pw.println("Unknown package: " + pkg);
}
} else if (op == '=') {
pw.println(getPowerSaveWhitelistExceptIdleInternal(pkg));
} else {
pw.println("Unknown argument: " + arg);
return -1;
}
} while ((arg = shell.getNextArg()) != null);
}
} finally {
Binder.restoreCallingIdentity(token);
}
} else {
return shell.handleDefaultCommands(cmd);
}
return 0;
}