Android省电策略

Android省电策略

本文阐述 Android 上偏上层的一些功耗节省的策略,本文阐述的 API 到 Android P。

前言

自从大屏智能手机的诞生,续航问题就一直是让用户和手机厂商头疼,以至于“一天一充”普遍存在。 Android 在功耗问题上也下了不少功夫,在每个 Android 版本,从软件层面做很多升级和优化。

电力是驱使硬件工作的能源,因此手机的所有功耗都是被硬件所消耗。如屏幕需要电能显示,喇叭需要电能发出声音。软件如何省电呢?对手机而言,软件是功能的单元,通过软件驱动硬件工作,便产生了能源消耗。因此软件运行的越频繁,软件驱动的硬件数量越多,时间越长,频率越高,驱动力越大,电能消耗就越快

因此,要省电,就是让硬件不要浪费电,就是让软件不要浪费电,所以,软件越“懒”,手机就越省电

本文将从如下三方面论述省电策略:

  1. 让 APP 懒起来
  2. Android 系统省电策略
  3. 利用一些工具辅助开发

以上,我们将重点阐述第二点,Android 系统有那些功能,以尽可能的达到省电最大化。

让 APP 懒起来

应用开发者,应该参考如下准则去开发功能。

  1. 减少不必要的操作。如利用缓存代替重复下载;
  2. 延迟到合适时机。如等待手机连接上充电器才备份数据到云端。
  3. 合拼。如多个任务,能合拼一起处理代替多个任务触发手机各自触发。

Android 系统省电策略

Android 系统提供如下三方面的功能优化功耗消耗:

  1. 睡眠模式和应用待机
  2. 应用待机分组
  3. 后台限制

下文,将从这三方面,详细阐述它们的工作机理。

睡眠模式和应用待机

Android 睡眠(Doze)模式和应用待机是 Android 6.0 加的功能。当手机没有连接充电器且灭屏一段时间以后,手机将会自动进入 Doze 模式,在该模式下,应用的网络访问,CPU 计算,jobs, alarm, sync 将会受到影响。手机在睡眠模式下一段时间后,会自动退出睡眠模式,执行应用等待的 jobs、 alarm、 sync 和允许应用访问网络,这段时间 Android 把它叫 maintenance window。maintenance window 结束后,手机会继续进入 Doze 模式,不停重复着。而且下一次的 maintenance window 比上一次 maintenance window 来的更晚,也就是说后一次 Doze 模式时间比上一次 Doze 模式时间要长。

Android省电策略_第1张图片

Doze模式对App的限制

  • 网络访问暂停
  • 系统忽略 wake locks
  • 标准 alarms 推迟到下一个 maintenance window
  • 不扫描 WiFi
  • 不允许 sync
  • 不允许 jobs

Doze模式特殊情况

  • Doze 模式中, FCM(Firebase Cloud Messaging) 不受影响
  • 设置应急 alram,setAndAllowWhileIdle() and setExactAndAllowWhileIdle()

应用待机

当应用空闲且一段时间没有被使用,系统就会决定把这个应用放进应用待机中。

触发系统这一决定,用户必须一段时间没有使用过该应用,且以下条件不成立:

  • 用户启动应用
  • 应用进程不在前台
  • 没有锁屏通知和通知中心通知
  • 不是一个允许中的 admin app

更多内容,在下文《应用待机分组》中论述。

黑白名单

白名单中的应用,在 Doze 模式和应用待机时,可以继续访问网络和持有 partial wake locks。应用可以同坐接口 isIgnoringBatteryOptimizations() 检测是否在白名单队列。

手机用户可以在 Settings > Battery > Battery Optimization 中改变应用的黑白名单。另外,系统提供如下两个 intent,应用可以利用 intent 发起黑白名单的询求。

  • ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS
  • REQUEST_IGNORE_BATTERY_OPTIMIZATIONS

Doze策略

请看文章结尾的 Power management restrictions 图片。

测试

强制进入 Doze 模式

adb shell dumpsys deviceidle force-idle

强制退出 Doze 模式

adb shell dumpsys deviceidle unforce

省电模式

adb shell settings put global low_power 1

重置电池状态

adb shell dumpsys battery reset

进入应用待机

adb shell dumpsys battery unplug
adb shell am set-inactive <packageName> true

退出应用待机和获取应用待机状态

adb shell am set-inactive <packageName> false
adb shell am get-inactive <packageName>

Doze原理

进入 Doze 逻辑

Android省电策略_第2张图片

网络过滤

Android省电策略_第3张图片

Jobs 过滤

Android省电策略_第4张图片

定位过滤

Android省电策略_第5张图片

WiFi过滤

Android省电策略_第6张图片

Dump Doze stats

可以利用如下命令 dump doze 的状态

adb shell dumpsys deviceidle

应用待机分组

在 Android P 新增了应用待机分组功能,依据应用的使用情况,对应用进行不同的分组,从而实施不同的限制策略。

默认情况下,Android 会自动给每一个应用进行分组,应用可以通过 UsageStatsManager.getAppStandbyBucket 获取应用处于哪一分组。

下面是应用待机分组的组别:

  • Active: 应用正在被使用或者经常被使用
  • Working set: 应用定期频繁使用
  • Frequent: 经常使用,但不是每一天
  • Rare: 应用很少使用
  • Never:应用从不被使用

分组限制策略

请看文章结尾的 Power management restrictions 图片。

测试

// disconnect charge
adb shell dumpsys battery unplug
// set standby-bucket for app
adb shell am set-standby-bucket packagename active|working_set|frequent|rare
// batch operation
adb shell am set-standby-bucket package1 bucket1 package2 bucket2...
// get standby-bucket 
adb shell am get-standby-bucket [packagename]

应用待机分组原理

Android省电策略_第7张图片

后台限制

在 Android 7.0, 很多在 manifest 中注册注册的广播将无效。从 Android 9 开始,后台限制做了升级,如果应用存在一些异常行为,系统将会提示用户限制应用使用系统资源。

应用存在如下行为将会触发提示:

  • 过量 wake locks: 灭屏后持有 1 个 partial wake locks 超过 1 小时
  • 过量后台服务:API 小于 26 的应用存在太多后台服务

需要注意的是,这个提示并不是 Android 系统本身的功能,而是 Google Play 提供的一项功能,详情可以了解 Andoid vitals,

后台限制策略

被限制的应用将不能运行 jobs,触发 alarm,和访问网络,除非该应用在前台。

测试

adb shell cmd appops set <package_name> RUN_IN_BACKGROUND ignore

adb shell cmd appops set <package_name> RUN_IN_BACKGROUND allow

后台限制原理

参考:

  1. Memory-mapped file
  2. Paging

Power management restrictions 图片

Android省电策略_第8张图片

你可能感兴趣的:(Android,system,addition)