android 耗电分析与性能优化-程序员宅基地

技术标签: python  shell  移动开发  

1.官方的建议
1.1 电池续航时间优化(Optimizing Battery Life)
参考文章:优化电池使用时间
已有中文的详细说明,此处做简要说明:
(1)监控电池电量和充电状态(Monitoring the Battery Level and Charging State)
通过系统广播,获取充电状态和电池电量的变化来调整数据更新等操作;如在充电时,更新数据及应用,在低电量时,减少更新频率或停止gen
(2)确定和监控基座对接状态和类型(Determining and Monitoring the Docking State and Type)
和监控充电状态类似,通过系统广播,获取充电基座类型(车载基座、桌面基座),改变应用更新频率和方式
(3)确定和监控网络连接状态(Determining and Monitoring the Connectivity Status)
也和监控充电状态类似,根据当前连接网络的类型采取不同的策略。一般情况WiFi耗电要比移动数据流量低很多。监听CONNECTIVITY_CHANGE,可以在网络状态变化时调整策略
(4)根据需要操作广播接收器(Manipulating Broadcast Receivers On Demand)
主要说明可通过PackageManager的setComponentEnabledSetting方法来改变组件的启用与禁用。需要注意的是,此方法会导致应用的通知栏变化,不过系统会发送Intent.ACTION_PACKAGE_CHANGED广播,而且要留心这种变化的持续性,避免误认为广播接收器偶尔不正常。


1.2 数据传输中减少耗电
参考文章: Transferring Data Without Draining the Battery
此系列文章主要介绍与数据传输相关方面,减少电量消耗。首先,以3G数据网络状态机为例,说明无线射频在standby 、low power 、full power三种状态下的切换,一般减少频繁的网络连接,而延长在full power模式,获取更多数据,如采取预获取、合并获取数据等;另一方面,减少不必要的重连接和获取无用的数据;最后还是要区分在不同的网络类型下,采用不同的策略,考虑GPRS等网络实际的速度带宽等


1.3 针对 Doze和App Standby的优化
文章链接:Optimizing for Doze and App Standby
在Android6.0上引入了Doze和应用的Standby。在Doze模式下,应用的网络连接,CPU的使用都被严格控制,甚至唤醒锁(wake lock)和普通的Alarm也被忽略,但是会周期性地退出,使应用可以完成被推迟的工作

为了适配此种模式,一方面考虑其被延迟执行的影响(如心跳等),以及在后台,程序是否有必要执行某些操作,另一方面,它还是保留了setAlarmClock() 和提供setAndAllowWhileIdle() 和 setExactAndAllowWhileIdle(),但应考虑不同设备,应用实际唤醒间隔时间。在官方描述是不少于9分钟或者15分钟。


应用的Standby,主要是指系统判定用户不在使用应用时,推迟应用在后台的活动,包括网络访问、周期任务等;而判定的条件,排除此应用具有前台进程和具有通知栏。


然后都给出了测试方法,可以直接利用adb命令进入测试模式
(1)Doze
$ adb shell dumpsys battery unplug
$ adb shell dumpsys deviceidle step
第二条指令需要执行多次
 (2)Standby
$ adb shell dumpsys battery unplug
$ adb shell am set-inactive <packageName> true
退出此模式:
$ adb shell am set-inactive <packageName> false
$ adb shell am get-inactive <packageName>

最后说明的是进入Doze是有比较严格的条件的,官方说明是在屏幕关闭后,没有连接电源且没有活动一定时间后(如1小时),而且屏幕一旦开启或连接电源即退出Doze模式。同时系统也提供了白名单功能,如果觉得自己的应用进入Doze模式后,依然需要正常使用,可以通过ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS 引导用户将自己加白。然而厂商实际执行可能会有差别,如在华为手机上,屏幕关闭几分钟后,应用就已经被挂起;定制ROM比较严重的厂商,还会对屏幕关闭后,执行杀死进程,关闭网络等操作,都需要额外的考虑。细节不描述,因为这是保活的问题,具体可参考Android微信智能心跳方案和其它方案,但需要考虑对自身应用耗电的影响,比如心跳包无法发出,导致频繁重连接,导致频繁的证书交换(在此提及的原因是用https或者直接利用ssl,连接过程中验证服务端都会涉及到证书链的下载,而单个证书可能就有几K大小,证书链可能会到10K,特别是在数据网络下,频繁的连接带来的消耗非常大)等都是耗电耗流量大户。


2.其他经验
此处的经验是在电量统计的基础上得出的(后面会做些电量统计的说明)。耗电大户主要是设备唤醒、CPU和网络、传感器。
(1)设备唤醒单提出来说是因为通过Alarm可唤醒设备,而项目中不限制的滥用,导致系统被频繁唤醒;再加上不恰当的使用wake lock,没有释放wake lock,使得系统长时间无法进入休眠,势必导致高耗电,可参考(android设备休眠)
 ( 2)CPU和网络耗电方面,主要是减少I/O操作(包括数据库操作),大量的计算;减少网络网络请求次数和数据量
(3)传感器:设备屏幕亮度、颜色背景等需要考虑,但除了阅读类等应用,一般是不太考虑屏幕消耗的。更多的是对GPS的使用注意,减少无用的GPS请求和及时关闭GPS搜索,比如室内是无法使用GPS完成定位的。


原来统计耗电都参考《深入浅出Android App耗电量统计》
工具如腾讯的GT值得推荐


3.统计、查找、分析并优化实践
此处的统计主要针对batterystats上进行。在Android5.0已经提供了adb shell dumpsys batterystats命令,而且在Android6.0上数据统计更详细。官方的文档Batterystats and Battery Historian Walkthrough,简单的测试步骤:
(1)插入手机
  $adb shell dumpsys batterystats --reset
(2)拔掉手机,开始测试
(3)$adb shell dumpsys batterystats > filename.txt 保存统计数据
然后可以下载并使用官方的python脚本生成html查看,也可以直接用文本文档查看。统计数据中包括了详尽的电量,wake lock,网络使用的统计,具体到UID及其中的进程。列出一部分微信的在自己手机中使用的数据,有删减:
  
u0a90:
Mobile network: 908.38KB received, 144.94KB sent (packets 1063 received, 1219 sent)
Mobile radio active: 5m 27s 337ms (31.9%) 15x @ 143 mspp
Wi-Fi network: 3.52MB received, 454.37KB sent (packets 3628 received, 3645 sent)
Wake lock WakerLock:180110109: 12s 444ms partial (52 times) realtime
Wake lock *alarm*: 3s 362ms partial (24 times) realtime
...
TOTAL wake: 59s 188ms partial realtime
Foreground activities: 18m 37s 145ms realtime (32 times)
Foreground for: 1h 49m 14s 993ms
Total cpu time: u=3m 57s 240ms s=1m 4s 170ms p=0mAh
Proc com.tencent.mm:tools:
CPU: 1m 57s 260ms usr + 31s 570ms krn ; 0ms fg
3 starts
Proc com.tencent.mm:exdevice:
CPU: 1s 290ms usr + 2s 590ms krn ; 0ms fg
Proc com.tencent.mm:
CPU: 1m 46s 610ms usr + 22s 920ms krn ; 4m 21s 940ms fg
Proc com.tencent.mm:push:
CPU: 7s 250ms usr + 5s 50ms krn ; 0ms fg
Proc com.tencent.mm:sandbox:
CPU: 0ms usr + 0ms krn ; 0ms fg
1 starts
Apk com.tencent.mm:
Wakeup alarm *walarm*:ALARM_ACTION(7277): 22 times
Wakeup alarm *walarm*:com.tencent.mm/.booter.MMReceivers$AlarmReceiver: 7 times
Service com.tencent.mm.sandbox.updater.UpdaterService:
Created for: 11s 53ms uptime
Starts: 1, launches: 1
...
Service com.tencent.mm.plugin.webview.stub.WebViewStubService:
Created for: 0ms uptime
Starts: 0, launches: 9

从上能够分析出微信在这段测试时间详细的网络消耗,包括移动网络和WiFi网络,CPU的使用,Alarm,以及Service的启动和运行时长等信息,基于此,再逐项排查和减少电量消耗。对于alarm的触发,网络的请求问题的定位从代码上能比较方便的搜索到,但是CPU的消耗,则需要通过Android提供的Profiling工具来实现,它会帮你定位出CPU的时间都消耗在哪个函数上。具体可参考Profiling with Traceview and dmtracedump,网络上有很多的使用教程。

简单附上统计的说明:

应用UID:u0a90

移动网络数据统计和时长统计

WiFi网络数据统计

Wake lock统计,包括通过alarm触发次数

应用前台页面信息

CPU使用统计,包括各个进程的使用信息

Servce信息



转载于:https://www.cnblogs.com/yiweiaimeng/p/11527785.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_30402085/article/details/101396887

智能推荐

flask-login-程序员宅基地

文章浏览阅读170次。创建扩展对象实例from flask_login import LoginManagerlogin_manager = LoginManager()login_manager.login_view = 'auth.login'# 上面这一句是设置登录视图的名称,如果一个未登录用户请求一个只有登录用户才能访问的视图,# 则闪现一条错误消息,并重定向到这里设置的登录视图。# 如果未设置..._python flask please log in to access this page

html怎么控制top值为0,关于vue滚动scrollTop 赋值一直为0问题-程序员宅基地

文章浏览阅读428次。Vue中document.body.scrollTop的值总为零的解决办法最近在做vue的时候监听页面滚动发现document.body.scrollTop一直为0但是发现document.body.scrollTop一直是0。查资料发现是DTD的问题。页面指定了DTD,即指定了DOCTYPE时,使用document.documentElement。页面没有DTD,即没指定DOCTYPE时,使用d..._滚动给scrolltop赋值

kingbase数据库安装教程(初步使用)(人大金仓)-程序员宅基地

文章浏览阅读2.1k次,点赞25次,收藏21次。人大金仓数据库管理系统KingbaseES(简称:金仓数据库或KingbaseES)是北京人大金仓信息技术股份有限公司自主研制开发的具有自主知识产权的通用关系型数据库管理系统。_kingbase

vue基础笔试题_vue笔试题-程序员宅基地

文章浏览阅读1.2w次,点赞20次,收藏156次。ctions 选项用来定义事件处理方法,用于处理 state 数据。actions 类似于 mutations,不同之处在于 actions 是异步执行的,事件处理函数可以接收 {commit} 对象,完成 mutation 提交,从而方便 devtools 调试工具跟踪状态的 state 变化。..............._vue笔试题

isis协议配置和详解-程序员宅基地

文章浏览阅读1.1w次,点赞2次,收藏23次。isis是一种与ospf很相似的网络协议(属于动态路由协议),它被应用在巨大规模网络,如运营商以及银行等。同样的它也是基于链路状态算法,支持clnp网络,ip网络。与ospf不同的是,它是基于数据链路层报文传输,而ospf则是在ip层进行计算。它可以自动的发现远程网络,只要网络拓扑结构发生了变化,路由器就会相互交换路由信息,不仅能够自动获知新增加的网络,还可以在当前网络连接失败时找出备用路径。无类..._isis协议配置

Proxychains 手册_proxychains是什么-程序员宅基地

文章浏览阅读1.9k次。名称:Proxychains – 通过代理服务器进行连接语法:proxychains 描述:这个程序会强制所有使用特定tcp连接的客户端所引起的TCP连接走代理通道。它是一种跳板程序。这个软件和sockscap、premo、eborder异曲同工。2.0版支持SOCKS4、SOCKS5、HTTP类的代理。认证方法:socks-“user/pass”,http-“basic_proxychains是什么

随便推点

Oracle触发器原理、创建、修改、删除_用oracle创建一个instead of触发器,当在course表中删除数据,不允许在course-程序员宅基地

文章浏览阅读3.7k次,点赞2次,收藏7次。本篇主要内容如下:8.1 触发器类型8.1.1 DML触发器8.1.2 替代触发器8.1.3 系统触发器8.2创建触发器8.2.1 触发器触发次序8.2.2 创建DML触发器8.2.3 创建替代(INSTEAD OF)触发器8.2.3 创建系统事件触发器8.2.4 系统触发器事件属性8.2.5 使用触发器谓词8.2.6 重新编译触发器8.3删除和使用触发器8.4触发器和数据字典8.5数据库触发器的应用举例8.6 触发器的查看8...._用oracle创建一个instead of触发器,当在course表中删除数据,不允许在course表

计算机科学与技术网上书店,计算机科学与技术毕业论文:基于web的网上书店.doc...-程序员宅基地

文章浏览阅读188次。本科毕业论文(设计)题  目  基于web的网上书店学生姓名专业名称  计算机科学与技术指导教师目录1、引言52、系统概述62.1概述62.2 开发平台73.需求分析73.1总体需求描述73.2系统总体功能图73.3系统需要实现的功能83.4业务流程图94.详细设计114.1数据库详细设计114.2建立数据库124.3页面详细设计:185用户手册225.1普通用户:225.2管理员:24参考文献3..._计算机科学与技术毕业设计网上书店

素数求和_输入一个正整数n和n个正整数,统计其中素数的和。-程序员宅基地

文章浏览阅读1.6k次。Description输入一个正整数N和N个正整数,统计其中素数的和。Input输入一个正整数N(1≤N≤100)和N个正整数(≥3),用空格分隔。Output输出所有素数,用空格隔开;再输出这些素数和。Sample Input10 4 5 8 12 13 24 34 37 20 885 1 5 8 12 13Sample Output5 13 37 s=555 13 s=..._输入一个正整数n和n个正整数,统计其中素数的和。

Oracle DB 使用RMAN创建备份2_rman 备份 生成两个文件-程序员宅基地

文章浏览阅读2.5k次。归档备份:概念归档备份:概念 如果需要在指定时间内保留联机备份,RMAN 通常会假定用户可能需要在自执行该备份以来到现在之间的任意时间执行时间点恢复。为了满足这一要求,RMAN 会在此时段内保留归档日志。但是,可能仅需要在指定的时间(如两年)内保留特定备份(并使其保持一致和可恢复)。用户不打算恢复到自执行该备份以后的某一时间点,只是希望能够正好恢复到执行该备_rman 备份 生成两个文件

JS实用技巧之断点调试详解_js断点调试-程序员宅基地

文章浏览阅读9.3k次,点赞9次,收藏58次。引言调试能力是一个程序员的生存根本,可是很多初学者却忽视调试。今天我们就来讨究一下JS的调试技巧。本文章将会详细列举JS相关的各种实用调试技巧。如果您是JS的初学者,那么这篇文章将对您有很大的帮助。为什么要调试?程序就是函数堆砌起来的,程序的运行就是函数的执行过程。而通过JS调试,我们可以更为直观的追踪到在程序运行中,函数的执行顺序,以及各个参数的变化。这样我们就可以快速的定位到问题所在。1. 什么是JS调试?在程序运行中,我们总会遇到各种bug,而通过代码的追踪代码的运行顺序从而定位到问题的过_js断点调试

记录一次kafka内存溢出,消费慢_kafka消费导致内存泄露-程序员宅基地

文章浏览阅读1k次。记录一次kafka内存溢出,消费慢_kafka消费导致内存泄露

推荐文章

热门文章

相关标签