欢迎光临
我们一直在努力

手机省电策略,android 电量优化

Android省电策略

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

前言

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

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

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

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

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

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

让 APP 懒起来

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

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

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

睡眠模式和应用待机应用待机分组后台限制

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

睡眠模式和应用待机

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 模式时间要长。

Doze模式对App的限制 网络访问暂停系统忽略 wake locks标准 alarms 推迟到下一个 maintenance window不扫描便宜香港vps 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_SETTINGSREQUEST_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 unplugadb shell am set-inactive <packageName> true

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

adb shell am set-inactive <packageName> falseadb shell am get-inactive <packageName> Doze原理

进入 Doze 逻辑

网络过滤

Jobs 过滤

定位过滤

WiFi过滤

Dump Doze stats

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

adb shell dumpsys deviceidle 应用待机分组

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

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

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

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

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

测试 // disconnect chargeadb shell dumpsys battery unplug// set standby-bucket for appadb shell am set-standby-bucket packagename active|working_set|frequent|rare// batch operationadb shell am set-standby-bucket package1 bucket1 package2 bucket2…// get standby-bucket adb shell am get-standby-bucket [packagename] 应用待机分组原理

后台限制

在 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 ignoreadb shell cmd appops set <package_name> RUN_IN_BACKGROUND allow 后台限制原理

参考:

Memory-mapped filePaging Power management restrictions 图片

10747661

赞(0)
【声明】:本博客不参与任何交易,也非中介,仅记录个人感兴趣的主机测评结果和优惠活动,内容均不作直接、间接、法定、约定的保证。访问本博客请务必遵守有关互联网的相关法律、规定与规则。一旦您访问本博客,即表示您已经知晓并接受了此声明通告。