Android 电量优化

                                                                              电量消耗的全过程分析

  设备忙着执行各种任务和各种复杂计算,秀自拍上传朋友圈图片、秀直播,设备硬件正在快速消耗电池电量来完成这些任务。很明显,你的任务处理的越复杂,电量就会消耗的越多和越快,一眨眼的功夫电量就消耗完了,用户的手机顿时变成个累赘的砖头了,这时候用户就会怀疑谁(哪个app)这么耗电,把它卸了!

 

1.在电子编程世界,这种硬件消耗电量来执行任务的过程,叫做超时电流消耗,

2.任何电子编程专业的人都会告诉你,你的设备的各项活动在相同时间内,消耗的电量是不同的。

比如,很多手机号称待机好几天,这个确实是真的,不过就是使用飞行模式放在家里什么都不干,确实可以甚至可以坚持10多天。

但是我们一旦使用它,比如使用蜂窝式无线数据交换(3G4G)、屏幕保持唤醒状态等。

作为开发者,我们很想知道我的应用执行的哪些任务消耗的电量是最多的?这个问题确实会很棘手。

电量消耗的计算与统计是一件麻烦而且矛盾的事情,记录电量消耗本身也是一个费电量的事情(所以很多设备都把这个监测电量的功能阉割掉了。)。

唯一可行的方案是使用第三方监测电量的设备,这样才能够获取到真实的电量消耗(因为第三方硬件监测的时候是用的自己的供电而不是用的手机的电量)。

耗电情况,例如:打开屏幕,所有要使用CPU/GPU工作的动作都会唤醒屏幕,都会消耗电量。这和应用程序唤醒设备还不一样。

比如使用叫醒闹钟(wake clock)、AlarmManager、JobSchedulerAPI

我们在开发app需要怎样做才能优化电量呢?

1.为了省电,有些工作可以放当手机插上电源的时候去做。往往这样的情况非常多。
像这些不需要及时地和用户交互的操作可以放到后面处理。
比如:360手机助手,当充上电的时候,才会自动清理手机垃圾,自动备份上传图片、联系人等到云端。

提问:拍照和图片的处理,他们可以做一些电量的优化吗?
假如现在没有充电,电量比较低,拍照动作是需要立马执行的,
但是图片处理(需要消耗大量的计算---电量的大量消耗)是否可以放在用户手机插上电源之后来处理?

如何立即获取手机当前充电状态,我们可以有针对性地对一些代码做优化。

2.wake_lock
系统为了节省电量,CPU在没有任务忙的时候就会自动进入休眠。
有任务需要唤醒CPU高效执行的时候,就会给CPU加wake_lock锁。

大家经常犯的错误,我们很容易去唤醒CPU来干货,但是很容易忘记释放wake_lock.

PS: 关于wake_lock:

          wake_lock锁主要是相对系统的休眠而言的,意思就是我的程序给CPU加了这个锁那系统就不会休眠了,这样做的目的是为了全力配合我们程序的运行。有的情况如果不这么做就会出现一些问题,比如微信等及时通讯的心跳包会在熄屏不久后停止网络访问等问题。所以微信里面是有大量使用到了wake_lock锁。

wake_lock应该是大家开发时经常用的手段吧,

解决:powerManager的API
记得添加权限:

   
   

  
  mWakelock.acquire();//唤醒CPU
  mWakelock.release();//记得释放CPU锁

//判断网络连接
   private boolean isNetWorkConnected() {
        ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
        return (activeNetworkInfo!=null&&activeNetworkInfo.isConnected());
    }

有一些意外的情况,比如小米手机是做了同步心跳包(心跳对齐)(如果超过了这个同步的频率就会被屏蔽掉或者降频),所有的app后台唤醒频率不能太高,比如每隔2S中去请求。

AlarmManager.setRepeating();

//---------------
如何去改进,对任务调度的优化。
//--------------
网络优化---也解决电量问题。

    public void setRepeating(int type, long triggerAtMillis,
            long intervalMillis, PendingIntent operation) {
        setImpl(type, triggerAtMillis, legacyExactLength(), intervalMillis, 0, operation,
                null, null, null, null, null);
    }

    public void setExact(int type, long triggerAtMillis, PendingIntent operation) {
        setImpl(type, triggerAtMillis, WINDOW_EXACT, 0, 0, operation, null, null, null,
                null, null);
    }

原因:
WINDOW_HEURISTIC:探试的,探索的;(意思:有范围浮动的,时间不确定的)
    private long legacyExactLength() {
        return (mAlwaysExact ? WINDOW_EXACT : WINDOW_HEURISTIC);
    }


锁屏和点亮屏幕的广播。监听。

如果电量采集不到,可能要进入手机的工程模式,打开电量日志采集。
优化四:大量高频次的CPU唤醒及操作,我们最好把这些操作集中处理。
我们可以采取一些算法来解决。
可以借鉴谷歌的精髓,JobScheduler/GCM

最后补充下,采集电量信息的工具:battery-historian

 

 

 

 

 

 

你可能感兴趣的:(Android 电量优化)