耗电优化实战
场景
用户投诉 App 在后台持续耗电,电池消耗排名靠前。
排查与方案
1. 定位耗电来源
# 导出电量统计
adb shell dumpsys batterystats --reset
# 使用一段时间后
adb shell dumpsys batterystats > battery.txt
adb bugreport > bugreport.zip
# 用 Battery Historian 可视化分析
| 耗电来源 | 排查方式 |
|---|---|
| WakeLock 未释放 | dumpsys power 查活跃的 WakeLock |
| 频繁网络请求 | 抓包 or Network Profiler |
| GPS 持续定位 | dumpsys location |
| 后台 Service 常驻 | dumpsys activity services |
| AlarmManager 过频 | dumpsys alarm |
2. 优化方案
| 问题 | 优化 |
|---|---|
| WakeLock 泄漏 | 用 try-finally 确保释放;设置超时 |
| 频繁网络轮询 | 改 FCM 推送;合并请求 |
| 精确定位 | 降低精度 PRIORITY_BALANCED_POWER_ACCURACY |
| 后台 Service | 迁移到 WorkManager(系统统一调度,省电) |
| 频繁 Alarm | 使用 setInexactRepeating,让系统合并唤醒 |
// ❌ 错误:精确定位 + 高频率
locationClient.requestLocationUpdates(
LocationRequest.create()
.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
.setInterval(1000) // 每秒一次
)
// ✅ 正确:平衡精度 + 合理频率
locationClient.requestLocationUpdates(
LocationRequest.create()
.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY)
.setInterval(60_000) // 60 秒
.setFastestInterval(30_000)
)
Doze 模式适配
Android 6.0+ 的 Doze 模式会限制后台网络和 WakeLock。使用 WorkManager 替代自行管理的后台任务,系统会在维护窗口合并执行,大幅降低电量消耗。
面试答题要点
- 用 Battery Historian 分析,展示数据驱动
- 列举常见耗电来源及解决方案
- 强调 WorkManager 替代后台 Service
- 提到 Doze / App Standby 对后台任务的影响