我正在开发一个应用程序,使用GPS和网络位置信息跟踪用户移动。我使用服务、活动识别、不同采样率和GPS/网络超时来提高电池效率。
问题是,我如何才能准确测量我的应用程序消耗的电量(毫伏、毫安/小时或占总功耗的百分比)?不仅基于CPU的使用,还可以通过拨打GPS、网络、WiFi。所以我可以得出一个关于应用程序电池效率的结论。
我正在通过adb shell dumpsys batterystats
获取电池统计数据。
这是我在步行和乘火车旅行1小时后看到的:
Mobile network: 10.61KB received, 7.41KB sent (packets 26 received, 34 sent)
Mobile radio active: 18s 180ms (0.7%) 8x @ 303 mspp
Wifi Running: 0ms (0.0%)
Full Wifi Lock: 2m 8s 907ms (3.9%)
**Wifi Scan: 3m 20s 904ms (6.1%)**
Wake lock NlpCollectorWakeLock: 1m 23s 525ms partial (100 times) realtime
Wake lock *alarm*: 269ms partial (97 times) realtime
Wake lock NlpWakeLock: 264ms partial (83 times) realtime
Wake lock LocationManagerService: 64ms partial (19 times) realtime
TOTAL wake: 1m 24s 122ms partial realtime
**Sensor GPS: 5m 15s 109ms realtime (185 times)**
Foreground activities: 2m 40s 107ms realtime (10 times)
Foreground for: 51m 51s 176ms
Active for: 55m 1s 142ms
Proc xxxxxxxxxxx:
**CPU: 30s 670ms usr + 6s 800ms krn ; 7s 810ms fg**
Proc *wakelock*:
**CPU: 12s 660ms usr + 15s 40ms krn ; 0ms fg**
Apk xxxxxxxxxxx:
122 wakeup alarms
Service xxxxxxxxxxx.ActivityRecognitionIntentService:
Created for: 6s 652ms uptime
Starts: 356, launches: 356
Apk com.google.android.gms:
(nothing executed)
我想最耗电的是传感器GPS呼叫、CPU使用和WiFi。
问题:
1)如何解释这些数字?有没有可能找出每一次GPS通话(或实时)耗电量有多大?
2)有没有更好的方法来了解应用程序的总功耗?
最佳答案
正如在Battery Performance 101和Understanding Battery Drain中所讨论的那样,android不公开关于每个芯片的电池消耗的低级计数器。从日志记录和硬件级别来看,跟踪这些数据的开销都非常大。
获取这些信息的唯一正确方法是将你的android连接到一个MONSOON device上,但即使如此,你的结果也会出现偏差,因为设备和外形因素之间的功耗会发生变化。
中间部分是Battery Historian工具,它告诉您哪些重要系统处于活动状态,从而允许您找到这些事件与负责的硬件之间的关联。值得注意的是,battery historian只是batterystats工具(您已经在使用)的ui转换。它所做的一切工作就是为您将这些数据刮除并解释为可视化的形式。
尽管这并不是100%正确;正如您在Battery Drain and Networking中看到的,优化电池使用是在电池历史记录中寻找已知有问题的模式,并尝试更改代码以影响它们。所以,在诊断某些事情时,有一个小小的手在挥舞。
此时,这是一种找到有关电池使用情况的准确信息的建议方法。