我的当前项目是一个常驻应用程序(类似Tinder或Foursquare),电池消耗量非常大。我们认为对电源的主要吸引力是GPS和WiFi天线。我们希望能够在几种不同的配置下测量我们应用程序的能量使用情况。
但是如何做到这一点呢?我们想要一个过程:
- 可以在手机未连接到计算机的情况下使用(这样我们就知道我们正在使用电池而不是通过USB绘制电源)
- 具有足够粒度,使我们能够将能量峰值与应用程序事件相关联(启动应用程序、更新位置、向Mixpanel发送分析信息等)
- 可以在没有看守时夜间运行
- 可以导出为CSV或其他格式进行统计分析
我知道这是一份相当长的清单。
这些是要求,这里是我所知道的选项:
1. 在iOS设备上开启无线能量诊断日志记录,并导出到Instruments
这是显而易见的答案,但它有一个巨大的缺陷。
优点:
- 需要使用电池而不是USB电源。
- 优秀的粒度(1秒时间序列数据,20个离散的能源使用级别),
- 与其他设备事件相关,如GPS天线使用等。
缺点:
- 不能在夜间运行,因为“如果设备电池耗尽或iOS设备关闭电源,则日志数据将丢失。”这是一个疯狂的限制,几乎使得这种方法对我们的情况没有用处(https://developer.apple.com/library/ios/recipes/Instruments_help_articles/LoggingEnergyUsageinaniOSDevice/LoggingEnergyUsageinaniOSDevice.html)。
- 不能导出到CSV。因为工具。
2. 通过Instruments监视插入手机
优点:
- 相同的优秀粒度和与其他设备事件的关联性。
- 电池不会耗尽。
缺点:
- 不使用电池,因此能耗与实际使用无法比较。
- 仪器甚至不能可靠地显示能源使用情况。有时它只是空白的。
- 无法导出到CSV。
3. 使用公共Cocoa API在我们的应用程序中记录能源使用情况 - [UIDevice.currentDevice batteryLevel]
这是SO上最常见的答案。我看了 iOS上估计的电池寿命, iphone: 计算电池寿命和其他大约十几个网站。
优点:
- 可以测量时间间隔任意小。
- 即使电池死亡也可以通过某种方式写入磁盘(CoreData、默认值、网络等)来保留数据。
- 可以选择任意格式的数据,如CSV。
缺点:
- 比其他方法需要更多的工作。
- 公共API仅提供电池电量精度为5%。这本质上是我们从方法1和2获得的瞬时功耗数据的时间积分。不足以与其他设备事件相关(但可能足以粗略估计设备电池寿命)。
4. 使用私有Cocoa API记录能源使用情况
由于我们只会在开发过程中执行此操作,因此如果苹果拒绝使用私有API的应用程序也无关紧要。假定存在某些私有API可用于此,因为苹果可以在打开Untethered Energy Diagnostics时记录数据。
优点:
- 任意粒度,任意文件格式,任意持久性。
缺点:
- 需要更多的工作来弄清如何使用它。甚至可能不可能。
5. 组合方法
我们可以使用无线诊断来量化每个操作的边际能耗。 "好的,启动GPS天线需要150mW·H。计算位置需要50mW·H。发送Mixpanel事件需要25mW·H,除非我们在前30秒内进行了另一次网络调用,在这种情况下,它需要15mW·H。"(所有数字都是现场虚构的)。然后,我们可以使用有线监测记录每个操作发生的时间,输入线性方程,估计它应该消耗的能量。优点:
- 灵活。任意内容。
缺点:
- 数学。
- 很容易错过非线性贡献。得到类似E = k0 / (gps轮询间隔) + k1 *(分析调用编号)这样的结果很容易,但如果同时启动两个天线的成本低于单独启动它们,则怎么办?
- 忽略了苹果可能在位置服务中 internally 进行的任何缓存策略。
- 与实际利用远不相符。
总之,我已经说得够多了。有人以前做过吗?如何做到的?