android性能之二:耗电问题

1、 电量问题

Android系统上App的电量消耗主要由cpu、wakelock、数据传输(流量和wifi)、wifi运行、gps、other senior组成,而耗电异常也是由于这几个模块的使用不当。

1.1 CPU时间片优化

当检测到CPU时间片消耗异常时,需要使用TraceView,获取进程执行信息,定位CPU占用率异常的问题。

1.2 网络传输

通常情况下,使用3G移动网络传输数据,电量的消耗有三种状态:

Full power: 能量最高的状态,移动网络连接被激活,允许设备以最大的传输速率进行操作。
Low power: 一种中间状态,对电量的消耗差不多是Full power状态下的50%。
Standby: 最低的状态,没有数据连接需要传输,电量消耗最少。

1.2.1 数据压缩

通过数据压缩等方式缩减传输时间,降低电量消耗,此章节可以参考《Android 性能优化(八)之网络优化》

1.2.2 选择更快的传输方式

虽然3G芯片比Wifi芯片耗电低,但Wifi的速率可以让数据在较短时间内完成传输,从而降低电量消耗。

1.2.3 请求集中发送

分析和统计之类的非重要操作,可以在合适状态(电量充足或Wifi状态)下发送。参见3.6节JobScheduler。

1.2.4 无网状态避免网络请求

之前在网络优化的文章里写过,网络请求失败之后的重试机制,但是要注意这个重试是在有网状态下的重试。否则无网状态下重试不会请求成功,只会消耗电量。尤其是与AlarmManager或者WakeLock连用的场景下,耗电量会更多。

1.3 GPS

定位是App中常用的功能,但是定位不能千篇一律,不同的场景以及不同类型的App对定位更加需要个性化的区分。

1.3.1 选择合适的Location Provider

Android系统支持多个Location Provider:

  • GPS_PROVIDER:
    GPS定位,利用GPS芯片通过卫星获得自己的位置信息。定位精准度高,一般在10米左右,耗电量大;但是在室内,GPS定位基本没用。

  • NETWORK_PROVIDER
    网络定位,利用手机基站和WIFI节点的地址来大致定位位置,这种定位方式取决于服务器,即取决于将基站或WIF节点信息翻译成位置信息的服务器的能力。

  • PASSIVE_PROVIDER:
    被动定位,就是用现成的,当其他应用使用定位更新了定位信息,系统会保存下来,该应用接收到消息后直接读取就可以了。比如如果系统中已经安装了百度地图,高德地图(室内可以实现精确定位),你只要使用它们定位过后,再使用这种方法在你的程序肯定是可以拿到比较精确的定位信息。

使用Criteria,设置合适的模式、功耗、海拔、速度等需求,系统会返回合适的Location Provider。

例如你的App只是需要一个粗略的定位那么就不需要使用GPS进行定位,既耗费电量,定位的耗时也久。

1.3.2 及时注销定位监听

在获取到定位之后或者程序处于后台时,注销定位监听,此时监听GPS传感器相当于执行no-op(无操作指令),用户不会有感知但是却耗电。

    public void onPause() {
        super.onPause();
        locationManager.removeListener(locationListener);
    }

    public void onResume(){
        super.onResume();
        locationManager.requestLocationUpdates(locationManager.getBestProvider(criteria, true),6000,100,locationListener);
    }
1.3.3 多模块使用定位尽量复用

多个模块使用定位,尽量复用上一次的结果,而不是都重新走定位的过程,节省电量损耗;例如:在应用启动的时候获取一次定位,保存结果,之后再用到定位的地方都直接去取。

1.4 谨慎使用WakeLock

Android为了节省电量,会在用户无操作一段时间之后进入休眠状态。Wake Lock是一种锁的机制,只要有人拿着这个锁,系统就无法进入休眠。一些App为了能在后台持续做事情,就会持有一个WakeLock,那么手机就不会进入休眠状态,App要做的事情能做了,但是也更加耗电。

  • App在前台不要申请WakeLock,此时无需申请,申请的话会计算到应用电量消耗;
  • App在后台由于业务需要必须要申请WakeLock时使用带有超时参数的方法,防止由于忘记或者异常情况下没有释放;
  • App申请使用WakeLock,任务结束之后及时释放,让系统再次进入休眠状态。
    PowerManager pm = (PowerManager)mContext.getSystemService(Context.POWER_SERVICE);
    PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK| PowerManager.ON_AFTER_RELEASE,TAG);
    wl.acquire(TIMEOUT);// 使用带有超时参数的acquire方法
    // ... do work...
    wl.release();
    备注:如果只是需要屏幕常亮的话,可以使用FLAG_KEEP_SCREEN_ON,无需考虑释放WakeLock的问题。
1.5 传感器使用
  • 使用传感器,选择合适的采样率,越高的采样率类型则越费电;

    • SENSOR_DELAY_NOMAL (200000微秒)

    • SENSOR_DELAY_UI (60000微秒)

    • SENSOR_DELAY_GAME (20000微秒)

    • SENSOR_DELAY_FASTEST (0微秒)

  • 在后台时注意及时注销传感器监听;

1.6 JobScheduler

使用JobScheduler,一些任务通过JobScheduler来触发,例如可推迟的网络请求、下载、GPS等,可以在特定场景:连接Wifi、连接电源等场景触发。既完成了任务,也无需考虑由于一些任务导致的电量消耗。


2 电量优化的一般步骤
  1. )使用batteryManager查看App的耗电情况;
  2. )使用Battery Historian进行分析;
  3. )按上面1中的方式进行优化



参考:https://juejin.im/post/58fef4771b69e60058aab2d1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值