Doze中的白名单

预备知识:

Doze机制是Google为了提升设备续航时间设计的一套方案,设备处在idle下,通过限制非白名单应用的网络、job执行时间、调整alarm触发时间、禁止wifi扫描、丢弃部分wakelock等行为,可以有效的降低设备在doze状态下的功耗。
而对于白名单应用,上述行为在设备进入到idle状态时,均不会进行限制。light idle和deep idle共用一套白名单。

doze白名单分类

doze中白名单有4个列表:

名称 含义 doze中对应的数据结构
system whitelist 系统白名单 mPowerSaveWhitelistApps
system-except-idle 系统except-idle白名单 mPowerSaveWhitelistAppsExceptIdle
user whitelist 用户白白名单 mPowerSaveWhitelistUserApps
temp whitelist 临时白名单 mTempWhitelistAppIdEndTimes

(1)一般来说,手机厂商都会针对于user whitelist进行定制,根据业务需求添加不同应用进去。
(2)通过adb shell dumpsys deviceidle whitelist +/- pkgName也是在user whitelist中进行更改。
(3)temp whitelist属于临时白名单应用,比如后台应用想要拉起服务时,会将自身加入到临时doze白名单中,不受doze和power等模块的约束,时间到时后,会从名单中删除该应用。
(4)idle状态下,处在system whitelist、user whitelist和temp whitelist中的应用是不受任何限制的。

system whitelist和system-except-idle whitelist:

初始化

这两个名单在DeviceidleController初始化的时候填充。
从代码中发现,mPowerSaveWhitelistApps中的应用包含在了mPowerSaveWhitelistAppsExceptIdle中。而mPowerSaveWhitelistApps中的应用一般都是带android、Qualcomm字段的应用。

    public void onStart() {final PackageManager pm = getContext().getPackageManager();synchronized (this) {mLightEnabled = mDeepEnabled = getContext().getResources().getBoolean(com.android.internal.R.bool.config_enableAutoPowerModes);SystemConfig sysConfig = SystemConfig.getInstance();//从AOSP配置文件中读取以allow-in-power-save-except-idle开头的except-idle名单ArraySet<String> allowPowerExceptIdle = sysConfig.getAllowInPowerSaveExceptIdle();for (int i=0; i<allowPowerExceptIdle.size(); i++) {String pkg = allowPowerExceptIdle.valueAt(i);try {ApplicationInfo ai = pm.getApplicationInfo(pkg,PackageManager.MATCH_SYSTEM_ONLY);int appid = UserHandle.getAppId(ai.uid);//放入到mPowerSaveWhitelistAppsExceptIdle中mPowerSaveWhitelistAppsExceptIdle.put(ai.packageName, appid);mPowerSaveWhitelistSystemAppIdsExceptIdle.put(appid, true);} catch (PackageManager.NameNotFoundException e) {}}//从系统配置文件中读取以allow-in-power-save开头的应用ArraySet<String> allowPower = sysConfig.getAllowInPowerSave();for (int i=0; i<allowPower.size(); i++) {String pkg = allowPower.valueAt(i);try {ApplicationInfo ai = pm.getApplicationInfo(pkg,PackageManager.MATCH_SYSTEM_ONLY);int appid = UserHandle.getAppId(ai.uid);// These apps are on both the whitelist-except-idle as well// as the full whitelist, so they apply in all cases.//放入到mPowerSaveWhitelistAppsExceptIdle中mPowerSaveWhitelistAppsExceptIdle.put(ai.packageName, appid);mPowerSaveWhitelistSystemAppIdsExceptIdle.put(appid, true);//放入到mPowerSaveWhitelistApps中mPowerSaveWhitelistApps.put(ai.packageName, appid);mPowerSaveWhitelistSystemAppIds.put(appid, true);} catch (PackageManager.NameNotFoundException e) {}}.......}

system whitelist 的adb命令操作内容:

通过adb命令操作system whitelist中的内容时:
adb shell dumpsys deviceidle sys-whitelist -pkgName:调用的是removeSystemPowerWhitelistAppInternal函数:
1、移除的移除的应用必须是白名单的应用;
2、将被移除的应用添加到mRemovedFromSystemWhitelistApps(这个数据结构的作用下面会讲)。

    public boolean removeSystemPowerWhitelistAppInternal(String name) {synchronized (this) {//移除的应用必须是白名单的应用if (!mPowerSaveWhitelistApps.containsKey(name)) {return false;}// 添加到mRemovedFromSystemWhitelistApps中mRemovedFromSystemWhitelistApps.put(name, mPowerSaveWhitelistApps.remove(name));//发送名单变化的广播reportPowerSaveWhitelistChangedLocked();//向ams等其他模块通知名单变化,并将最新的名单发送过去updateWhitelistAppIdsLocked();//写入到文件中writeConfigFileLocked();return true;}}

adb shell dumpsys deviceidle sys-whitelist +pkgName:调用的是restoreSystemPowerWhitelistAppInternal函数:
1、添加的应用必须在mRemovedFromSystemWhitelistApps中。

    public boolean restoreSystemPowerWhitelistAppInternal(String name) {synchronized (this) {//如果mRemovedFromSystemWhitelistApps中不包含该应用,那么直接退出;if (!mRemovedFromSystemWhitelistApps.containsKey(name)) {return false;}//添加到mPowerSaveWhitelistApps中mPowerSaveWhitelistApps.put(name, mRemovedFromSystemWhitelistApps.remove(name));//发送名单变化的广播reportPowerSaveWhitelistChangedLocked();//向ams等其他模块通知名单变化,并将最新的名单发送过去updateWhitelistAppIdsLocked();//写入到文件中writeConfigFileLocked();return true;}}

mRemovedFromSystemWhitelistApps的作用:保证system 白名单的不变性。删除系统白名单时,将应用添加进去;添加系统白名单时,如果被添加的应用不在mRemovedFromSystemWhitelistApps中,那么就不是最开始初始化时的白名单应用,那么不准添加到system 白名单中。

system-except-idle whitelist的adb命令操作内容

adb shell dumpsys deviceidle except-idle-whitelist +pkgName:

调用的是addPowerSaveWhitelistExceptIdleInternal函数,将应用加入到mPowerSaveWhitelistAppsExceptIdle中。

adb shell dumpsys deviceidle except-idle-whitelist +pkgName:

调用的是addPowerSaveWhitelistExceptIdleInternal函数,将应用加入到mPowerSaveWhitelistAppsExceptIdle中。

user whitelist

各大手机厂商定制的名单均在这个列表中。通过adb shell dumpsys deviceidle whitelist相关的命令操作名单变化会改变mPowerSaveWhitelistUserApps中的内容,并且会通知到其他模块。
DeviceidleController中也有向外提供的方法,将应用加入到mPowerSaveWhitelistUserApps中,但是所需要的权限较高,一般systemServer进程和uid=1000的应用可以调用。

adb shell deviceidle whitelist +pkgName:

通过addPowerSaveWhitelistAppsInternal向mPowerSaveWhitelistUserApps添加内容;
简单看下该函数:

    private int addPowerSaveWhitelistAppsInternal(List<String> pkgNames) {int numAdded = 0;int numErrors = 0;synchronized (this) {for (int i = pkgNames.size() - 1; i >= 0; --i) {final String name = pkgNames.get(i);if (name == null) {numErrors++;continue;}try {ApplicationInfo ai = getContext().getPackageManager().getApplicationInfo(name,PackageManager.MATCH_ANY_USER);//向mPowerSaveWhitelistUserApps添加内容if (mPowerSaveWhitelistUserApps.put(name, UserHandle.getAppId(ai.uid))== null) {numAdded++;}} catch (PackageManager.NameNotFoundException e) {Slog.e(TAG, "Tried to add unknown package to power save whitelist: " + name);numErrors++;}}if (numAdded > 0) {//发送名单变化的广播reportPowerSaveWhitelistChangedLocked();//更新到power等模块updateWhitelistAppIdsLocked();//写到文件中writeConfigFileLocked();}}return pkgNames.size() - numErrors;}
adb shell deviceidle whitelist -pkgName:

通过removePowerSaveWhitelistAppInternal从mPowerSaveWhitelistUserApps删除内容;

Android之doze机制的白名单相关推荐

  1. Android PhoneGap源码分析——白名单

    对于单独的Web app应用来说,加载进来的url一般不能保证它的安全性.那么如何来处理url安全性的问题呢. 让我们来看看PhoneGap是如何做的. PhoneGap采用了白名单的形式,认为在白名 ...

  2. [Android]PhoneGap源码分析——白名单

    对于单独的Web app应用来说,加载进来的url一般不能保证它的安全性.那么如何来处理url安全性的问题呢. 让我们来看看PhoneGap是如何做的. PhoneGap采用了白名单的形式,认为在白名 ...

  3. android 11.0app应用卸载白名单

    1.概述 在11.0定制化开发中,客户需求要实现应用卸载白名单功能,用来管理第三方app卸载功能,需要在白名单之中的应用可以卸载,其他的app不准卸载,实现一个管理第三方app卸载的功能,这需要从ap ...

  4. Android 10.0进程加入白名单,避免被杀掉

    1.概述 在10.0的系统产品开发中,对于产品开发中,对于一些重要进程,是不想被系统在低内存的情况下,杀掉进程, 所以需要把进程加入白名单,在系统杀进程的时候,不去杀掉进程 2.进程加入白名单,避免被 ...

  5. Android开发让用户开白名单,Android 添加白名单实现保活

    Android 白名单保活 最近有遇到保活的需求,一开始想到的就是之前的黑科技保活比如像素Activity,播放无声MP3,双进程等方法,但是随着Android系统的更新,这些非常规的方法或多或少都已 ...

  6. Android中添加APP到白名单

    参考网址:https://blog.csdn.net/xiaoerbuyu1233/article/details/122130165 在 AndroidManifest.xml 文件中配置一下权限 ...

  7. android 11.0 设置wifi白名单

    1.概述 在11.0产品定制化开发中,产品需求要求对wifi的管理比较严格,所以设置wifi白名单和wifi黑名单这样的需求也是常见的, 需求要求设置wifi白名单功能,就是在这个白名单的wifi s ...

  8. Android系统的特许权限白名单

    目录 一.什么是特权应用 二.Android系统的特许权限 三.特许权限白名单 1.白名单限制宏开关 2.日志打印 3.添加白名单 一.什么是特权应用 特权应用(Privileged Applicat ...

  9. android https请求证书过滤白名单,Android处理https请求的证书问题

    android中对部分站点发送https请求会报错,原因是该站点的证书时自定义的,而非官方的,android手机不信任其证书,为了解决这个问题,一般有两种解决方案 忽略证书验证 下载证书到本地,添加到 ...

最新文章

  1. Microsoft宣称Visual Studio Installer将退役
  2. getsockname和getpeername
  3. 软件工程概论 课堂练习 第3次作业3【画出“工资处理”子系统的结构图】
  4. [CQOI2012]交换棋子【网络流】【费用流】
  5. 一次MYSQL 服务器性能优化之旅
  6. 禅道启动mysql报错_测试工具之在Linux服务器上部署禅道Bug管理系统
  7. 在P2P市场中代替“看不见的手”的算法在哪里
  8. C——任意一个偶数分解两个素数
  9. python编写arcgis脚本_ArcGis Python脚本——批量添加字段
  10. springboot全局异常处理_SpringBoot:如何优雅地处理全局异常
  11. idea package放在什么位置_NBA现役球员大排名,你会把20岁的东契奇放在什么位置?...
  12. 《CSS权威指南》读书笔记
  13. EMC VMAX关于vault有关的概念
  14. Spring -> Spring Boot、Spring MVC 和 Spring 有什么区别
  15. linux上cgconfig服务,linux系统调优-Cgroups
  16. ng-class和ng-show的使用
  17. Destoon增加内容页的浏览历史记录
  18. 在python中gevent monkey_patch 出现Monkey-patching may lead to errors解决
  19. 1024程序员节!!
  20. 复数矩阵求逆的 C 语言程序

热门文章

  1. RGB转换成CMYK
  2. Oracle常用函数总结
  3. 使用ADB命令卸载软件
  4. Xcode 12 GM发行说明,快来看看SwiftUI和Swift都更新哪些新技术吧
  5. 计算机组成与设计project1,计算机组成与体系结构(性能设计)答案完整版-第八版...
  6. 同步线程和异步线程的区别
  7. Swift 动画 —— 数字滚动UILabel动画
  8. 荣盛发展,或正在步华夏幸福后尘
  9. 这是一则招聘贴——招聘区块链系统开发实习生
  10. 【IDEA】idea插件的安装和删除