功耗优化 · 入门篇 · 浅析Android耗电量优化(1)

简介: 功耗优化 · 入门篇 · 浅析Android耗电量优化

image.png

一. 发热案例分析

Android 框架层通过一个名为 batterystats 的系统服务,电池的信息电压温度充电状态等等,都是由BatteryService来提供的。


电池的这些信息是BatteryService通过广播主动把数据传送给所关心的应用程序。实现了电量统计的功能,batterystats实现原理可以查阅电量统计服务 Android 提供的 dumpsys 命令用于查看系统服务的信息(实现原理可以查阅 dumpsys 介绍)


batterystats作为参数,就能输出完整的电量统计信息。小编在日本最大的游戏直播平台之一项目组开发过一段时间发现直播页面发热问题一直饱受日本用户诟病,因此我准备出一篇技术文章详细介绍整个优化流程,经过功能测试发现: 如果在游戏直播中播放视频,手机很快就会发烫。针对这种现象,我马上拉取数据进行了分析,测试数据表明游戏直播耗电量竟然高达27%,经过调研,发现 Battery Historian 这个框架还挺合适线下优化的

二. 发热测试工具

2.1 开发环境

首先确保你的电脑已经安装,并配置好以下相关环境变量:

  1. Python 2.7 环境
  2. Docker 环境
  3. go 1.8.1 环境
  4. adb 环境

然后你还得准备一台 Android 5.0 以上手机,因为 Battery Historian 是在 Android 5.0 以上运行环境上跑的,最后 找一台适合高富帅的 Mac OS X 系统,实在没有就拿乞丐版 window 操作~

2.2 Battery Historian 使用指南

接下来我们来看一下 Battery Historian 具体使用:

2.2.1 使用 Docker 监听 battery-historian 9999 端口

image.png

2.2.2 配置 go 的环境

image.png

2.2.4 运行 Battery Historian

image.png

2.2.5 手机连上我们的 USB,先唤醒 Battery Historian 然后再清空电池历史状态

image.png

2.2.6 断开 USB ,打开测试应用,疯狂测试,20 分钟后将 bugreport_xxx 版本.zip 文件导出,通过命令将该文件上传到http://localhost:9999 即可

image.png

2.2.7 查看当前进程的关键信息
image.png

image.png

image.png

image.pngimage.png

image.png

image.png

image.png

图片可能不是很清楚,我这边再给大家总结一下核心参数信息

参数 参数说明
Sync 是否跟后台同步,可以把鼠标停在某一项上面。可以看到何时 sync 同步 启动的,持续时间 Duration 多久。电池容量不会显示单一行为消耗的具体电量,这里只能显示使用电池的频率和时长,你可以看分时段的剩余电量来了解具体消耗了多少电量。
wake_lock_in wake_lock 有不同的组件,这个地方记录在某一个时刻,有哪些部件开始工作,以及工作的时间。
wake_lock wake_lock 该属性是记录 wake_lock 模块的工作时间。是否有停止的时候等。Android 的休眠唤醒主要基于 wake_lock 机制,只要系统中存在任一有效的 wake_lock,系统就不能进入深度休眠,但可以进行设备的浅度休眠操作。wake_lock 一般在关闭 lcd、tp 但系统仍然需要正常运行的情况下使用,比如听歌、传输很大的文件等。
running 界面的状态,主要判断是否处于 idle 的状态。用来判断无操作状态下电量的消耗。
plugged 充电状态,这一栏显示是否进行了充电,以及充电的时间范围。例如上图反映了我们在第 22s 插入了数据线,然后一直持续了数据采集结束
screen 屏幕是否点亮,这一点可以考虑到睡眠状态和点亮状态下电量的使用信息。
top 该栏显示当前时刻哪个 app 处于最上层,就是当前手机运行的 app,用来判断某个 app 对手机电量的影响,这样也能判断出该 app 的耗电量信息。该栏记录了应用在某一个时刻启动,以及运行的时间,这对我们比对不同应用对性能的影响有很大的帮助。

三. 发热测试过程

我们首先找出一款被骂的最狠的一款测试手机 xx 三星 xx 版本,电池容量:3000mAh,游戏直播和秀场直播以及直播回放 WiFi 环境下,打开 App,播放同一个测试直播源资源分别测试 20 分钟。

测试场景是这样的

  • 通过 小木箱 的账号进入游戏开播竖屏页面,开启游戏直播
  • 通过 小木箱 的账号进入直播回放竖屏页面, 进行直播回放
  • 通过 小木箱 的账号进入秀场直播竖屏页面, 开启秀场直播

为了保证测试数据的准确性,要保证四点,第一点是,手机不要灭屏,因为屏幕唤醒本身就会有耗电开销,第二点是不要使用蜂窝网络,这样测试的数据不具备公正性,第三点把没有用到的传感器关掉,最后在测试过程不要充电,保持测试环境的一致性。

测试完毕后,在导航栏选中你的进程 ID

image.png

关注 App Status 两个核心指标

image.png

  • CPU User Time
  • Device estimated power use
  • 测试时长

关注这三个指标,从测试结果可以看到,你的对照组和样本组的测试结果了,由于测试数据比较核心,就不方便对外公布了

直播应用耗电量的问题: 无非就建立 socket 连接过程中.推送心跳包,会定时唤醒 CPU 这样可能会有耗电风险,然后如果自定义 View 设计不合理,进行高频刷新 UI,也会造成耗电,而且本公司产品 UI 布局设计很不合理,布局嵌套很严重,存在重复渲染问题。如果你们应用不合适的时间点播放礼物,什么送跑车,送游艇,脸萌这种效果都可能会存在耗电问题,耗电最难的一点就是要解决底层的 wake_lock 及时释放,因为 wake_lock 可以保证 CPU 进行休眠

四. 耗电优化建议

  • 省电这一块 主要是需要控制 wakelock 的使用。控制无谓的 CPU 运行和计算,项目有一些上传下载操作进行着,可采用高效下载策阅,做到批量网络请求。可以交给JobScheduler 来处理,JobScheduler 集中处理收到的任务,选择合适的时间合适的网络,再一起执行
  • 频繁定位类的 App 确实是耗电大户,可以在非必须的情况下,采用缓存数据,或者通过简化业务流程的情况下来进行优化
  • 避免在后台进行日志上报以及前台进行拉活工作
  • 如果面有一些任务的队列里面积累了大量的任务,每次都循环的执行任务太久,耗电会明显,然后如果项目存在大量轮询接口的时候,应该将其整合起来,减少CPU消耗
  • 对于网络请求或者 websocket 通信要对数据进行 gzip 压缩处理
  • 数据解析不要使用原生的 JSONObject ,应该使用 Gson jackson ptoBuffer 或者其他数据解析工具
  • 项目的直播或音频是电量消耗大户,可判断用户是否处于充电状态,在获取用户电量,在某个临界点时,降低直播码率,提高观看直播时间
  • 清单文件application标签下 keepScreeanOn 保持常量模式不够完善,导致用户长时间误操作情况下,屏幕长时间保持常亮。建议修改模式为: 用户5分钟未操作状态下,屏幕变暗且屏幕不关闭。满足屏幕处于开启状态下省电
  • 项目存在大量图片展示,图片加载时会消耗大量的流量与电量。可判断用户是否处于充电状态,在获取用户电量,在某个临界点,降低加载图片码率,提高操作时间








相关文章
|
16天前
|
存储 前端开发 测试技术
Android kotlin MVVM 架构简单示例入门
Android kotlin MVVM 架构简单示例入门
22 1
|
25天前
|
调度 Android开发 开发者
构建高效Android应用:探究Kotlin多线程优化策略
【10月更文挑战第11天】本文探讨了如何在Kotlin中实现高效的多线程方案,特别是在Android应用开发中。通过介绍Kotlin协程的基础知识、异步数据加载的实际案例,以及合理使用不同调度器的方法,帮助开发者提升应用性能和用户体验。
40 4
|
2月前
|
存储 缓存 编解码
Android经典面试题之图片Bitmap怎么做优化
本文介绍了图片相关的内存优化方法,包括分辨率适配、图片压缩与缓存。文中详细讲解了如何根据不同分辨率放置图片资源,避免图片拉伸变形;并通过示例代码展示了使用`BitmapFactory.Options`进行图片压缩的具体步骤。此外,还介绍了Glide等第三方库如何利用LRU算法实现高效图片缓存。
61 20
Android经典面试题之图片Bitmap怎么做优化
|
7天前
|
安全 Android开发 iOS开发
深入探索iOS与Android系统的差异性及优化策略
在当今数字化时代,移动操作系统的竞争尤为激烈,其中iOS和Android作为市场上的两大巨头,各自拥有庞大的用户基础和独特的技术特点。本文旨在通过对比分析iOS与Android的核心差异,探讨各自的优势与局限,并提出针对性的优化策略,以期为用户提供更优质的使用体验和为开发者提供有价值的参考。
|
12天前
|
XML IDE Java
安卓应用开发入门:从零开始的旅程
【10月更文挑战第23天】本文将带领读者开启一段安卓应用开发的奇妙之旅。我们将从最基础的概念讲起,逐步深入到开发实践,最后通过一个简易的代码示例,展示如何将理论知识转化为实际的应用。无论你是编程新手,还是希望扩展技能的软件工程师,这篇文章都将为你提供有价值的指导和启发。
23 0
|
1月前
|
开发框架 移动开发 Android开发
安卓与iOS开发中的跨平台解决方案:Flutter入门
【9月更文挑战第30天】在移动应用开发的广阔舞台上,安卓和iOS两大操作系统各自占据半壁江山。开发者们常常面临着选择:是专注于单一平台深耕细作,还是寻找一种能够横跨两大系统的开发方案?Flutter,作为一种新兴的跨平台UI工具包,正以其现代、响应式的特点赢得开发者的青睐。本文将带你一探究竟,从Flutter的基础概念到实战应用,深入浅出地介绍这一技术的魅力所在。
73 7
|
2月前
|
Android开发 开发者
安卓开发中的自定义视图:从入门到精通
【9月更文挑战第19天】在安卓开发的广阔天地中,自定义视图是一块充满魔力的土地。它不仅仅是代码的堆砌,更是艺术与科技的完美结合。通过掌握自定义视图,开发者能够打破常规,创造出独一无二的用户界面。本文将带你走进自定义视图的世界,从基础概念到实战应用,一步步展示如何用代码绘出心中的蓝图。无论你是初学者还是有经验的开发者,这篇文章都将为你打开一扇通往创意和效率的大门。让我们一起探索自定义视图的秘密,将你的应用打造成一件艺术品吧!
58 10
|
29天前
|
Web App开发 编解码 视频直播
视频直播技术干货(十二):从入门到放弃,快速学习Android端直播技术
本文详细介绍了Android端直播技术的全貌,涵盖了从实时音视频采集、编码、传输到解码与播放的各个环节。文章还探讨了直播中音视频同步、编解码器选择、传输协议以及直播延迟优化等关键问题。希望本文能为你提供有关Andriod端直播技术的深入理解和实践指导。
39 0
|
2月前
|
IDE Java 程序员
安卓应用开发入门:打造你的第一个“Hello World”
【9月更文挑战第11天】在编程的世界里,每一个初学者的旅程都从一个简单的“Hello World”开始。本文将带领安卓开发的新手们,通过简单直观的方式,一步步构建出自己的第一个安卓应用。我们将探索安卓工作室(Android Studio)的安装、项目的创建,以及如何运行和调试你的应用。无论你是编程新手还是想扩展技能的老手,这篇文章都将为你打开一扇通往安卓世界的大门。
163 7
|
2月前
|
Java Android开发 UED
安卓应用开发中的内存管理优化技巧
在安卓开发的广阔天地里,内存管理是一块让开发者既爱又恨的领域。它如同一位严苛的考官,时刻考验着开发者的智慧与耐心。然而,只要我们掌握了正确的优化技巧,就能够驯服这位考官,让我们的应用在性能和用户体验上更上一层楼。本文将带你走进内存管理的迷宫,用通俗易懂的语言解读那些看似复杂的优化策略,让你的开发之路更加顺畅。
55 2
下一篇
无影云桌面