Part 8 App电量优化

一 电量优化介绍及方案选择

1、正确认识

电量重视度不够:开发中一直连着手机
电量消耗线上难以量化

2、方案介绍

设置界面-耗电排行

直观,但是没有详细数据,对解决问题没有太多帮助
找特定场景专项测试(如在详情页中进行一段时间的操作)

注册电量相关的广播ACTION_BATTERY_CHANGED

获取电池电量、充电状态、电池状态等信息
价值不大:针对手机整体的耗电量。而非特定的App

        //示例代码IntentFilter filter = new IntentFilter();filter.addAction(Intent.ACTION_BATTERY_CHANGED);Intent intent = registerReceiver(null, filter);LogUtils.i("battery " + intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1));

Battery Historain

Google推出的一款Android系统电量分析工具
支持5.0(API21)及以上系统的电量分析
功能强大,推荐使用
可视化的展示指标:耗电比例、执行时间、次数
适合线下使用

3、测试相关

耗电场景测试:复杂运算、视频播放
传感器相关:使用时长、耗电量、发热
后台静默测试

二 Battery Historain实战分析

1、安装

https://github.com/google/battery-historian
安装Docker(http://www.runoob.com/docker/docker-tutorial.html 教程)
docker – run -p :9999 gcr.io/android-battery-historian/stable:3.0 --port 9999

2、导出电量信息

adb shell dumpsys batterystats --reset 电量重置
adb shell dumpsys batterystats --enable full-wake-history 开始记录电量信息
adb shell bugreport bugreport.zip 导出电量信息

3、上传问题

http://localhost:9999
上传bugreport文件即可
备用:https://bathist.ef.lc/

三 电量辅助监控

1、运行时能耗

获取各个模块的能耗(如屏幕、wifi,bluetooth等)
adb pull /system/framework/framework-res.apk
反编译,xml ————> power_profile

2、运行时获取使用时长

Aop辅助统计:次数、时间
以WakeLock为例子
https://www.cnblogs.com/leipDao/p/8241468.html (安卓电量优化之WakeLock锁机制全面解析)
https://www.jianshu.com/p/67ccdac38271 (Android 功耗分析之wakelock)

public class WakeLockUtils {private static PowerManager.WakeLock sWakeLock;public static void acquire(Context context){if(sWakeLock == null){sWakeLock = createWakeLock(context);}if(sWakeLock != null && !sWakeLock.isHeld()){sWakeLock.acquire();sWakeLock.acquire(1000);}}public static void release(){// 一些逻辑try{}catch (Exception e){}finally {// 为了演示正确的使用方式if(sWakeLock != null && sWakeLock.isHeld()){sWakeLock.release();sWakeLock = null;}}}@SuppressLint("InvalidWakeLockTag")private static PowerManager.WakeLock createWakeLock(Context context){PowerManager pm = (PowerManager) context.getApplicationContext().getSystemService(Context.POWER_SERVICE);if(pm != null){return pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,"");}return null;}}// 此处模拟的是WakeLock使用的兜底策略WakeLockUtils.acquire(holder.imageView.getContext());new Handler().postDelayed(new Runnable() {@Overridepublic void run() {WakeLockUtils.release();}},200);//通过Hooker监控
public class ActivityHooker {public static ActivityRecord sActivityRecord;static {sActivityRecord = new ActivityRecord();}public static String trace;public static long sStartTime = 0;@Insert(value = "acquire")@TargetClass(value = "com.optimize.performance.wakelock.WakeLockUtils",scope = Scope.SELF)public static void acquire(Context context){trace = Log.getStackTraceString(new Throwable());sStartTime = System.currentTimeMillis();Origin.callVoid();//兜底策略new Handler().postDelayed(new Runnable() {@Overridepublic void run() {WakeLockUtils.release();}},1000);}@Insert(value = "release")@TargetClass(value = "com.optimize.performance.wakelock.WakeLockUtils",scope = Scope.SELF)public static void release(){LogUtils.i("PowerManager "+(System.currentTimeMillis() - sStartTime)+"/n"+trace);Origin.callVoid();}
}    

3、线程运行时长

超过阀值预警(运行时间过长可以停止)

   public static long runTime = 0;@Insert(value = "run")@TargetClass(value = "java.lang.Runnable",scope = Scope.ALL)public void run(){runTime = System.currentTimeMillis();Origin.callVoid();LogUtils.i("runTime "+(System.currentTimeMillis() - runTime));}

四 电量优化套路总结

1、CPU时间片

获取运行过程线程CPU的消耗,定位CPU占用率异常位置
减少后台应用的主动运行

2、网络相关

发起网络请求时机及次数
数据压缩,减少时间
禁止使用轮询功能进行业务操作

3、定位相关

根据场景谨慎选择定位模式(精度,频率)
考虑网络定位代替GPS
使用后及时关闭,减少更新

4、界面相关

离开界面后停止相关活动
耗电操作判断前后台

5、wakelock相关

注意成对出现:acquire与release
使用带参数的acquire
finally确保一定会被释放
常亮场景使用keeoScreenOn即可

6、JobScheduler

在符合某些条件时创建执行在后台的任务
把不紧急的任务放到更合适的时机批量处理
https://www.jianshu.com/p/9fb882cae239 (Android Jobscheduler使用)

//创建任务
public class JobSchedulerService extends JobService {@Overridepublic boolean onStartJob(JobParameters params) {// 此处执行在主线程// 模拟一些处理:批量网络请求,APM日志上报return false;}@Overridepublic boolean onStopJob(JobParameters params) {return false;}
}//manifest注册
<service android:name=".net.JobSchedulerService"android:permission="android.permission.BIND_JOB_SERVICE"/>/*** 演示JobScheduler的使用*/private void startJobScheduler() {//5.0之后才能使用if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP) {JobScheduler jobScheduler = (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE);JobInfo.Builder builder = new JobInfo.Builder(1, new ComponentName(getPackageName(), JobSchedulerService.class.getName()));builder.setRequiresCharging(true).setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED);jobScheduler.schedule(builder.build());}}

part 8 App电量优化相关推荐

  1. App优化(五)电量优化

    引言 App优化(一)App启动速度优化 App优化(二)布局优化 App优化(三)ANR优化 App优化(四)内存优化 App优化(五)电量优化 App优化(六)网络优化 电量使用优化, 基本上是我 ...

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

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

  3. Android APP性能优化

    转载自:https://www.cnblogs.com/qwangxiao/p/8727229.html Android APP性能优化(最新总结) 导语 安卓大军浩浩荡荡,发展已近十个年头,技术优化 ...

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

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

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

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

  6. Android 系统性能优化(77)---电量优化

    Android 优化--电量优化 Android 5.0 后用 Battery Historian 工具分析电量. 耗电因素 移动网络请求 手机通过内置的射频模块和基站联系,从而链接上网的,而这个射频 ...

  7. Android系统性能优化(56)---APP性能优化

    Android客户端性能优化(魅族资深工程师毫无保留奉献) 转载学习:http://blog.tingyun.com/web/article/detail/155?from=groupmessage& ...

  8. Android APP性能优化(一)

    Android APP性能优化(最新总结) 安卓大军浩浩荡荡,发展已近十个年头,技术优化日异月新,如今Android 8.0 Oreo 都发布了,Android系统性能已经非常流畅了.但是,到了各大厂 ...

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

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

  10. Android App性能优化总结

    优化方向 Android系统性能已经非常流畅了.但是,到了各大厂商手里,改源码自定系统,使得Android原生系统变得鱼龙混杂,然后到了不同层次的开发工程师手里,因为技术水平的参差不齐,即使很多手机在 ...

最新文章

  1. Redis 与 MQ 的区别
  2. android studio怎样运行uniapp打包项目_uni app系列002:离线打包apk(2)
  3. 细说Linux 系统优化
  4. Spring @Configuration和FactoryBean
  5. js 数字千分位展示
  6. android progressdialog 样式,android之修改系统自带ProgressDialog样式
  7. Jmeter BeanShell采样器提取接口响应写入csv文件(四)
  8. Windows Server 2012 存储 (三)SMB 的高可用性
  9. 我的宽带是100兆,为什么到户只有30-50兆,我应该换成什么型号的路由器?
  10. DeepMind和Unity合作,创建虚拟世界来训练AI
  11. android a20 i2c 通信,Android程序运行分析——中等复杂程度的NTAG I2C Demo为例(二)...
  12. 普林斯顿微积分读本篇一:函数
  13. python汉化包放哪_python 汉化
  14. 真机试用深度linux,推荐使用
  15. 支付宝第三方登录接口调用
  16. phpStudy安装教程
  17. K8S、Kubernetes发音
  18. UML相关工具一览(2018年5月更新)
  19. ZZULIOJ1194: 总成绩排序(结构体专题)
  20. Spring源码学习(三)-- 底层架构核心概念解析

热门文章

  1. 系统辨识 Identification Algorithm(基础篇)
  2. win10安装影子系统导致的蓝屏
  3. win10 桌面残留文件夹或其他应用关闭后的画面
  4. 阿里巴巴代码规范插件
  5. c语言笔试面试大全,C语言基础笔试题
  6. 初识scratch,球拍,背景,障碍物的制作
  7. open source Lrc歌词解析器发布
  8. navicat mysql 免安装_mysql免安装版配置+navicat测试
  9. 全网最详细ENSP安装教程,零基础网工小白必看!
  10. Linux下编译DCMTK,ACE问题记录