iOS 耗电量优化

本文深入探讨了iOS应用的电量优化,从耗电量概念到节省电量的基本原则,再到耗电大户的识别。介绍了通过眼观、Xcode的EnergyLog工具和系统级别日志解析进行电量测试的方法,并详细解析了电量信息数据库中的关键表和参数,为开发者提供了电量优化的实用指南。
摘要由CSDN通过智能技术生成

iOS 耗电量优化

前言: 在电量排行榜没出之前, 用户对单个应用的耗电情况几乎是无感的, 随着Apple推出的电量排行榜, 让iPhone用户更加关注应用耗电量的问题, 如果电量排行TOP10 中有你的应用的话, 轻者投诉, 重者卸载, 这也让开发者不得不重视应用耗电量的问题了

1. 耗电量概念

在这里插入图片描述

x 轴为时间,y 轴为电量消耗的坐标图

  • Idle 表示app处于休眠状态,几乎不使用电量。
  • Active状态说明app处于工作状态,用电量比较高,图中的第二个 Active 的耗电远高于第一个,这是因为app所做的工作类型不同而导致的。
  • Overhead指的是调起硬件来支持app功能所消耗的电量,这部分是支持硬件工作必要的电量消耗。
  • 图中横线以下所包区域是固定开销(Fixed Cost),横线以上区域是动态开销(Dynamic cost)。

2. 节省电量的基本原则

  • 识别:想清楚你需要app在特定时刻需要完成哪些工作,如果是不必要的工作,考虑延后执行或者省去。
  • 优化:优化app的功能实现,尽可能以更有效率的方式去完成功能。
  • 合并:不需要立刻获取,可以延后合并执行,比如合并网络
  • 减少:在满足需求的基础上,尽量减少做重复工作的频率.

3. 耗电大户

  • 网络: app进行网络通信时,蜂窝数据和Wi-Fi等元器件开始工作就会消耗大量电能,应减少数据传输,合并网络请求,适当的网络延时等。
  • 定位: app为了记录用户的活动或者提供基于位置的服务会进行定位。定位精度越高,定位时间越长,消耗电量也就越多。
  • CPU: app做的每件事几乎都需要用CPU,所以CPU是电能消耗大户,高CPU使用时会迅速消耗掉用户的电池电量,所以我们要更合理的使用CPU,降低能耗
  • 传感器和蓝牙: 长时间用不上加速度计、陀螺仪、磁力计等设备的动作数据时,应该停止更新数据,不然也会浪费电能。应按需获取,用完即停。蓝牙活动频度太高会消耗电能,应该尽量分批、减少数据轮询等操作

4. 电量测试 – 眼观

简单的耗电量测试, 将手机电量控制在固定的位置, 同时控制其他可能会影响测试结果的因素, 如 wifi, 蓝牙, 屏幕亮度等等, 通过执行相应的操作后, 来观察iPhone的掉电量, 或者用程序取出当前剩余电量([UIDevice currentDevice].batteryLevel). 这种测试方法比较简单, 如果非常明显的耗电问题, 还是可以发现的, 但是如果不是非常明显的问题, 没有具体的数据支撑, 还是没办法处理的.

5. 电量测试 – Xcode 测试耗电量

xcode自带了耗电量测试工具instruments->Energy Log,可以测试电量,测试方法与粗放的耗电量测试基本类似,不同的是,测试的时候,它需要手机上选择开发者——Logging——Energy,选择Start Recording就可以测试了。一段时间以后再stop,再用手机连接到电脑的instrument上,import记录就可以了。这种方法得到的是一个耗电等级,能一定程度放反应耗电量状况,但是同样的,没有具体的电流电压数据。

Energy Impact 中不同颜色带包的含义

Energy Impact会实时展示电量消耗,每个柱子代表每秒的电量消耗,通过每个柱子由不同的颜色组成,展示各部分电量消耗的比例,依次是Overhead(红色)、CPU(蓝色)、网络(深黄)、定位(淡黄)、GPU(绿色)、后台(深灰)、前台(淡灰)、Suspend(白色)。

6. 电量测试 – 系统级别日志解析

私有api获取电量信息可以参考越狱/私有API获取电量信息, 这里略过, 主要分析系统存储的数据库

**私有API获取的部分参数解释: **

CurrentCapacity : 当前剩余电量

FullCharged: 是否满电量

isCharging: 是否正在充电

MaxCapacity: 最大电池容量

Voltage: 当前电压

iphone 电池工作电压基本在4v左右,

1. 获取数据库方法

1. 登录Apple开发者网站[](https://developer.apple.com/documentation/)
2. 选择最底部菜单栏下的 support 下边的 Feedback & Bug Reporting
3. 进入页面后选择 Profiles and Logs
4. 进入到下级页面中选择 'Battery Life for iOS', 后边有证书和说明, 按照说明安装证书即可
5. 安装后, 将设备同步到电脑, 在"~/Library/Logs/CrashReporter/MobileDevice/[Your_Device_Name]/"下查找.PLSQL 或者PLSQL.gz 文件.

2. 根据表二中对数据库中的表明解释, 选择合适的表开始进行数据分析

1. 根据表PLBatteryAgent_EventBackward_BatteryUI 绘制测试期间的电池百分比数据.

说明:电量百分比数据,每 20 秒一条数据,

字段说明:

ID: 主键,
timestamp: 时间戳,
IsCharging: 是否在充电,
Level: 剩余电量百分比

2. 根据PLAccountingOperator_EventNone_Nodes 确认目标应用的节点号

说明: App 结点信息,每个 APP 对应唯一的结点号。用来确定手机内具体哪个 App

字段说明:

ID: 节点号码
timestamp: 时间戳, 猜测应该是应用的初次安装时间
IsPermanent: 是否是永久居民, 猜测应该是代表是都未系统级的应用
Name: boundle identifier

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MBbskPtf-1616947306239)(./imgs/Snip20201220_2.png)]

3. 根据PLApplicationAgent_EventForward_Application 获取app状态信息

表说明: App 运行信息,记录每个 App 在哪个时间段以什么状态运行

字段说明:

ID: 应该是存储数据时候的主键
timestamp: 时间戳
identifier: 应用标识
pid: 猜测应该是进程ID
state: 运行状态 --> 1,2,4,8, 不知道对应的是什么状态
reason: 猜测应该是系统掉起还是用户调起的, --> 0,1

因为没有官方的文档说明, 部分字段基本靠猜测, 等绘制完图标的继续观察字段含义

4. 根据PLAppTimeService_Aggregate_AppRunTime 获取app的运行时长

表说明: APP 的运行时长统计,每个运行过的 APP,一小时一条数据

字段说明: 基本靠猜

ID: 主键
timestamp: 时间戳
BackgroundTime: 后台运行时长
screenOnTime: 前台运行时长
BundleID: 标识符

5. 根据PLAccountingOperator_Aggregate_RootNodeEnergy 获取app使用的详细信息

表说明: APP 的电量详细数据,记录每个 APP 的CPU\GPU\DRAM\ISP 等的耗电信息。一小时更新一次数据。

7. 参数列表及说明

表一: 电量信息数据库中部分表名及说明:

表明描述
PLBatteryAgent_EventBackward_BatteryUI电量百分比数据, (数据显示每5分钟采集一次)
PLBatteryAgent_EventBackward_Battery整台机器的电量数据,包含电流、电压、温度等,每 20 秒 左右一条数据
PLIOReportAgent_EventBackward_EneryModel整机的详细电量数据。包含 CPU\GPU\DRAM\ISP 等关键信息。每半小时到一小时一条数据
PLAccountingOperator_EventNone_NodesApp 结点信息,每个 APP 对应唯一的结点号。用来确定手机内具体哪个 App
PLApplicationAgent_EventForward_ApplicationApp 运行信息,记录每个 App 在哪个时间段以什么状态运行
PLAppTimeService_Aggregate_AppRunTimeAPP 的运行时长统计,每个运行过的 APP,一小时一条数据
PLAccountingOperator_Aggregate_RootNodeEnergyAPP 的电量详细数据,记录每个 APP 的CPU\GPU\DRAM\ISP 等的耗电信息。一小时更新一次数据。
PLAccountingOperator_EventNone_AllApps手机中安装的所有 App 的信息
PLBatteryAgent_EventForward_LightningConnectorStatus Lighting接口连接状态。
PLBatteryAgent_EventNone_BatteryConfig电池的配置信息。包括电池容量、循环计数、电池寿命、电池温度等信息
PLBatteryAgent_EventNone_BatteryShutdown电池导致的意外关机记录。
PLCameraAgent_EventForward_Camera相机使用记录。记录了相机类型和使用相机的 App
PLConfigAgent_EventNone_Config本机的一些配置信息和一些系统设置
PLDisplayAgent_Aggregate_UserTouch屏幕点击计数。每 15 分钟记录一条数据
PLDisplayAgent_EventForward_Display屏幕亮度信息。包括流明、尼特、亮度滑竿值等信息。
PLProcessNetworkAgent_EventPoint_Connection网络连接记录。记录了发起网络连接的 App、地址、端口等信息
PLXPCAgent_EventPoint_CacheDelete清除缓存的记录。包括申请的空间大小、清除缓存的耗时、清除的缓存大小、服务名称、紧急程度等信息。

计算电量的时候注意: 表中的 Energy 就是对应消耗的电量了,这里的单位在 iOS 9 是 mAh,iOS 9 及以上应该是 1/1000 mAh

表二: RootNodeID硬件对照表

在这里插入图片描述

namedescription
ISP影像处理器
display显示
VENC视频编码器
DRAM内存 (动态随机访问存储器)
Torch手电筒D
AudioHeadset头戴式耳机
AudioSpeaker扬声器
FrontCamera前摄像头
backCamera后摄像头
AudioCodec音频编译码器
BB基带(Base-Band)
BB-Voice基带话音信道
SOCsystem on a chip 片上系统

表三: iPhone 电池容量对照表

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值