电池消耗增加 — 移动应用用户最常见的投诉之一。应用开始异常大量消耗电能,即使在后台模式下也会导致设备快速放电。根据Google I/O 2023的数据,Google Play中多达30%的应用存在能耗问题,直接影响用户留存率。本文将探讨其原因、诊断和优化方法。
要点
电池消耗增加 — 指移动应用在典型使用场景下消耗的电能远超预期的情况。用户注意到在安装或更新应用后,设备比平时放电快20-30%。
现代移动操作系统 — Android和iOS — 具有内置的能耗控制机制。Android使用Battery Optimization(电池优化),iOS使用Background Modes(后台模式)。然而,不正确地使用API可能会绕过这些机制。
根据普渡大学(2021)的研究,约60%的应用在没有明确需要的情况下将电能消耗于后台任务。这在带有广告、分析和永久网络连接的应用中尤为典型。
能耗以mA·h(毫安时)为单位测量。Android通过BatteryManager API提供数据,该API跟踪每个组件的消耗:CPU、无线电模块、GPS、显示屏和传感器。
val batteryManager = getSystemService(Context.BATTERY_SERVICE) as BatteryManager
val chargeCounter = batteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CHARGE_COUNTER)
val capacity = batteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY)
// chargeCounter / capacity * 100 = 当前充电百分比
BatteryManager API允许获取当前充电百分比和电池容量,但不提供按应用的详细信息 — 这需要系统实用程序。
WakeLock — 对电池最危险的机制。如果应用持有WakeLock而不释放,设备将无法进入休眠模式。每持有一小时WakeLock大约消耗50-80 mA·h。
未经批量处理的网络请求 — 第二个最常见的原因。每次应用建立网络连接时,无线电模块从节能模式切换到活动模式。间隔少于5分钟的频繁短请求使无线电模块持续处于活动状态。
使用高精度(GPS_PROVIDER)确定GPS位置消耗的能量比粗略确定(NETWORK_PROVIDER)多10-15倍。在后台持续更新位置是用户的主要投诉之一。
根据Android Developers Blog,平均每个应用消耗设备总电池电量的约15%。超过此水平需要进行强制性能耗审计。
Battery Historian — 谷歌官方的能耗分析工具。它接收来自ADB的BatteryStats转储,并按组件可视化消耗:CPU、网络、GPS、WakeLock和显示屏。
要创建转储,请执行命令:adb shell dumpsys batterystats。在收集2-3小时正常使用数据后,可以将报告加载到Battery Historian中进行分析。
Android Energy Profiler 在Android Studio中实时跟踪能耗。它显示每次应用操作的CPU、网络、GPS和显示屏消耗。
# 测试前重置电池统计信息
adb shell dumpsys batterystats --reset
# 使用应用2-3小时
# 导出转储到Battery Historian
adb shell dumpsys batterystats > batterystats_dump.txt
对于iOS,通过Xcode — Instruments使用Energy Log。它按模块分列收集能耗数据:CPU、网络、GPU、显示屏、位置。读取时间:分析一个会话需要15-30分钟。
在物理iOS设备上,能耗统计信息也显示在设置 > 电池中。如果应用进入消耗前十名 — 这是需要优化的信号。
WorkManager — 考虑电池状态、网络状态和Doze模式的后台任务标准API。它保证在最佳条件下执行任务,而非立即执行,从而在后台操作中节省多达40%的电能。
val workRequest = OneTimeWorkRequestBuilder<SyncWorker>()
.setConstraints(
Constraints.Builder()
.setRequiresCharging(true)
.setRequiresBatteryNotLow(true)
.setRequiresNetworkType(NetworkType.CONNECTED)
.build()
)
.build()
WorkManager.getInstance(this).enqueue(workRequest)
批量处理请求 — 将多个网络操作合并到一次通信会话中。应用不是发送10个单独的请求,而是执行一个批量请求,将无线电模块的活动时间从30秒减少到2-3秒。
FusedLocationProviderClient 来自Google Play Services,根据所需精度选择最佳位置源。对于后台任务,使用PRIORITY_BALANCED_POWER_ACCURACY优先级 — 可在最小化电池消耗的同时实现高达100米的精度。
在iOS中,使用Significant Location Change而非Continuous Location。这允许仅在显著移动(超过500米)时收到更新,而非每隔几秒。
Android Battery Historian — 谷歌的BatteryStats数据可视化网络工具。支持导入转储、组件颜色编码和会话比较。主要指标:WakeLock持续时间、无线电模块活动、GPS会话。
Xcode Energy Organizer 通过TestFlight和App Store从生产用户收集能耗数据。您将收到关于不同设备和iOS版本上平均消耗的报告。这允许跟踪更新后的回归问题。
PerfDog(腾讯) — 跨平台性能测试工具,包括能耗测量。支持iOS和Android,允许以每秒1-10帧的频率记录指标。
| 工具 | 平台 | 指标 |
|---|---|---|
| Battery Historian | Android | WakeLock、网络、GPS、CPU、显示屏 |
| Energy Profiler | Android Studio | CPU、网络、GPS、无线电(实时) |
| Energy Log | iOS(Xcode) | CPU、网络、GPU、显示屏、位置 |
| PerfDog | iOS + Android | 能耗、FPS、CPU、内存(全部) |
根据Apple WWDC 2023,使用Energy Organiser可以在更新发布到App Store之前通过识别和修复回归问题,将应用的平均能耗降低15-25%。
常见问题
社交网络和即时通讯应用(Facebook、Instagram、WhatsApp、Telegram)传统上在能耗方面领先。它们不断同步数据、更新信息流、接收推送通知并使用GPS。排在第二位的是3D图形游戏,它们同时加重GPU和CPU负担,每活跃游戏一小时消耗高达400-600 mA·h。
是的,直接影响。屏幕 — 智能手机中耗能最高的组件。将频率从60Hz提高到120Hz会使显示屏能耗增加30-50%。然而,采用LTPO技术的现代显示屏会根据内容动态地将频率从1Hz改变到120Hz,从而减少对电池的影响。
高精度GPS在连续运行一小时内消耗约200-300 mA·h。相比之下,通过Wi-Fi和移动基站(NETWORK_PROVIDER)确定位置在同一时间段内仅消耗20-40 mA·h。使用Geofencing API仅在进入指定区域时开启GPS。
不应该。现代操作系统(Android和iOS)自己优化后台进程。强制关闭应用并重新启动比让应用留在后台消耗更多电能。例外 — 明确引起问题的应用(通过设置中的电池统计信息确定)。
打开设置 > 电池 > 电池使用情况。系统将显示带有消耗百分比的应用列表。要进行详细分析,请使用ADB:adb shell dumpsys batterystats并将转储加载到Battery Historian中。这不仅会显示总体消耗,还会显示按组件(WakeLock、网络、GPS)的细分。
总结
我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。