温馨提示:
微信公众号做了超链接限制,有兴趣的小伙伴可以直接到
www.androidblog.cn
或点击文章末尾"阅读全文"里进行查看
注意 【招编辑和分享讲师,有意者公众号留言】
作者简介:
本文作者 哎你的益达
本文原地址:http://www.jianshu.com/p/ebac88cdf9d6
文章源自网络,如果涉及侵权等问题,请第一时间联系我们予以下架
Battery Historian工具使用
Battery Historian 一款由Google提供的Android系统电量分析工具,从手机中导出bugreport文件上传至页面,在网页中生成详细的图表数据来展示手机上各模块电量消耗过程,最后通过App数据的分析制定出相关的电量优化的方法。
https://github.com/google/battery-historian
运行环境
根据gitbub上面介绍,Battery Historian工具的安装有两种方式:
通过安装Docker环境来安装。(这种方式很简单,推荐使用)
安装GO环境、Python、Java环境。(安装比较繁琐感兴趣可以去GitHub上看看)
Docker环境
Docker是一种容器,一般用于云计算和大数据平台。提倡的一种思想就是:软件即服务。一句话就可以将别人发布的docker服务环境一次全部copy过来(注意是整个软件环境,相当于复制了一台一模一样的主机,连软件都不要安装了,全有了。)
官方下载地址:
安装Battery Historian命令
安装完Docker环境后通过以下命令来安装Battery Historian工具:
Mac:
# 替换成本机一个端口$ docker -- run -p :9999 gcr.io/android-battery-historian:2.1 --port 9999
在此需要个漫长的下载安装等待,完成后在浏览器输入http://localhost:9999地址可以正常访问到Battery Historian页面说明已经成功了。
提交文件页面
Windows:
没有尝试!可参考:https://github.com/google/battery-historian
App电量消耗分析
工具安装成功后我们需要从手机上导出数据进行分析
# 将bugreport的信息保存到.zip文件中$ adb bugreport bugreport.zip
Android 6.0以下系统请使用以下导出命令
# 将bugreport的信息保存到txt文档中$ adb bugreport bugreport.txt
打开浏览器输入http://localhost:9999成功访问页面,将导出的.zip或.txt文件进行提交生成分析图表:
在该图中左侧为各单元模块,X轴为对应的时间线,可通过点击左侧Batter level(电量百分比)、Coulomb charge(电池容量)、Temperature(手机温度)选项展示出相应的变化曲线
电量消耗明细
通过选择标签System Stats、History Stats来查看手机整体的运行状态详情,也可以通过指定App包名选择App Stats标签查看单个的运行状态详情
详细数据
导致电量消耗过快的原因
Android系统为了尽可能的增加设备的续航,会不断的关闭各种硬件模块来节省电量。当我们的App在设备处于休眠状态下想要执行一次网络请求的时候;首先需要唤醒设备,接着会发送数据请求,然后等待服务端返回的结果,最后再经过一段时间的等待才会慢慢进入休眠状态。
尽可能地避免唤醒锁或批量操作以避免频繁的唤醒设备即使屏幕没有被点亮CPU也会保持运行状态,通过AlarmManager可唤醒设备,而项目中不限制的滥用,导致系统被频繁唤醒;Android 的 Timer 类可以用来计划需要循环执行的任务,Timer 的问题是它需要用 WakeLock 让 CPU 保持唤醒状态,再加上不恰当的使用WakeLock最终没有合理释放掉,使得系统长时间无法进入休眠,势必导致高耗电,可参考(android设备休眠[http://www.cnblogs.com/kobe8/p/3819305.html])
CPU和网络耗电方面,主要是减少I/O操作(包括数据库操作),大量的计算;减少网络网络请求次数和数据量,将不重要的操作放在用户充电或已经连接至WiFi的时候。分析和记录之类的操作不需要实时进行。
传感器方面设备屏幕亮度、颜色背景等需要考虑,但除了阅读类等应用,一般是不太考虑屏幕消耗的。更多的是对GPS的使用注意,减少无用的GPS请求和及时关闭GPS搜索。
优化建议
开发过程中可以尝试通过调整任务优先级等策略来达到降低损耗的目的,使用JobScheduler是个不错的选择:
可以推迟的非面向用户的任务(如定期数据库数据更新);
当充电时才希望执行的工作(如备份数据);
需要访问网络或 Wi-Fi 连接的任务(如向服务器拉取配置数据);
零散任务合并到一个批次去定期运行;
当设备空闲时启动某些任务;
只有当条件得到满足, 系统才会启动计划中的任务(充电、WIFI...);
官方建议优化的一些方法
https://developer.android.google.cn/training/monitoring-device-state/index.html
对低电耗模式和应用待机模式进行针对性优化
https://developer.android.google.cn/training/monitoring-device-state/doze-standby.html
Android 7.0新特性对电池管理进一步加强,一些新的变化可能多对我们现有的业务会造成影响需关注
https://developer.android.google.cn/about/versions/nougat/android-7.0-changes.html#perf
JobScheduler
自 Android 5.0 发布以来,JobScheduler 已成为执行后台工作的首选方式,其工作方式有利于用户。应用可以在安排作业的同时允许系统基于内存、电源和连接情况进行优化。JobSchedule的宗旨就是把一些不是特别紧急的任务放到更合适的时机批量处理。这样做有两个好处:
JobScheduler的简单使用,首先自定义一个Service类,继承自JobService
|
public class JobSchedulerService extends JobService{ private String TAG = JobSchedulerService.class.getSimpleName(); @Override
public boolean onStartJob(JobParameters jobParameters) {
Log.d(TAG, "onStartJob:" + jobParameters.getJobId()); if(true) {
new DownloadTask().execute(jobParameters); return true;
}else {
return false;
}
}
@Override
public boolean onStopJob(JobParameters jobParameters) {
Log.d(TAG, "onStopJob:" + jobParameters.getJobId());
return true;
} class DownloadTask extends AsyncTaskJobParameters, Object, Object> {
JobParameters mJobParameters; @Override
protected Object doInBackground(JobParameters... jobParameterses) {
mJobParameters = jobParameterses[0];
try {
Thread.sleep(30*1000);
} catch (InterruptedException e) {
e.printStackTrace();
} return null;
} @Override
protected void onPostExecute(Object o) { super.onPostExecute(o);
jobFinished(mJobParameters, false);
}
}
}
|
记得在Manifest文件内配置Service
创建工作计划
|
public class MainActivity extends Activity{ private JobScheduler mJobScheduler; private final int JOB_ID = 1; @Override
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);
setContentView(R.layout.mai_layout);
mJobScheduler = (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE );
JobInfo.Builder jobBuilder = new JobInfo.Builder(JOB_ID, new ComponentName(this, JobSchedulerService.class));
jobBuilder.setPeriodic(3000);
jobBuilder.setMinimumLatency(3000);
jobBuilder.setOverrideDeadline(3000);
jobBuilder.setPersisted(false);
jobBuilder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED);
jobBuilder.setRequiresCharging(true);
jobBuilder.setRequiresDeviceIdle(true);
JobInfo jobInfo = jobBuilder.build();
if (mJobScheduler.schedule(jobInfo) == JobScheduler.RESULT_FAILURE) {
}
mJobScheduler.cancel(JOB_ID);
mJobScheduler.cancelAll();
}
|
------------------------------ End --------------------------------
精选文章:
View事件体系 面试遇到的那些坑 Android密钥保护和C/S网络传输安全理论指南
随机洗牌算法 Android增量编译 由模块化到组件化(一) 一致性Hash算法
往期周刊:
48期 | 47期 |
46期 | 45期 | 44期 | 43期 | 42期 | 41期 | 40期 | 39期
38期 | 37期 | 36期 | 35期 | 34期 | 33期 | 32期 | 31期
30期 | 29期 | 28期 | 27期 | 26期 | 25期 | 24期 | 23期
22期 | 21期 | 20期 | 19期 | 18期 | 17期 | 16期 | 15期
14期 | 13期 | 12期 | 11期 | 10期 | 09期 | 08期 | 07期
06期 | 05期 | 04期 | 03期 | 02期 | 01期 |
-----------------------------------------------------------------------------------------
自动回复:
公众号已做了自动聊天回复功能,大家可以用以下关键词进行挑逗。
网站,QQ群,代言人,福利,1-47(最新期数)之间任意数字,最新文章 等!
温馨提示:
微信公众号做了超链接限制,有兴趣的小伙伴可以直接到www.androidblog.cn
或点击文章末尾"阅读全文"里进行查看