1.Doze模式下豁免的应用和白名单列表

1.什么是白名单列表?

一系列应用包名的集合。

2.有什么作用?

处于白名单列表中的应用,不受Doze的影响,即Doze不会对该应用进行限制,如该应用的Job、Alarm、网络等不会进行限制。

3.DeviceIdleController中对白名单的读取

Doze白名单有两类来源:

  • 1.用户设置
  • 2.预置到配置文件中。

用户设置的将最终写到/data/system/deviceidle.xml文件中。
来看下可以预值的配置文件有哪些?以及是如何读取的。在onStart()方法中,通过SystemConfig类读取了两类配置文件:

    @Overridepublic void onStart() {synchronized (this) {SystemConfig sysConfig = SystemConfig.getInstance();//得到允许在省电模式豁免但不允许IDLE状态豁免的应用列表,读取的是/etc/permissions/platform.xml中//的<allow-in-power-save-except-idle>元素的应用包名ArraySet<String> allowPowerExceptIdle = sysConfig.getAllowInPowerSaveExceptIdle();for (int i=0; i<allowPowerExceptIdle.size(); i++) {String pkg = allowPowerExceptIdle.valueAt(i);try {//过滤只得到系统应用,并加入mPowerSaveWhitelistAppsExceptIdle中ApplicationInfo ai = pm.getApplicationInfo(pkg,PackageManager.MATCH_SYSTEM_ONLY);int appid = UserHandle.getAppId(ai.uid);mPowerSaveWhitelistAppsExceptIdle.put(ai.packageName, appid);mPowerSaveWhitelistSystemAppIdsExceptIdle.put(appid, true);} catch (PackageManager.NameNotFoundException e) {}}//得到允许在省电模式和IDLE状态都豁免的应用列表,读取的是/etc/permissions/platform.xml中//的<allow-in-power-save>元素的应用包名ArraySet<String> allowPower = sysConfig.getAllowInPowerSave();for (int i=0; i<allowPower.size(); i++) {String pkg = allowPower.valueAt(i);try {//过滤只得到系统应用,加入mPowerSaveWhitelistAppsExceptIdle和mPowerSaveWhitelistApps中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.put(ai.packageName, appid);mPowerSaveWhitelistSystemAppIdsExceptIdle.put(appid, true);mPowerSaveWhitelistApps.put(ai.packageName, appid);mPowerSaveWhitelistSystemAppIds.put(appid, true);} catch (PackageManager.NameNotFoundException e) {}}//读取/data/system/deviceidle.xml中的配置应用到mPowerSaveWhitelistUserApps中readConfigFileLocked();//更新所有的白名单列表updateWhitelistAppIdsLocked();}

因此,对于系统应用,可以在/etc/permissions/platform.xml中预设,如果是三方应用,目前还没有可预置的,只能手动添加。或者可以自定义一个xml文件,在DeviceIdleController中进行读取。

注:/data/system分区下的数据一旦恢复出厂设置,就会被擦除,因此不能预置到/data/system/deviceidle.xml中。

4.如何添加应用到白名单列表?

  • 1.通过“设置”>“应用和通知”>“特殊应用权限”>“电池优化”中添加或移除;
  • 2.对于系统应用,预值到/etc/permissions/platform.xml中。

5.如何实现对白名单应用不受限?

在代码中看到,DeviceIdleController中只会收集白名单应用列表,然后将这个列表传递给对应模块做具体的限制工作:

//将白名单列表传递给AMS
mLocalActivityManager.setDeviceIdleWhitelist(mPowerSaveWhitelistAllAppIdArray);
//将白名单列表传递给PMS,申请wakelock时将会判断是否忽略
mLocalPowerManager.setDeviceIdleWhitelist(mPowerSaveWhitelistAllAppIdArray);
//将白名单列表传递给Alarm,设置Alarm时将会判断是否忽略
mLocalAlarmManager.setDeviceIdleUserWhitelist(mPowerSaveWhitelistUserAppIdArray);

此外,DIC还提供了用于获取白名单列表的接口,其他模块通过LocalService从DeviceIdleController中获取这个列表:

int[] getPowerSaveWhitelistUserAppIds() {synchronized (this) {return mPowerSaveWhitelistUserAppIdArray;}
}

如在DeviceIdleJobController中:

mDeviceIdleWhitelistAppIds =mLocalDeviceIdleController.getPowerSaveWhitelistUserAppIds();

NOTE:使用 setAndAllowWhileIdle()setExactAndAllowWhileIdle()设置的闹钟将不会被Doze限制。

2.Debug Doze

可以在adb shell环境下通过dumpsys命令来DebugDoze,不过首先必须将电池充电状态置为未充电状态:

adb shell dumpsys battery unplug   # 将电池充电状态设置为unplug

然后通过adb shell dumpsys deviceidle命令就可以进行Debug了,通过adb shell dumpsys deviceidle help来查看所有参数:

@ubuntu:~$ adb shell dumpsys deviceidle help
Device idle controller (deviceidle) commands:helpPrint 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-inactiveForce to be inactive, ready to freely step idle states.unforceResume 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.whitelistPrint currently whitelisted apps.whitelist [package ...]Add (prefix with +) or remove (prefix with -) packages.except-idle-whitelist [package ...|reset]Prefix the package with '+' to add it to whitelist or '=' to check if it is already whitelisted[reset] will reset the whitelist to it's original stateNote that unlike <whitelist> cmd, changes made using this won't be persisted across bootstempwhitelistPrint packages that are temporarily whitelisted.tempwhitelist [-u USER] [-d DURATION] [package ..]Temporarily place packages in whitelist for DURATION milliseconds.If no DURATION is specified, 10 seconds is used

如:

adb shell dumpsys deviceidle enable light    # 开启LightDoze功能
adb shell dumpsys deviceidle step light     #每执行一次,将会进入到LightDoze下一状态
adb shell dumpsys deviceidle whitelist   # 查看当前Doze白名单
adb shell dumpsys deviceidle whitelist +com.android.settings     #将Settings加入白名单

掌握DIC的dumpsys命令,对于平时调试很有帮助。

至此,Doze模式的分析就告一段落了。

Android 8.1 Doze模式分析(五) Doze白名单及Debug方式相关推荐

  1. Android源码配置第三方应用电池白名单流程分析笔记

    这里以MTK6765 Android S举例说明,Android系统在加载客户应用白名单的过程. 首先Android系统可以根据不同手机厂商的需要进行源码的定制,当然定制应用白名单也是可以的,一般情况 ...

  2. Android 8.1 Doze模式分析(一)——Doze简介和DeviceIdleController的启动

    概述 Doze模式,官方翻译为低电耗模式,是Andoriod6.0增加的一项系统服务,主要目的是为了优化电池性能,增加电池续航时间,Doze模式又分两种模式:深度Doze模式(Deep Doze)和轻 ...

  3. android 11.0 12.0app应用安装白名单

    1.概述 在11.0 12.0定制化开发中,客户需求要实现应用安装白名单功能,在白名单之中的应用可以安装,其他的app不准安装,实现一个 控制app安装的功能,这需要从app安装流程入手就可以实现功能 ...

  4. android q(10.0)app应用卸载白名单

    1.概述 在10.0的系统产品开发中,对于app的卸载管理通常是有系统的PM负责管理的.所以在app应用卸载白名单功能的实现也是从PM在卸载方法中,按照白名单进行卸载 2.app应用卸载白名单的核心类 ...

  5. Android 进程保活资料汇总与华为白名单那些事

    现在发现App在后台运行越来越难了.App在华为手机后台死的非常快,之前看网上说华为有白名单,网上也通过改包名的方式来验证了.但是半信半疑的,直到咨询了华为的客服给了一个邮箱 developer@hu ...

  6. Android 8.1 Doze模式分析(四)——Doze模式的退出

    概述 Doze的退出,说的更严格一点,就是当Doze模式的状态由其他状态变为ACTIVE状态.简而言之,退出Doze模式有三种情况:屏幕亮屏.插入充电器.设备有移动.下面就这三种情况进行下分析. 在前 ...

  7. android 加载图片黑屏,Android 中启动页黑屏及白屏的解决方式

    启动页黑屏或白屏的原因是,当Activity启动的时候不能马上加载layout. 而黑屏或者白屏是你的theme主题的默认样式,当layout没加载出来就显示黑屏或者白屏. 1.windowBackg ...

  8. 【Android 电量优化】电量优化特性 ( Doze 低电耗模式 | Standby 应用待机模式 | 白名单设置 | 白名单添加系统设置界面 | 指定应用的白名单添加界面 | 测试应用 )

    文章目录 一.Doze 低耗电模式简介 二.Standby 应用待机模式简介 三.Doze 和 Standby 模式测试 四.白名单添加 ( 方式一 ) 五.白名单添加 ( 方式二 ) Android ...

  9. Android 8.0学习(16)---8.0 的Doze模式白名单路径

    Android O 的Doze模式白名单路径 Doze 模式列表 上述备注规则如下 if(powerWhitelist.isSysWhitelisted(pkg)) {// Summary of ap ...

最新文章

  1. Pytorch+CNN+MNIST手写数字识别实战
  2. ExtJs_关于combobox的那些分页二三事
  3. 正则表达的式的基本功能
  4. socket不能bind请求的地址_socket通信原理
  5. cac会议投稿难度大吗_发表 SCI 论文有多难?
  6. 变形金刚热映黑客借机“下毒” 用户谨防木马
  7. golang 编辑xml 内容_Linux 搭建 golang 开发环境
  8. Error:scalac: missing or invalid dependency detected while loading class file ‘RDDOperationScope.cla
  9. C#如何直接调用非托管代码
  10. Spring-web-HandlerMethodReturnValueHandler
  11. DataSet自定义添加table并添加数据
  12. jmeter下载安装使用教程
  13. 推荐几个微信小程序开源项目
  14. 2021年企业选型OA系统十大品牌
  15. LayoutInflater Factory
  16. 传感器实验——超声波测距
  17. 把一个人的特点写具体作文_五年级把一个人的特点写具体作文500字5篇
  18. 分治法查找最大和次大元素
  19. Android Snackbar控件
  20. 微信电脑版收到的表格文件保存到桌面打开后不显示内容

热门文章

  1. 软件测试用哪个版本linux,技术|如何在 Linux 中不安装软件测试一个软件包
  2. 我们分析了1亿条阅读量超高的标题,这就是为什么你会被标题党吸引
  3. Android获取Bitmap网络图片类型
  4. 有哪些免费在线压缩图片的方法或工具
  5. 网络安全应急响应-终端检测与响应技术
  6. 第 24 章 基于 Simulink 进行图像和视频处理--matlab深度学习实战整理
  7. 第8章-SpringCloud之一统天下(微服务)
  8. HOST文件修改后无法保存,或无法修改 解决方案
  9. matlab如何打开xlsx表格,matlab 读取word的表格
  10. 开年科普:小米、一加手机辐射最大?可能没有香蕉大