最近领导老是反映说我们的APP耗电要比以前厉害一些,排在耗电量的首位,上黑名单了,需要进行电量优化!经过一段时间的研究,自己做了一部分的总结!

电量优化的工具battery-historien

battery-historien是google开源的电量检测分析的工具,由于很多APP开发者对电量这快关注不是那么多,star数并不是特别多!

链接:https://github.com/google/battery-historian上面有具体环境搭建步骤!

环境搭建步骤

我使用的是方法二,步骤如下:

1.下载go,安装,指定path路径
2.下载python,安装,指定path
3.下载git,安装
4.下载Java,安装,指定path
5.下载源码go get -d -u github.com/google/battery-historian/…
6.运行源码,下载依赖cd $GOPATH/src/github.com/google/battery-historiango run setup.go发现下载不下来,手动下载closure-library,closure-compiler,flot-axislabels分别解压到third_party下面7.运行监听go run cmd/battery-historian/battery-historian.go2017/04/16 18:23:02 Listening on port:  99998.检验运行情况http://localhost:99992017/04/16 18:23:09 Trace starting analysisServer processing for: GET
2017/04/16 18:23:09 Trace finished analysisServer processing for: GET

导出电量文件与分析

导出文件

导出文件使用ADB命令来生成文件:

adb kill-server
adb start-server
// 打开电池数据获取
adb shell dumpsys batterystats --enable full-wake-history
// 电池数据重置
adb shell dumpsys batterystats --reset
// 生成电量数据到文件
adb bugreport > bugreport.txt

分析文件:

分析文件有两种方式:

上传文件分析

一是上传文件到服务器进行分析,但是不知道什么原因,失败了!
在battery-historian目录下打开GUI bash,执行:

 go run cmd/battery-historian/battery-historian.go
historian.py
浏览器打开:http://localhost:9999/
但是并没有什么卵用!
生成的txt文件是无法上传进行分析的,可能是因为不兼容


选择生成的文件之后就没有后文了!表示很伤心!果断使用第二种!

转换为html文件分析

使用python脚本进行分析,下载脚本到相应目录

使用命令将txt生成html文件:

python historian.py -a bugreport.txt > battery.htmlWARNING: Visualizer disabled. If you see this message, download the HTML then open it.需要翻墙

打开html文件就可以看到电量消耗情况:

字段分析

plugged 充电状态
top 那个app运行在最上面
sync 跟后台同步
wake_lock cpu的唤醒锁
job 服务,后台任务
running
connection
wifi
mobile_ratio 蜂窝信号

主要耗电的地方:屏幕亮屏,蜂窝移动数据(3G,4G),WIFI,CPU/GPU工作,我们需要特别关注这些方面!

优化策略

电量优化策略:
1.充电进行某些操作
某些不需要及时与用户进行交互的操作,可以放到充电后再进行,比如拍照后图片处理,360手机助手在手机充电后才自动清理
垃圾,联系人数据上传到云端等等。。。

监听电池充电操作IntentFilter filter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
Intent batteryStatus = this.registerReceiver(null, filter);//几种充电方式:直流充电,USB充电,无线充电int chargePlug = batteryStatus.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);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);}return (usbCharge || acCharge || wirelessCharge);}

2.WIFI状态下进行操作

    我们知道在蜂窝无线网络状态下会比WIFI状态下耗电的多,所以尽量减少移动网络下的数据传输,多在WIFI数据下操作!//判断网络连接 private boolean isNetWorkConnected() {
ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
return (activeNetworkInfo!=null&&activeNetworkInfo.isConnected());
}

3.网络请求设置超时
在网络请求时,如果网络很差,请求需要很长时间,我们需要设置超时时间,减少网络消耗!

4.任务集中处理JobScheduler
使用JobScheduler来处理一些特定的操作

JobScheduler jobScheduler = (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE);for (int i = 0; i < 10; i++) {JobInfo jobInfo = new JobInfo.Builder(i,componentname).setMinimumLatency(10000)//最小延时.setOverrideDeadline(60000)//最多执行时间
//                    .setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED)//免费的网络(wifi/蓝牙/USB),满足该条件才去执行
.setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY)//任意网络---wifi.build();jobScheduler.schedule(jobInfo);}
// 任务处理
public class JobServiceTest extends JobService {}
缺点就是有API限制

大量集中的操作可以一起处理
5.WEAK_LOCK谨慎使用
WEAK_LOCK主要是用来处理系统休眠的,我们知道系统为了省电一般会在熄屏之后进行休眠,休眠之后所有的操作就会被暂停冷冻了(Timer,Services),
休眠之后一些后台的网络访问操作就会被停止,可能就会导致一些问题,比如即时通讯的心跳包不能及时发出,导致收不到消息,
为了防止这些情况,需要使用WEAK_LOCK来唤醒CPU,权利配合我们的程序执行!

wake_lock:两种锁,一种计数锁(锁一次,释放一次);非计数锁(锁了很多次,只需要release一次就可以解除了

使用WEAK_LOCK:

// 注册权限
<uses-permission android:name="android.permission.INTERNET"></uses-permission><uses-permission android:name="android.permission.WAKE_LOCK"></uses-permission><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);WakeLock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,"MyWakelockTag");mWakelock.acquire();//唤醒CPUmWakelock.release();//释放CPU锁
注意:在使用该类的时候,必须保证acquire和release是成对出现的。

需要注意

1.唤醒CPU频率

唤醒CPU的频率也不能太高,不然可能会出现一些问题,比如小米手机做了同步心跳(心跳对齐),如果超出了这个心跳的频率,就会被
屏蔽或者降频!

2.使用AlarmManager
AlarmManager是系统的闹钟服务,可以用来唤醒CPU,做一些后台的任务,即使在屏幕熄灭后也能正常的工作(定时任务尽量不要使用Timer、Handler、Thread、Service)

Intent intent = new Intent(context, Service.class);
PendingIntent pi = PendingIntent.getService(context, 1, intent, 0);
AlarmManager alarm = (AlarmManager) getSystemService(Service.ALARM_SERVICE);
if(alarm != null)
{alarm.cancel(pi);// 闹钟在系统睡眠状态下会唤醒系统并执行提示功能alarm.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 1000, 2000, pi);// 确切的时间闹钟//alarm.setExact(…);//alarm.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), pi);
}

3.保持屏幕常量
在屏幕关闭之后,系统休眠,一些任务可能会被暂停(Timer、Handler、Thread、Service),但是某些情况下我们需要保持屏幕常量,或者不需要屏幕常量但是需要CPU一直执行,直到任务的执行完成,那么我们可以手动设置屏幕常亮!

//在Acitivty里面使用Flag
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
FLAG_KEEP_SCREEN_ON的好处是使用方便,不要额外的权限!

Android电量优化相关推荐

  1. 【Android 电量优化】JobScheduler 源码分析 ( JobServiceContext 源码分析 | 闭环操作总结 | 用户提交任务 | 广播接收者接受相关广播触发任务执行 )★

    文章目录 一.JobServiceContext 引入 二.JobServiceContext 源码分析 三.用户在应用层如何使用 JobScheduler 四.用户提交任务 五.广播接收者监听广播触 ...

  2. 【Android 电量优化】JobScheduler 相关源码分析 ( JobSchedulerService 源码分析 | 任务检查 | 任务执行 )

    文章目录 一.回调 StateChangedListener 接口 二.JobHandler 处理 ( 任务检查 ) 三.maybeRunPendingJobsH 方法 四.assignJobsToC ...

  3. 【Android 电量优化】JobScheduler 相关源码分析 ( ConnectivityController 底层源码分析 | 构造函数 | 追踪任务更新 | 注册接收者监听连接变化 )

    文章目录 一.ConnectivityController 连接控制器引入 二.ConnectivityController 构造方法解析 ( 注册接收者 ) 三.mConnectivityRecei ...

  4. 【Android 电量优化】JobScheduler 相关源码分析 ( JobSchedulerService 源码分析 | Android 源码在线网址推荐 )

    文章目录 一.JobScheduler 提交任务 schedule 方法源码分析 二.schedule(JobInfo job, int uId) 方法 三.scheduleAsPackage 方法 ...

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

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

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

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

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

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

  8. android电量优化方法,Android性能优化——电池使用优化

    为什么要做电量优化 Android应用开发中,需要考虑的情况是,如何优化电量使用,让我们的app不会因为电量消耗过高被用户排斥,或者被其他安全应用报告. 什么样的行为会导致电量损耗过高 对于移动设备而 ...

  9. 详解Android电量优化

    目录 写在前面 一.电量优化介绍及方案选择 1.1.如何正确认识电量优化 1.2.耗电量测试方案 二.Battery Historian实战分析 三.电量辅助监控实战 3.1.获取运行时能耗 3.2. ...

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

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

最新文章

  1. python数字图像的行 宽的不同处 cv2.resize(1389,1500) p1列宽 p2 行高 stop2.shape 得(640,960,3) v1列宽 v2 行高 v3 通道数
  2. RxSwift 小记 Error Handling Operators(catchError,retry)
  3. python人脸识别毕业设计-Python 40行代码实现人脸识别功能
  4. 标识位:可以用以确定鼠标点击的是哪一个按钮或者是文本框
  5. JAVA复习5(集合—— Vetor)
  6. 【拓扑排序】【DP】奖金(ssl 1325)
  7. SQL 的 left join 和 right join
  8. vs2013 提交 github
  9. 随想录(网站api的设计)
  10. 每日一句20191104
  11. maven 绑定html压缩,Maven使用yuicompressor-maven-plugin打包压缩css、js文件
  12. windows的终端命令
  13. 嵌入式网络和数据库管理系统
  14. 深圳清洁公司深南环境发展近日获得19个高科技专利发明
  15. pandas中drop用法_机器学习笔记:Pandas的delete、drop函数的用法
  16. flutter中 dp的理解
  17. NCBI数据下载-sra
  18. IBM赌未来:量子计算服务IBM Q系统今年上线
  19. java.lang.ClassNotFoundException: sun . jdbc . odbc . JdbcOdbcDriver
  20. 3d打印机打印obj格式_购买3D打印机如何为您省钱

热门文章

  1. 我在 Greasy Fork 发布了第一个原创 JS 脚本(可搭配油猴安装使用)
  2. 计算机应用基础-在线作业d,计算机应用基础_在线作业_D.docx
  3. i5 9400f和i7 8700有什么区别 i5 9400f和i7 8700玩游戏选哪个
  4. 【STM32WLE5之LoRa# 系列3、易智联LM401 评估板PingPong应用移植】
  5. c4d支持mac系统渲染器有哪些_C4D Octane Render渲染器 V4.0-RC7-R4 for C4D R15-R19-R20 Win/Mac...
  6. E: 无法修正错误,因为您要求某些软件包保持现状,就是它们破坏了软件包间的依赖关系
  7. ebay js_eBay上的拍卖域名-完整指南
  8. 文件上传漏洞防范措施
  9. 3.2-7 字体属性详解
  10. python中全局变量和局部变量的区别_Python全局变量与局部变量区别及用法分析