说明
本篇将介绍省电管理篇,主要介绍一下Android的耗电情况和目前市面上《电池助手》类应用涉及到的一些技术点。本篇将对这些知识点做一下总结和分析。主要包括:
A. 电池信息(耗电排行)
B. 省电管理
C. 剩余可用时间估算等
耗电分析
手机耗电分析
以我的手机(小米2S)为例,首先来看一下我的手机的电池使用情况,如下图(在设置->电量中查看):
电池充电方式
接下来结合上面的第一幅图定义一下几个名词:
n 快速充电:(0% ~ 80% )这个阶段中,电池能够快速的充到总电量的80%,但仍需要进行连续式充电才能完成充满。(电流较强,速度较快)
n 连续充电:( 80%~100%)在电池即将充满的状态下,充电电流会逐渐减小,确保电池完成充满。(电流减弱,放缓慢充)
n 涓流充电:(100%~100%)电池充满后进行微小的脉冲电流充电,能让电子保持流动,延长电池使用寿命,但不至于过充。(活跃电子,寿命更长)
下面是一张手机电池充电过程的示意图:
关于涓流充电
“快速充电”和”连续充电“都比较容易理解,这里简单说一下”涓流充电”。那为什么要进行”涓流充电”呢实主要是基于如下两个方面的考虑:
A. 在电池充电过程中发生的一些效率上的损失,用来弥补电池在充满电后由于自放电而造成的容量损失。
B. 电池充满后进行小电流充电,能让电子保持流动,延长电池使用寿命。
涓流充电过程一般占充电过程20%左右的时间,百度百科上说这个阶段通常需要30-40分钟。
本小节的一些参考:
http://wenku.baidu.com/view/44709e1da76e58fafab0038e.html
http://wenku.baidu.com/view/c0882e15a2161479171128b8.html
http://baike.baidu.com/view/206627.htm
http://baike.baidu.com/view/10022.htm
省电管理
可以从那些点来做
结合第一节中队耗电情况的分析,我们在省电管理方面有那些工作可以做呢/p>
n 从硬件层面:
A. 屏幕:屏幕亮度、屏幕超时
B. CPU:CPU频率、休眠模式
C. 基带:Wifi、蓝牙、3G 络、同步、GPS
n 从软件层面:
A. 后台进程限制(可参考系统”设置->开发者选项->后台进程限制”)
B. 设定不保留活动(用户离开后即销毁每个活动,参见”设置->开发者选项->设定不保留活动”)
C. 通过禁止开机自启动、后台自启动杀死后台常驻进程和清理内存。
D. 通过进程清理杀死后台进程并清理内存(锁屏清理、定时清理)
E. 对长连接采用对齐唤醒策略(绿色守护和小米V5)
F. 限制唤醒锁。
n 其他:
A. 关闭震动
B. 关闭触感(触摸时震动、触摸提示音)
C. 适当调节系统音量
D. 系统动画
下面是电池助手中实现的功能:
I/O调节模式
(什么是I/O调节模式/o即input/output的缩写,关于数据的读写操作,不同进程请求数据的优先顺序等等。io调度模式比较复杂,这里仅介绍常用的几个模式,部分参考xda、androidforums、wik1pedia、linuxarchive资料)
? noop
这个调度模式会把所有的数据请求直接合并到一个简单的队列里。不适合有机械结构的存储器,因为没有优化顺序,会增加额外的寻道时间。属于最简单的一个调度模式,无视io操作优先级和复杂性,执行完一个再执行一个,如果读写操作繁多的话,就会造成效率降低。
? anticipatory
其实这个有点类似于pc硬盘的NCQ功能,执行有预测性的调度,看起来似乎可以提高效率,不过因为它的预测机制会在进程将要结束一个读写操作时时开始准备下一个的预处理,所以会打乱系统正常的连续io调度,降低随机存取效率。用的人很少,不推荐。
? deadline
顾名思义,用过期时间来排序io操作顺序,保证先出现的io请求有最短的延迟时间,相对于写操作,给读操作更优先的级别。是比较好的一个调度模式。
? cfq
完全公平队列,是anticipatory模式的替代品,没有过多的做预测性调度,而是根据给定的进程io优先级,直接来分配操作的顺序。这个模式在linux上表现良好,但也许并不是最适合android的io调度模式,太强调均衡,而降低了连续读写数据的性能。
? vr
具有和deadline相似的操作排序机制,有着最高的峰值读写速度,但是性能比较不稳定,也就是说可能跑出最高的分数,但是也会出现最低值。
? sio
虽然基于deadline,但是它和noop一样,不会对io操作进行排序,所以有着noop那样快速的存取速度,但并没有过多优化io操作。如果不喜欢noop完全不参与调度,也可以选择这个。
关于I/O Scheduler的设置可以参见下图:
/sys/block/{DEVICE-NAME}/queue/scheduler
获取耗电排行信息
在Android系统设置中有应用和子系统耗电排行的统计,可以作为我们在实现电池助手软件时的参考,相关代码可以参考目录:@/package/app/Settings/src/com/android/settings/fuelguage/。
电池相关统计信息是由类BatteryStatsImpl服务实现的,获取BatteryStatsImpl的方式如下:
在电池管理软件中队电池续航时间的估算,往往分为两种:
A. 总体续航(在正常使用时的续航时间)
B. 特定情境续航(比如可以看视频多长时间、3G通话多长时间、上 多长时间)
无论哪种方式我们在估算续航时间时所需要的数据都是一样的,即:电池电量和电流消耗情况。Android中对于电流的消耗情况是在文件@/frameworks/base/core/res/res/xml/power_profile.xml中定义的,下面是一个截图片段:
@/frameworks/base/core/res/res/xml/power_profile.xml

这些信息可以通过@/frameworks/base/core/java/com/android/internel/os/PowerProfile.java来获取。
好了,有关省电的相关内容就先介绍这些了,欢迎交流讨论。
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!