详细的电池使用情况 - iOS

时间:2014-07-18 18:46:42

标签: ios cocoa-touch gps instruments battery

我目前的项目是一个持续存在的应用程序(想想Tinder或Foursquare),电池消耗是通过屋顶。我们认为主要的功耗是GPS和WiFi天线。我们希望能够在几种不同的配置下测量我们的应用程序的能源使用情况。

但是怎么做?我们想要一个过程:

  • 可以与断开计算机的手机一起使用(因此我们知道我们使用的是电池,而不是通过USB吸取电量),
  • 具有足够的粒度,允许我们将能量峰值与应用程序事件相关联(启动应用程序,更新位置,向Mixpanel发送分析信息等),
  • 可以在没有保姆的情况下过夜,
  • 可以导出为CSV或其他任何用于统计分析。

我知道这个清单。

这些是要求,以下是我所知道的选项:

1。打开iOS设备上不受限制的能量诊断记录,并导出到仪器

这是一个明显的答案,但它有一个巨大的缺陷。

优点:

  • 使用电池代替USB电源。
  • 出色的粒度(1秒时间序列数据,20个离散能源使用水平),
  • 与GPS天线使用等其他设备事件相关。

缺点:

2。通过仪器监控插入式电话

优点:

  • 与其他设备事件具有相同的优异粒度和相关性。
  • 电池无法用完。

缺点:

  • 不使用电池,因此能耗与实际使用无法比较。
  • 仪器甚至无法可靠地显示能源使用情况。有时它只是空白。
  • 无法导出为CSV。

第3。使用公共Cocoa API在我们的应用程序中记录能源使用情况 - [UIDevice.currentDevice batteryLevel]

这是SO上最常见的答案。我看过Estimated battery time on iOSiphone: Calculating battery life和其他十几个人。

优点:

  • 测量间隔时间过短。
  • 即使电池因某种方式写入磁盘而死亡(CoreData,默认设置,网络等等),也可以保留数据。
  • 可以为数据选择任意格式,例如CSV。

缺点:

  • 比其他方法更多的工作。
  • 公共API仅为您提供5%准确度的电池电量。这基本上是我们从方法1和2获得的瞬时功耗数据的时间积分。不够精细,无法与其他设备事件相关联(但可能足以获得设备电池寿命的总估计值)。

4。使用私有Cocoa API记录能源使用情况

由于我们在开发过程中只会这样做,因此Apple拒绝使用私有API的应用程序并不重要。据推测,有一些私有API,因为Apple能够在打开Untethered Energy Diagnostics的情况下记录数据。

优点:

  • 任意粒度,任意文件格式,任意持久性。

缺点:

  • Waaaaay更多的工作要弄清楚如何使用它。也许甚至不可能。

5。综合方法

我们可以使用不受限制的诊断来量化每个动作的边际能量成本。 “好吧,旋转GPS天线需要150mW•H。计算位置需要50mW•H。发送Mixpanel事件需要25mW•H,除非我们在之前的30秒内进行了另一次网络呼叫,在这种情况下需要15mW•H。” (当场发明的所有数字。)然后我们可以使用系留监控来记录每个动作何时发生,插入线性方程,并估算它应该的能量。 已经采取。

优点:

  • 灵活。任意一切。

缺点:

  • 数学。
  • 非常容易错过非线性贡献。得到像E = k0 /(gps轮询间隔)+ k1 *(分析呼叫的数量)这样的东西很容易,但是如果旋转两个天线的成本低于分别旋转它们的总和呢?
  • 忽略Apple可能在位置服务中内部制作的任何缓存策略。
  • 甚至没有远离现实世界的利用率。

无论如何,我已经足够了。有没有人这样做过?怎么样?

3 个答案:

答案 0 :(得分:2)

不确定这是否适用于这个确切的用例,但我已经开发了一个名为UIDeviceListener的库,它允许您轻松(基本上使用一行代码)从操作中检索数据关于功耗和许多其他电池/充电相关数据点的系统:https://github.com/eldoogy/PowerData

这是一个示例字典,可以让您了解可以获得的信息类型。我会将注意力集中在InstantAmperage密钥上。这显示了整个设备的实时功耗(mA)(当设备未插入时)。这可能有助于实现您在这里寻找的目标。

{
AdapterDetails =     {
    Amperage = 1000;
    Description = "usb host";
    FamilyCode = "-536854528";
    PMUConfiguration = 1000;
    Watts = 5;
};
AdapterInfo = 16384;
Amperage = 1000;
AppleRawCurrentCapacity = 1279;
AppleRawMaxCapacity = 1275;
AtCriticalLevel = 0;
AtWarnLevel = 0;
BatteryData =     {
    BatterySerialNumber = REDACTED;
    ChemID = 355;
    CycleCount = 524;
    DesignCapacity = 1420;
    Flags = 640;
    FullAvailableCapacity = 1325;
    ManufactureDate = REDACTED;
    MaxCapacity = 1273;
    MfgData = REDACTED;
    QmaxCell0 = 1350;
    StateOfCharge = 100;
    Voltage = 4194;
};
BatteryInstalled = 1;
BatteryKey = "0003-default";
BootBBCapacity = 52;
BootCapacityEstimate = 2;
BootVoltage = 3518;
CFBundleIdentifier = "com.apple.driver.AppleD1815PMU";
ChargerConfiguration = 990;
CurrentCapacity = 1275;
CycleCount = 524;
DesignCapacity = 1420;
ExternalChargeCapable = 1;
ExternalConnected = 1;
FullyCharged = 1;
IOClass = AppleD1815PMUPowerSource;
IOFunctionParent64000000 = <>;
IOGeneralInterest = "IOCommand is not serializable";
IOInterruptControllers =     (
    IOInterruptController34000000,
    IOInterruptController34000000,
    IOInterruptController34000000,
    IOInterruptController34000000
);
IOInterruptSpecifiers =     (
    <03000000>,
    <26000000>,
    <04000000>,
    <24000000>
);
IOMatchCategory = AppleD1815PMUPowerSource;
IOPowerManagement =     {
    CurrentPowerState = 2;
    DevicePowerState = 2;
    MaxPowerState = 2;
};
IOProbeScore = 0;
IOProviderClass = AppleD1815PMU;
InstantAmperage = 0;
IsCharging = 0;
Location = 0;
Manufacturer = A;
MaxCapacity = 1275;
Model = "0003-A";
Serial = REDACTED;
Temperature = 2590;
TimeRemaining = 0;
UpdateTime = 1461830702;
Voltage = 4182;
"battery-data" =     {
    "0003-default" = <...>;
    "0004-default" = <...>;
    "0005-default" = <...};
"built-in" = 1;
}

UIDeviceListener支持常规的非越狱iOS设备,不会调用任何私有API。

答案 1 :(得分:0)

GPS每小时需要10%的电池,因此每秒一次的高精度位置记录将持续约10小时。位置轮询intervall与电池消耗无关。 GPS芯片是否启用。没有低功耗gps模式!!如果你知道用户不需要它,你可以禁用gps。

对于位置数据的永久记录,如果您决定使用低精度(1000米蜂窝塔或wlan定位)而不是高(3-6m = GPS),则只能节省电池

当然,在测量过程中,你会杀死所有的3D派对应用程序,尤其是信使应用程序,最着名的应用程序每秒都会连接到互联网!

答案 2 :(得分:0)

我无法就在iOS上进行功率测量提出建议,但可以指出一些可能的功耗来源,并指出在进行测量时需要考虑的一些问题。

过度耗电的常见原因:

  • 轮询而不是使用中断。这可以防止处理器进入低功耗状态。低功耗状态可以将处理器功耗降低一个数量级

  • 使用太小的中断间隔。一个常见的错误是认为较小的轮询间隔(例如10毫秒)会导致更快的响应。如果你的应用程序/用户的响应能力是500毫秒,那么10毫秒只会让处理器保持清醒并咀嚼能量。

  • 任何传播的东西都是生猪,接收的不多,但仍然不好(如上所述,WiFi,GPS,蓝牙等)。尽量减少使用。

  • 外围设备也具有低功耗状态。谨慎使用它们使它们处于低功率状态。

关于测量功耗的评论:

  • 监控本身会导致功耗过大。监控功率非常棘手。监控使用中断或轮询,使处理器/设备保持唤醒状态并处于高功率状态。

  • 大多数监控来自操作系统,可能是也可能不是来自“真正的”硬件测量与SW“猜测”。

  • 尝试真正准确的意味着更频繁的测量,导致您猜对了处理器和设备保持清醒。

我建议你仔细看看你真正需要的采样间隔,并设计你的应用程序,让处理器和设备尽可能地休息。