我目前的项目是一个持续存在的应用程序(想想Tinder或Foursquare),电池消耗是通过屋顶。我们认为主要的功耗是GPS和WiFi天线。我们希望能够在几种不同的配置下测量我们的应用程序的能源使用情况。
但是怎么做?我们想要一个过程:
我知道这个清单。
这些是要求,以下是我所知道的选项:
1。打开iOS设备上不受限制的能量诊断记录,并导出到仪器
这是一个明显的答案,但它有一个巨大的缺陷。
优点:
缺点:
2。通过仪器监控插入式电话
优点:
缺点:
第3。使用公共Cocoa API在我们的应用程序中记录能源使用情况 - [UIDevice.currentDevice batteryLevel]
这是SO上最常见的答案。我看过Estimated battery time on iOS,iphone: Calculating battery life和其他十几个人。
优点:
缺点:
4。使用私有Cocoa API记录能源使用情况
由于我们在开发过程中只会这样做,因此Apple拒绝使用私有API的应用程序并不重要。据推测,有一些私有API,因为Apple能够在打开Untethered Energy Diagnostics的情况下记录数据。
优点:
缺点:
5。综合方法
我们可以使用不受限制的诊断来量化每个动作的边际能量成本。 “好吧,旋转GPS天线需要150mW•H。计算位置需要50mW•H。发送Mixpanel事件需要25mW•H,除非我们在之前的30秒内进行了另一次网络呼叫,在这种情况下需要15mW•H。” (当场发明的所有数字。)然后我们可以使用系留监控来记录每个动作何时发生,插入线性方程,并估算它应该的能量。 已经采取。
优点:
缺点:
无论如何,我已经足够了。有没有人这样做过?怎么样?
答案 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“猜测”。
尝试真正准确的意味着更频繁的测量,导致您猜对了处理器和设备保持清醒。
我建议你仔细看看你真正需要的采样间隔,并设计你的应用程序,让处理器和设备尽可能地休息。