我爱编程

电量优化

2018-05-28  本文已影响19人  爱码士平头哥

1、在android framework里面有专门负责电量统计的Service:BatteryStatsSerive

①这个Service在ActivityManagerService中创建,代码如下:

mBatteryStatsService = new BatteryStatsService(new File(systemDir, 'batterystats.bin').toString());

②其他的模块比如WakeLock和PowerManagerService会向BatteryStatsService传递数据,数据是存放到系统目录batterystats.bin文件,然后交于BatteryStatsImpl这个数据分析器来进行电量数据的分析,系统的设置就是这样得到电量的统计信息的;

③电量的计算公式:

应用运行总时间 =  应用在Linux内核态运行时间 +  应用在Linux用户态运行时间

CPU工作总时间 = 软件运行期间CPU每个频率下工作的时间之和比例

应用消耗的电量 = CPU每个频率等级下工作的时间比例/CPU工作总时间 * 应用运行总时间

2、手机耗电主要原因

在09年GoogleIO大会JeffreySharkey的演讲(Coding for Life — Battery Life,That Is)中就探讨了这个问题,指出android应用的耗电主要在以下三个方面:

大数据量的传输

不停的在网络间切换

解析大量的文本数据;

3、并提出了相关的★优化建议★

①在需要网络连接的程序中,首先检查网络连接是否正常,如果没有网络连接,那么就不需要执行相应的程序;

②判断网络类型,针对特定的数据在特定的网络下请求.例如:大量数据传输的时候在wifi下请求;wifi下下载数据耗电量只有2、3、4G的1/3.

③使用效率高的数据格式和解析方法,推荐使用JSON和Protobuf;

④在进行大数据量下载时,尽量使用GZIP方式下载;

⑤使用推送,代替循环请求

⑥其它:

尽量不要使用浮点运算

回收java对象,特别是较大的java对像,使用reset方法;

主动回收java对象,特别是较大的,例如bitmap。减少GC的工作频率;

避免内存抖动,内存抖动是因为大量的对象被创建又在短时间内马上被释放;

避免在for循环、onDraw方法中创建对象;无法避免的可以创建对象池,然后在不使用的时候释放;

对定位要求不是太高的话尽量不要使用GPS定位,可以使用wifi和移动网络cell定位即可;

获取屏幕尺寸等信息可以使用缓存技术,不需要进行多次请求;

使用AlarmManager来定时启动服务替代使用sleep方式的定时任务;

使用JobScheduler合理分配任务

①JobScheduler 即 任务调度器

②需要先有一个JobService

上一篇下一篇

猜你喜欢

热点阅读