美文网首页
Android 电量优化小结

Android 电量优化小结

作者: 吃茶泡饭丶 | 来源:发表于2018-09-05 00:08 被阅读0次

    使用电量分析工具

    Google提供的开源的电池分析工具
    Battery Historian.

    按照README,安装即可。

    Battery Historian 需要配置GO语言环境。
    Battery Historian 是网页版,一些JS的引用要翻墙。

    Android 5.0以上设备 ,通过adb命令导出dump电量使用历史信息。
    步骤:

       adb kill-server
       adb start-server
       // 打开电池数据获取
       adb shell dumpsys batterystats --enable full-wake-history
       // 电池数据重置
       adb shell dumpsys batterystats --reset
       // 生成电量数据到文件,此命令会持续记录输出,停止记录Ctrl+C
       adb bugreport > bugreport.txt
    

    上传文件分析
    执行命令:

    go run cmd/battery-historian/battery-historian.go
    

    打开浏览器:http://localhost:9999/
    上传 bugreport.txt

    优化策略

    通过统计信息可以看出耗电主要发生在屏幕、网络相关、GPS定位。

    1.网络请求

    首先App会有大量的网络请求是不可避免的,手机内置的radio(射频模块)无时不刻处在活跃状态,应用大量耗电情况对于一直连着USB测试的开发者,感官上并没有多大的体会,但对于用户来说电量损耗也是体验的一方面。

    对网络请求优化之后说,现在说说请求之外要做的一些事情

    1.1.合理合并请求,减少请求次数

    减少网络获取的频次就减少了Radio活跃时间,从而减少radio的电量消耗。

    对App与Server之间的API要注意请求频次和资源状态,尽量让App用较少的请求完成业务,在实际开发中接口的单一职责并不十分适合客户端的需求。

    1.2.非重要操作集中发送请求

    分析,统计,更新下载之类的非重要操作,可以再在充电或Wifi状态下请求

    //监听电池充电,持续广播无需receiver
    IntentFilter filter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
    Intent batteryStatus = this.registerReceiver(null, filter);
    
    
    //几种充电方式:
    int chargePlug = batteryStatus.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
    //USB充电
    boolean usbCharge = (chargePlug == BatteryManager.BATTERY_PLUGGED_USB);
    //直流充电
    boolean acCharge = (chargePlug == BatteryManager.BATTERY_PLUGGED_AC);
    //无线充电
    boolean wirelessCharge = false;
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
                wirelessCharge = (chargePlug == BatteryManager.BATTERY_PLUGGED_WIRELESS);
    }
    

    监听充电状态变化

    <receiver android:name=".XXXXXXXReceiver">
      <intent-filter>
        <action android:name="android.intent.action.ACTION_POWER_CONNECTED"/>
        <action android:name="android.intent.action.ACTION_POWER_DISCONNECTED"/>
      </intent-filter>
    </receiver>
    

    有个东西叫JobScheduler,Android P对它作出了更好地优化。

    1.3.设置超时时间,减少网络消耗

    现在的网络框架都具备的功能

    1.4.避免无网状态下的网络请求

    网络请求失败之后的重试机制,在无网状态下重试只会消耗电量。

    2.及时释放WakeLock

    有些时候我们需要CPU保持“清醒”状态来确保一些代码的运行,及时release()释放锁,让CPU进入休眠状态来节省电量。

    可以给WakeLock设置超时时间,避免出现异常没有及时释放锁。

    3.GPS定位
    3.1.不同类型的应用场景区分使用不同的定位方式
    • GPS定位:精度高 耗电大;室内基本没用。
    • 网络定位:通过移动通信的基站信号差异来计算出手机所在的 位置,精度比GPS差,通常误差在几百米内
    • 被动定位:当其他应用使用定位更新了定位信息,系统会保存下来,该应用接收到消息后直接读取就可以了
    3.2.及时注销定位监听

    获取定位后及时注销监听定位,避免监听执行no-op(无操作指令),虽然不被用户感知但却在耗电。

    locationManager.removeUpdates(locationListener);
    
    3.3.定位信息复用,节省电量消耗

    4.其他

    4.1.减少布局层次

    减少布局层次避免过度绘制

    界面是有一定刷新频率的,每一次刷新都会调用View的onDrow()方法,图形运算会对CPU的耗电量有很大的影响。

    UI性能优化

    相关文章

      网友评论

          本文标题:Android 电量优化小结

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