电量优化上-电量统计原理&系统电量优化历程

18 篇文章 0 订阅
5 篇文章 0 订阅

电量统计原理

Android 系统的电流统计框架是 BatteryStatsService

框架通过统计各个模块组件的状态耗电时长与电源配置文件来估算应用与设备的耗电量

Android系统规定:设备制造商必须提供组件的电源配置文件,该配置文件定义了组件的电流消耗值以及该组件在一段时间内大概消耗的电量,该配置文件的地址为:platform/frameworks/base/core/res/res/xml/power_profile.xml

我们知道:电功(P)=电压(U) * 电流(I) * 时长(t)

手机电压一般都是恒定不变的,电源配置文件是原始设备制造商给出的各个组件在各个状态下 单位时间内的电流量,

所以,系统框架只需要统计组件在各个状态下的使用时长然后再和该状态下电流量进行计算便可以估算组件的耗电量。

即:模块电量=模块使用时长*模块电量

资源消耗与使用资源的应用相关。当多个应用同时使用某项资源(例如防止系统挂起的唤醒锁)时,系统框架会将资源消耗量分摊到这些应用上,但不一定会均分。

为了避免由于系统关闭事件而丢失电池使用统计信息(这些统计信息可能表明存在电池功耗问题,比如由于电池电量耗尽而关闭),系统框架会大约每 30 分钟发送一次统计信息。

下面给出三星 SM-G6100手机下的power_profile.xml

<?xml version="1.0" encoding="utf-8"?>
<device name="Android">
    <item name="none">0</item>
    <item name="screen.on">77</item>//屏幕以最低亮度打开时消耗的额外电量。
    <item name="screen.full">183</item>//与处于最低亮度的屏幕相比,当屏幕处于最高亮度时消耗的额外电量。
    <item name="bluetooth.active">60</item>
    <item name="bluetooth.on">1.2</item>
    <item name="wifi.on">1</item>//	当 WLAN 打开,但未接收、发送信号或执行扫描时消耗的额外电量。
    <item name="wifi.active">250</item>//	通过 WLAN 发送或接收信号时消耗的额外电量
    <item name="wifi.scan">78</item>//WLAN 正在扫描无线接入点时消耗的额外电量
    <item name="dsp.audio">26</item>
    <item name="dsp.video">62</item>
    <item name="camera.avg">296</item>//用于典型相机应用的相机子系统的平均电量消耗。
    <item name="camera.flash light">177</item>//摄像头闪光模块开启时消耗的平均电量。
    <item name="gps.on">32</item>//GPS 获取信号时消耗的额外电量。
    <item name="radio.active">124</item>//蜂窝无线电发送/接收信号时消耗的额外电量。
    <item name="radio.scanning">93</item>//移动网络无线装置寻呼发射塔时消耗的额外电量。
    <array name="radio.on">//蜂窝无线电开启时消耗的额外电量。多值条目,每个信号强度(无信号、弱、良好、强)各有一个值。
        <value>2.2</value>
        <value>2.2</value>
        <value>2.2</value>
        <value>2.2</value>
        <value>2.2</value>
        <value>2.2</value>
    </array>
    <array name="cpu.clusters.cores">
        <value>4</value>
        <value>4</value>
    </array>
    <array name="cpu.active.cluster0">
        <value>23</value>
        <value>39</value>
        <value>60</value>
        <value>83</value>
        <value>99</value>
        <value>115</value>
        <value>124</value>
    </array>
    <array name="cpu.speeds.cluster0">
        <value>652800</value>
        <value>1036800</value>
        <value>1401600</value>
        <value>1689600</value>
        <value>1843200</value>
        <value>1958400</value>
        <value>2016000</value>
    </array>
    <array name="cpu.active.cluster1">
        <value>23</value>
        <value>39</value>
        <value>60</value>
        <value>83</value>
        <value>99</value>
        <value>115</value>
        <value>124</value>
    </array>
    <array name="cpu.speeds.cluster1">
        <value>652800</value>
        <value>1036800</value>
        <value>1401600</value>
        <value>1689600</value>
        <value>1843200</value>
        <value>1958400</value>
        <value>2016000</value>
    </array>
    <item name="cpu.idle">3.4</item>//CPU(和 SoC)处于系统挂起状态时系统消耗的总电量
    <item name="cpu.awake">18</item>//CPU 处于调度空闲状态(内核空闲循环)时消耗的额外电量;系统没有处于系统挂起状态。
    <item name="wakeup.power">0.15</item>
    <item name="battery.capacity">3300</item>//总电池容量(以毫安时为单位)。
    <array name="wifi.batchedscan">
        <value>.0002</value>
        <value>.002</value>
        <value>.02</value>
        <value>.2</value>
        <value>2</value>
    </array>
</device>
BatteryStatsService概述

BatteryStatsService是Android系统的电流统计系统,电量统计主要实现类是 BatteryStatsImpl 该类继承于 BatteryStats
BatteryStats实现了Parcelable ,所以BatteryStatsImpl电量信息可以打包进Parcel包中,进而在进程间传递

BatteryStatsService按照应用uid 统计相关进程的所有电量信息,

BatteryStatsService为了实现电量的统计,其内部有着众多的计量工具,主要是两大类 Counter计数,Timer计数,其下又有着众多的子类,此处不再叙述

BatteryStatsService主要统计以下模块的耗电

在这里插入图片描述

Android系统电量优化历程

Android4.4

Android 4.4 引入硬件传感器批处理,这是一项新的优化功能,可以显著降低传感器持续活动所消耗的电量。传感器批处理适用于低功耗、长时间运行的用例,例如健身、位置跟踪、监控等。它能使您的应用更加高效,让您可以持续跟踪传感器事件 — 即使在屏幕关闭和系统处于睡眠状态

Android5.0

开启了一个Volta 项目,目标是改善电池的续航。在优化电量的同时,还增加了的 dumpsys batteryst 等工具生成设备电池使用情况统计数据

新增 JobScheduler 后台任务管理

新增battery-historian 电量查看工具

修复native fork 双进程保活的bug

Android6.0

新增低电耗模式和应用待机模式

  • 低电耗模式:如果用户拔下设备的电源插头,并在屏幕关闭后的一段时间内使其保持不活动状态,设备会进入低电耗模式,在该模式下设备会尝试让系统保持休眠状态。在该模式下,设备会定期短时间恢复正常工作,以便进行应用同步,还可让系统执行任何挂起的操作。
  • 应用待机模式:应用待机模式允许系统判定应用在用户未主动使用它时处于空闲状态。当用户有一段时间未触摸应用时,系统便会作出此判定。如果拔下了设备电源插头,系统会为其视为空闲的应用停用网络访问以及暂停同步和作业。
Android7.0

一、进一步优化省电模式

二、进一步增强低电耗模式 :

​ Android 6.0(API 级别 23)引入了低电耗模式,当用户设备未插接电源、处于静止状态且屏幕关闭时,该模式会推迟 CPU 和网络活动,从而延长电池寿命。而 Android 7.0 则通过在设备未插接电源且屏幕关闭状态下、但不一定要处于静止状态(例如用户外出时把手持式设备装在口袋里)时应用部分 CPU 和网络限制,进一步增强了低电耗模式。

三、Project Svelte:后台优化

​ 删除三个常用隐式广播CONNECTIVITY_ACTIONACTION_NEW_PICTUREACTION_NEW_VIDEO — 因为这些广播可能会一次唤醒多个应用的后台进程,同时会耗尽内存和电池。

四、配置文件指导的 JIT/AOT 编译(新增混合编译)

​ Android 运行组件在管理配置文件指导的编译时,可最大程度降低对设备电池的影响。仅当设备处于空闲状态和充电时才进行编译,从而可以通过提前执行该工作节约时间和省电。

Android8.0

一、JobScheduler 改进

二、后台执行限制

​ 当应用进入已缓存状态时,如果没有活动的组件,系统将解除应用具有的所有唤醒锁。

此外,为提高设备性能,系统会限制未在前台运行的应用的某些行为。具体而言:

  • 现在,在后台运行的应用对后台服务的访问受到限制。
  • 应用无法使用其清单注册大部分隐式广播(即,并非专门针对此应用的广播)

三、后台位置限制

为降低耗电量,Android 8.0(API 级别 26)会对后台应用检索用户当前位置信息的频率进行限制。应用每小时仅接收几次位置信息更新

Android9.0(最严限制)

一、进一步优化省电模式

​ Android P 优化了现有的省电助手功能,在启用该功能后,系统将对所有应用的后台运行实施加以限制

二、应用待机组群

​ Android P 新增应用待机分组功能,让系统根据用户的使用情况而限制应用调用 CPU 或网络等设备资源。

三、后台限制

​ Android P新增后台限制功能,若应用出现 Android Vitals 内所描述的不良行为,系统将提醒用户限制该应用访问设备资源。

>> Android Vitals 链接:

https://developer.android.google.cn/topic/performance/vitals/index.html

特别需要注意的是:这些变化适用于所有应用 无视应用的Target API

从Android系统电量优化历程来看,Android5.0之前,系统对电量方面属于放飞自我的状态,对于后台应用也是毫无限制,所以市面上出现了很多的后台保活,拉起的黑科技。导致用户手机耗电量特别严重,用户手机耗电量不和应用使用时长成正比而是和应用安装个数成正比,用户应用安装的越多,耗电越严重。

从Android5.0开始Android系统逐步优化电量消耗,而且针对后台应用的限制也是逐步增大,直到Android P系统对电量方面做了最严限制,Android P之前开发者还可以修改Target Api 来减少系统对其限制,但是从Android P开始无视应用Target Api 只要安装在Android P版本就会收到限制,同时如果应用后台耗电过大,不符合规范,系统就会弹出 应用后台耗电严重提示,提醒用户限制该应用的访问权限。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值