电量优化

作者: 爱码士平头哥 | 来源:发表于2018-05-28 14:30 被阅读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

    相关文章

      网友评论

        本文标题:电量优化

        本文链接:https://www.haomeiwen.com/subject/pwtuhxtx.html