William

不管走了多远都不要忘记为什么出发

0%

使用iOS诊断进行iOS电量测试

  长久以来iOS上的电量测试相关信息都是很单一,唯一能获取电量详细信息的私有接口也在iOS9中被苹果官方封掉了。传统方案获取电量的路几乎在新的系统版本下被堵死,使得我们不得不寻求新的电量获取方式。

什么是iOS Diagnostics

  iOS diagnostics 是iOS本身自带的诊断系统,在这个诊断系统中包含电量的相关信息记录,这些信息以Sqlite的形式保存,并定期传给苹果服务器,以供苹果相关人员分析。由此可以通过读取iOS系统记录的数据来进行电量测试,这个数据由iOS系统提供,并且记录了每个app的耗电量,故可以得到比较准确的耗电量信息。

如何通过诊断测试具体的耗电量

测试过程中需要注意的点

  • 为保证测试的准确性尽量不要开启其他应用(系统应用除外)

  • 记录下操作时间和对应的业务场景(用于还原业务对应的耗电量)

  • 最好使用iOS10及以上的设备(便于收集电量数据)

    iOS10及以上的设备

  1. 使用开发者账号下载profile证书,链接。通过Airdrop安装到手机上。
    1. 正常进行测试,记录下业务场景对应时间点。
    2. 静置半个小时左右,通过iTunes同步到电脑。
      在电脑上对应的目录如下:

macos:~/Library/Logs/CrashReporter/MobileDevice/[Your_Device_Name]/

Windows:C:\Users\[Your_User_Name]\AppData\Roaming\AppleComputer\Logs\CrashReporter\MobileDevice\ [Your_Device_Name]\

  1. 电量数据库以”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
2
3
4
5
6
7
8
static NSDateFormatter *cachedDateFormatter =nil;
+ (NSDateFormatter *)cachedDateFormatter {
if(!dateFormatter){
dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat: @“YYYY-MM-dd HH:mm:ss”];
}
return dataFormatter;
}

2. 不要频繁的刷新页面,尽量不要使用reloadData。

3. 图片处理

  • 图片与imageView相同大小,避免多余运算
  • 可以使用整幅的图片,增加应用体积,但是节省CPU消耗
  • 可调整大小的图片,可以省去一些不必要的空间
  • CALayer,CoreGraphics,甚至OpenGL来绘制,消耗CPU

    4. 选择正确的集合

  • NSArray,使用index来查找很快(插入和删除很慢)
  • 字典,使用键来查找很快
  • NSSets,是无序的,用键查找很快,插入/删除很快

    5. 懒加载,不要一次性创建所有的subview,而是需要时才创建

    6. 进行必要的缓存

    7. 尽量减少透明或者半透明,会产生额外的运算

如果对你有帮助,欢迎赞赏。