引言

  • App优化(一)App启动速度优化
  • App优化(二)布局优化
  • App优化(三)ANR优化
  • App优化(四)内存优化
  • App优化(五)电量优化
  • App优化(六)网络优化

电量使用优化, 基本上是我们最不怎么关注的一项优化. 可能很多公司连QA/Tester也不会关注测试App电量的使用. 一般来说开发和测试的测试设备也一直是连着USB处于充电状态的, 感官上也体会不到电量的损耗.

然而, 对于用户来说, 实际上App的电量损耗也是用户体验的一个方面. 特别是当今人们对移动设备的依赖度越来越高, 电量也是用户特别关注的.

今天我们就来聊聊Android App的电量优化.

1, 分析电量的使用情况

1.1 Batterystats & bugreport

Android 5.0及以上的设备, 允许我们通过adb命令dump出电量使用统计信息.

1, 因为电量统计数据是持续的, 会非常大, 统计我们的待测试App之前先reset下, 连上设备, 命令行执行:

$ adb shell dumpsys batterystats --reset
Battery stats reset.

2, 断开测试设备, 操作我们的待测试App.
3, 重新连接设备, 使用adb命令导出相关统计数据:

// 此命令持续记录输出, 想要停止记录时按Ctrl+C退出.
$ adb bugreport > bugreport.txt

导出的统计数据存储到bugreport.txt, 此时我们可以借助如下工具来图形化展示电池的消耗情况.

注意, 官方SDK文档导出文件方式为:
adb shell dumpsys batterystats > batterystats.txt
使用python historian.py batterystats.txt > batterystats.html查看数据
是battery-historian老版本的使用方式. 目前Battery Historian已更新2.0版本, 推荐使用bugreport方式导出数据分析, 可以看到更多信息.

1.2 Battery Historian

Google提供了一个开源的电池历史数据分析工具 – Battery Historian.

1.2.1 安装

按照Battery Historian在github上的readme, 一步步安装即可.

需要注意的是, Battery Historian是Go语言的, 安装Go的时候需要配置其bin的环境变量.
Python环境需要是2.7的(3.x不行), 建议使用pyenv管理本地的python环境.
另外, 因为Battery Historian是一个网页版工具, 涉及一些JS引用, 有时需要翻墙.

安装完成后, 执行:

cd $GOPATH/src/github.com/google/battery-historian
go run cmd/battery-historian/battery-historian.go [--port <default:9999>]

程序运行在http://localhost:9999, 如下:

1.2.2 界面

导入我们在第一步通过adb bugreport生成的bugreport.txt文件:

2, 主要的耗电因素


从手机的电池详情统计可以简单看出, 手机中最耗电的模块肯定是屏幕了, 接着就是网络相关, 另外可能的耗电大户还有GPS芯片, Camera等.

对于一个App, 对应因素主要有:

2.1 网络请求

我们可能会有发现:

  • 测试用的手机充满电放了一个十一假期还有电, 是因为测试手机没有上SIM卡.
  • 飞行模式下的手机灭屏下, 可能可以放一个月都还有电.

这是因为:

  • 手机的通过内置的射频模块和基站几乎, 从而链接上网的, 而这个射频模块(radio)是非常耗电的.
  • 为了控制这个射频模块的耗电, 硬件驱动及Android RIL层做了很多处理. 例如可以单独关闭radio(飞行模式),
    间歇性假休眠radio(有数据发生时才上电, 保持一个频率的与基站交互)等等.

现如今App都是移动互联网App, 不可避免的会有大量的网络请求, 会导致radio一直处于活跃状态, 从而耗电量增加.

2.2 WakeLock

Android系统本身为了优化电量的使用, 会在没有操作时进入休眠状态, 来节省电量. 当然, 为了便于开发(很多应用不可避免的希望在灭屏后还能运行一些事儿, 或是要保持屏幕一直亮着–比如播放视频), Android提供了一个PowerManager.WakeLock的东西.

我们可以用WakeLock来保持CPU运行, 或是防止屏幕变暗/关闭, 让手机可以在用户不操作时依然可以做一些事儿. 然而, 获取WakeLock很容易, 释放不好就会成为难题, 消耗电量.

例如我们获取了一个WakeLock来保持CPU运转, 做一个复杂运算并将数据上传到后台服务器, 然后释放该WakeLock. 然而这个过程可能并不像我们想象的那么快, 可能因为比如服务器挂掉, 计算出了异常等等WakeLock没有释放. 问题就来了, CPU会一直得不到休眠, 而大大增加耗电.

另外, WakeLock还有android:keepScreenOn属性, 还可以让屏幕常量, 这可是耗电大户.

2.3 GPS

应用中经常会用到定位服务, Android提供了Network定位和GPS定位. 相对来说, GPS会精确得多, 对于一些诸如跑步, 导航类的应用基本会使用GPS定位. 然而, GPS定位也会消耗大量的电量.

3, 尽可能减少App的电量消耗的建议

了解了上述的主要的耗电因素, 还有一些程序的耗电问题, 我们通过Battery Historian也可以分析.

针对这些耗电情况, 给出如下优化建议:

3.1 优化网络请求

这个会在网络优化那篇中细聊, 在此略过.

3.2 谨慎使用WakeLock

1,WakeLock获取释放成对出现.
2,使用超时WakeLock, 以防出异常导致没有释放.

// Acquires the wake lock with a timeout.
acquire(long timeout)

3.3 监听手机充电状态

BatteryManager会发送一个包含充电状态的持续广播, 我们可以通过此广播获取充电状态和电量详情:

IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
Intent batteryStatus = context.registerReceiver(null, ifilter);

注意: 因为这是一个持续广播, 我们无需写receiver, 可以直接通过intent获取相关数据.

例如, 如果设备正在充电:

// Are we charging / charged?
int status = batteryStatus.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING ||status == BatteryManager.BATTERY_STATUS_FULL;// How are we charging?
int chargePlug = battery.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
boolean usbCharge = chargePlug == BATTERY_PLUGGED_USB;
boolean acCharge = chargePlug == BATTERY_PLUGGED_AC;

另外我们也可以监听充电状态的变化, 只要设备连接或断开电源, BatteryManager就会广播相应的操作, 我们可以注册receiver来监听:

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

监听电池状态, 可以让我们将一些操作放在充电或是电量足够的情况下进行, 以提升用户体验. 例如用户数据同步, Log上传等.

3.4 Doze and App Standby

Android 6.0提供了两个用来节省电量的技术Doze和App Standby.

  • Doze 瞌睡. 如果设备闲置了一段较长时间, Doze技术将通过延迟后台网络活动, CPU运行等来减少电量损耗.
  • App Standy 应用待机. 不是最近得到过用户"宠幸"的App, App Standy将延缓这个应用的后台网络活动.

因为所有Android 6.0及以上的设备上, Doze and App Standby都会运行. 可能会影响你的App的运行, 具体的适配请参考官方文档.

3.5 关于定位

  • 定位中使用GPS, 请记得及时关闭
// Remove the listener you previously added
locationManager.removeUpdates(locationListener);
  • 减少更新频率
  • 根据实际情况选择GPS或网络或两者. 只使用一个会降低电量损耗.

App优化(五)电量优化相关推荐

  1. Android App优化:内存优化、电量优化、网络优化等 (2)

    -- 优化专题: 整理一系列的专题:比如APK瘦身.插件化.程序架构.性能优化.自定义view.增量升级.移动开发各种技术解决方案等.   Android后期发展的五大趋势:一.性能优化:二.高级UI ...

  2. 【Android 电量优化】电量优化 ( Battery Historian 环境要求 | 电量分析报告 | 电量优化三原则 | 电量优化注意事项 )

    文章目录 一.Battery Historian 环境要求 二.上传电量报告 三.Battery Historian 电量分析报告 四.电量优化三原则 五.电量优化注意事项 参考 Google 官方文 ...

  3. Android 进阶——性能优化之电量优化全攻略及实战小结(二)

    文章大纲 引言 一.在低电耗模式和应用待机模式下进行测试 1.在低电耗模式下测试您的应用 2.在应用待机模式下测试您的应用 3.列入白名单的可接受用例 4.确定当前充电状态 5.监控充电状态变化 6. ...

  4. 【Android 电量优化】电量优化 ( 使用 AlarmManager 保持 CPU 唤醒 )

    文章目录 一.AlarmManager 简介 二.使用 AlarmManager 保持 CPU 唤醒流程 ( 省电操作 ) 三.使用 WeakLock 保持 CPU 唤醒 代码示例 1.Service ...

  5. 【Android 电量优化】电量优化 ( 获取电量分析报告 | 阿里云服务器搭建 Battery Historian | 上传并生成分析报告 )

    文章目录 一.Battery Historian 搭建环境 二.获取 Android 手机电量报告 1.重置电量状态 2.开启获取 WeakLock 信息 3.获取手机电量报告 三.阿里云服务器搭建 ...

  6. 【Android 电量优化】电量优化特性 ( Doze 低电耗模式 | Standby 应用待机模式 | 白名单设置 | 白名单添加系统设置界面 | 指定应用的白名单添加界面 | 测试应用 )

    文章目录 一.Doze 低耗电模式简介 二.Standby 应用待机模式简介 三.Doze 和 Standby 模式测试 四.白名单添加 ( 方式一 ) 五.白名单添加 ( 方式二 ) Android ...

  7. 性能优化之电量优化2-使用Battery Historian生成电量消耗报告

    1 数据准备 1.1 先断开adb服务,然后开启adb服务 (a)adb kill-server 这一步很重要,因为当我们开发时做电量记录时会打开很多可能造成冲突的东西.为了保险起见我们重启adb.a ...

  8. 【Android 电量优化】电量优化 ( 耗电量测试 | Battery Historian 简介 | apt 源更新 | Docker 安装 | Battery Historian 安装 )

    文章目录 一.耗电量测试 二.Battery Historian 简介 三.Docker 简介 四.更新 apt 源 五.安装 Docker 六.安装 Battery Historian 七.访问电量 ...

  9. android的电池优化,Android 电量优化

    为什么优化 现在智能手机基本能一天一充,如果一个应用耗电过多,肯定是有问题的,而开发中电量的优化可能是最容易被忽略的. 如何检测 1.手机设置-电池使用情况,查看电量消耗: 2.使用 Battery ...

  10. 【Android 电量优化】电量优化 ( JobScheduler | JobService | AsyncTask )

    文章目录 一.JobScheduler 使用流程 二.AsyncTask 简介 三.JobScheduler 开发流程 四.JobScheduler 代码示例 1.JobScheduleManager ...

最新文章

  1. python【蓝桥杯vip练习题库】ALGO-91 Anagrams问题
  2. Smartforms 在sap系统设置纸张打印格式
  3. Java----代码优化篇
  4. [书籍推荐]《软件设计精要与模式(第2版)》-张逸——提高设计模式及软件设计的方法...
  5. 蚂蚁集团技术专家山丘:性能优化的常见模式及趋势
  6. SpringBoot 2 快速整合 | Hibernate Validator 数据校验
  7. Java截取视频文件缩略图
  8. Linux stat
  9. 库卡机器人示教器截屏_KUKA库卡机器人示教器维修
  10. freessl 免费https证书申请
  11. 【简历优化】如何写好项目的亮点难点?项目经历怎么写最好?
  12. 未明学院:大学四年应当如何度过,才算不辜负?
  13. 计算机处理器怎么看 64,怎么查看电脑处理器是32还是64位
  14. u盘克隆服务器系统,只需4步!简单又快速的克隆U盘
  15. 通过百世单号自动识别快递公司,并查询大量物流情况
  16. 小程序开发平台有哪些?第三方小程序电商开发平台一览
  17. InstallShield自定义对话框浅谈(转)
  18. ECharts之阶梯瀑布柱状图
  19. linux设置环境变量设置环境变量
  20. JAVA 接口 验证哥特巴赫猜想

热门文章

  1. 北京大学未来技术学院正式揭牌,布局南京……
  2. [转载]Tomcat+Mysql入门实例 滚动横幅广告
  3. ffbe攻略站_精英队长《FFBE》游戏攻略有偿征集令
  4. 手机上的三件事别乱去做,一不留神就会中毒,现在了解还来得及
  5. 计量经济学 李子奈 第四版 pdf
  6. 责任链模式——P2P理财
  7. #普中51开发板# 52单片机数码管显示5201314
  8. 关于windows无法启动VMware USB Arbitration Service 服务的问题解决
  9. 日常作业2018.12.29
  10. 百度糯米app中关闭网页或窗口的方法,99%的人都不知道,网上也找不到