长久以来iOS上的电量测试相关信息都是很单一,唯一能获取电量详细信息的私有接口也在iOS9中被苹果官方封掉了。传统方案获取电量的路几乎在新的系统版本下被堵死,使得我们不得不寻求新的电量获取方式。
什么是iOS Diagnostics
iOS diagnostics 是iOS本身自带的诊断系统,在这个诊断系统中包含电量的相关信息记录,这些信息以Sqlite的形式保存,并定期传给苹果服务器,以供苹果相关人员分析。由此可以通过读取iOS系统记录的数据来进行电量测试,这个数据由iOS系统提供,并且记录了每个app的耗电量,故可以得到比较准确的耗电量信息。
如何通过诊断测试具体的耗电量
测试过程中需要注意的点
- 使用开发者账号下载profile证书,链接。通过Airdrop安装到手机上。
- 正常进行测试,记录下业务场景对应时间点。
- 静置半个小时左右,通过iTunes同步到电脑。
在电脑上对应的目录如下:
macos:~/Library/Logs/CrashReporter/MobileDevice/[Your_Device_Name]/
Windows:C:\Users\[Your_User_Name]\AppData\Roaming\AppleComputer\Logs\CrashReporter\MobileDevice\ [Your_Device_Name]\
- 电量数据库以”Powerlog_”开头,以”.PLSQL”
或者”.PLSQL.gz”结尾。
iOS10以下的设备
提供一个思路:可以通过 mitmproxy + diags://123456拦截接口的形式获得,接口:https://iosdiags.apple.com/ios/TestConfiguration/1.2
电量数据库的解读与分析
表名 | 记录内容 | 使用意义 |
---|---|---|
PLAccountingOperator_EventNone_Nodes | 记录了所有应用的noteID | 得到系统应用和安装应用 |
PLAccountingOperator_Aggregate_RootNodeEnergy | 记录了每个noteID的电量消耗 | 统计各个引用的耗电量 |
PLAppTimeService_Aggregate_AppRunTime | 记录了app的运行状态,一小时记录一次 | 找到被测应用的运行时间段 |
PLBatteryAgent_EventBackward_Battery | 记录了整机的电量变化,20秒记录一次(电压、电流、温度等等 | 详细电量的统计来源 |
PLIOReportAgent_EventBackward_EnergyModel | 记录了IO相关的电量消耗(SoC、DRAM、IPS等等) | 系统底层硬件的耗电量 |
PLSpringBoardAgent_Aggregate_SBNotifications_Aggregat | 记录了推送通知的时间和数量 | 推送对耗电的影响 |
PLLocationAgent_EventForward_ClientStatus | 定位的相关信息 | 定位信息对耗电的影响 |
综合上面的表数据库我们可以精确获取到app在某个时间段的电量消耗,一次记录下操作场景的时间段,之后通过读取数据库的数据,就可以精确获取该场景在该机器上的电量消耗情况。
通过PLAppTimeService_Aggregate_AppRunTim 表获取到app的运行情况,然后根据app运行的情况PLAccountingOperator_Aggregate_RootNodeEne这个表获取到app的电量消耗情况。依据这里的耗电情况算出每个部分的耗电百分比,然后通过PLBatteryAgent_EventBackward_Battery可以获得此事件的详细耗电量(公式:W=UIt)。
iOS诊断耗电量测试总结
首先装上对应的system debug证书,然后开始执行日常测试,记录下哪个时间段对应的是哪个场景,执行测试完成后,取下系统的电量数据库,对该次测试的各个场景的耗电量做一个全面的评价。
电量优化的方案
1. 合理使用NSDateFormatter 和 NSCalendar这种高开销对象
性能测试表明,NSDateFormatter的性能瓶颈是由于NSDate格式到NSString格式的转化,所以把NSDateFormatter创建单例意义不大。推荐的做法是,把最常用到的日期格式做缓存。
1 | static NSDateFormatter *cachedDateFormatter =nil; |