Doze模式adb shell命令集

来源:互联网 发布:网络诈骗常见形式 编辑:程序博客网 时间:2024/06/10 11:05

一、adb 指令

1.1 让设备进入未连接充电的模式

进行doze模式命令模拟的话,需要先下发该命令,因为只要存在充电状态,是无法从Acitve状态切换到InActive状态的

adb shell dumpsys battery unplug

Z90:/ # dumpsys battery unplugdumpsys battery unplug

1.2 退出Doze模式,让手机恢复正常需要复位充电模式

不使用doze命令模拟的时候,记得退出这个模式,不然电池电量状态可能不更新哦

adb shell dumpsys battery reset

Z90:/ # dumpsys battery resetdumpsys battery reset

1.3 Doze Help 命令查询

adb shell dumpsys deviceidle -h

Z90:/ # dumpsys deviceidle -hdumpsys deviceidle -hDevice 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 lightdumpsys deviceidle step lightStepped to light: IDLE_MAINTENANCEZ90:/ # dumpsys deviceidle step deepdumpsys deviceidle step deepStepped to deep: IDLE_PENDINGZ90:/ # dumpsys deviceidle force-idle lightdumpsys deviceidle force-idle lightNow forced in to light idle modeZ90:/ # dumpsys deviceidle force-idle deepdumpsys deviceidle force-idle deepNow forced in to deep idle modeZ90:/ # dumpsys deviceidle force-inactivedumpsys deviceidle force-inactiveLight state: OVERRIDE, deep state: IDLEZ90:/ # dumpsys deviceidle unforcedumpsys deviceidle unforceLight state: OVERRIDE, deep state: IDLEZ90:/ # dumpsys deviceidle get lightdumpsys deviceidle get lightOVERRIDEZ90:/ # dumpsys deviceidle get deepdumpsys deviceidle get deepIDLEZ90:/ # dumpsys deviceidle get forcedumpsys deviceidle get forcefalseZ90:/ # dumpsys deviceidle get screendumpsys deviceidle get screenfalseZ90:/ # dumpsys deviceidle get chargingdumpsys deviceidle get chargingfalseZ90:/ # dumpsys deviceidle get networkdumpsys deviceidle get networktrueZ90:/ # dumpsys deviceidle disable lightdumpsys deviceidle disable lightLight idle mode disabledZ90:/ # dumpsys deviceidle disable deepdumpsys deviceidle disable deepDeep idle mode disabledZ90:/ # dumpsys deviceidle disable alldumpsys deviceidle disable allZ90:/ # dumpsys deviceidle enable lightdumpsys deviceidle enable lightLight idle mode enableZ90:/ # dumpsys deviceidle enable deepdumpsys deviceidle enable deepDeep idle mode enabledZ90:/ # dumpsys deviceidle enable alldumpsys deviceidle enable allZ90:/ # dumpsys deviceidle whitelistdumpsys deviceidle whitelistsystem-excidle,com.android.providers.downloads,10001system-excidle,com.android.vending,10023system-excidle,com.google.android.gms,10014system,com.android.providers.downloads,10001system,com.google.android.gms,10014user,com.tencent.mm,10108user,com.vapp.aide.intl.arm64,10068user,com.google.android.gsf,10014user,com.tencent.mobileqq,10110user,com.facebook.katana,10092user,com.vapp.aide.intl,10025user,com.bsb.hike,10088Z90:/ # dumpsys deviceidle tempwhitelistdumpsys deviceidle tempwhitelist

三、具体源码

状态切换可以参考

http://blog.csdn.net/su749520/article/details/78570613

例如看状态切换

C:\Users\fadi.su>adb shell dumpsys battery unplugC:\Users\fadi.su>adb shell dumpsys deviceidle step deepStepped to deep: IDLE_PENDINGC:\Users\fadi.su>adb shell dumpsys deviceidle step deepStepped to deep: SENSINGC:\Users\fadi.su>adb shell dumpsys deviceidle step deepStepped to deep: LOCATINGC:\Users\fadi.su>adb shell dumpsys deviceidle step deepStepped to deep: IDLEC:\Users\fadi.su>adb shell dumpsys deviceidle step deepStepped to deep: IDLE_MAINTENANCEC:\Users\fadi.su>adb shell dumpsys deviceidle step deepStepped to deep: IDLEC:\Users\fadi.su>adb shell dumpsys deviceidle get deepIDLE
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;    }
原创粉丝点击