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://github.com/google/battery-historian
安装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

运行时获取使用时长

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