8.电量优化
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| //电量优化 1.电量优化检测方案: Battery Historian - Google推出的一款Android系统电量分析工具 - 支持50(API21)及以上系统的电量分析 - 功能强大,推荐使用 - 可视化展示指标:耗电比例、执行时间、次数 - 适合线下使用 2.电量优化套路总结: 1.网络相关:控制请求时机及次数,数据压缩,减少时间 2.传感器相关: 1.根据场景谨慎选择定位模式 2.考虑网络定位代替GPS 3.使用后务必及时关闭,减少更新频率
|
一、电量优化介绍及方案选择
正确认识
1 2
| 1.电量重视度不够:开发中一直连接手机 2.电量消耗线上难以量化
|
方案介绍
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| 设置->耗电排行 - 直观,但没有详细数据,对解决问题没有太多帮助 - 找特定场景专项测试 ACTION BATTERY CHANGED - 获取电池电量、充电状态、电池状态等信息 - 示例: IntentFilter filter = new IntentFilter(); filter.addAction(Intent.ACTION_BATTERY_CHANGED); Intent intent = registerReceiver(null, filter); LogUtils.i("battery " + intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1)); - 价值不大:针对手机整体的耗电量,而非特定App Battery Historian(推荐) - Google推出的一款Android系统电量分析工具 - 支持50(API21)及以上系统的电量分析 - 功能强大,推荐使用 - 可视化展示指标:耗电比例、执行时间、次数 - 适合线下使用
|
测试相关
1 2 3
| 1.耗电场景测试:复杂运算、视频播放 2.传感器相关: 使用时长、耗电量、发热 3.后台静默测试
|
二、Battery Historian实战及分析
安装
1 2 3
| https: 安装Docker docker -- run -p <port>:9999 gcr.io/android-batterynistorian/stable:3.0 --port 9999
|
导出电量信息
1 2 3
| adb shell dumpsys batterystats --reset adb shell dumpsys batterystats --enable full-wakehistory adb bugreport bugreport.zip
|
上传分析
1 2 3
| http://localhost:9999 上传bugreport文件即可 备用:https://bathist.ef.lc/(需翻墙)
|
使用方式:代码过多百度查看,如:https://blog.csdn.net/hpc19950723/article/details/54381246
三、电量辅助监控实战
运行时能耗
1 2
| adb pull /system/framework/framework-res.apk//导出apk 反编译,xml-》power_profile
|
![image-20230921092749912](/../../../images/image-20230921092749912.png)
运行时获取使用时长
1 2
| 1.Aop辅助统计:次数、时间 2.以WakeLock为例
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| package com.optimize.performance.wakelock; import android.annotation.SuppressLint; import android.content.Context; import android.os.PowerManager;
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; } }
|
四、电量优化套路总结
CPU时间片
1 2
| 1.获取运行过程线程CPU消耗,定位CPU占有率异常方法 2.减少后台应用的主动运行
|
网络相关
1 2 3
| 1.请求时机及次数控制 2.数据压缩,减少时间 3.禁止使用轮询功能
|
定位相关
1 2 3
| 1.根据场景谨慎选择定位模式 2.考虑网络定位代替GPS 3.使用后务必及时关闭,减少更新频率
|
界面相关
1 2
| 1.离开界面后停止相关活动 2.耗电操作判断前后台
|
WakeLock相关
1 2 3
| 1.注意成对出现:acquire与release 2.使用带参数的acquire 3.finally确保一定会被释放
|
JobScheduler
1 2
| 1.在符合某些条件时创建执行在后台的任务 2.把不紧急的任务放到更合适的时机批量处理
|
五、问题
怎么做电量测试
1 2 3
| 1.分场景逐个击破 2.Battery Historian 3.辅助监控
|
有哪些有效的电量优化手段
1 2 3
| 1.网络相关 2.传感器相关 3.WakeLock与JobScheduler
|