耗电
耗电(Energy Consumption)是移动应用质量的重要指标之一。一款耗电过快的App会直接影响用户的续航体验,轻则被用户吐槽,重则被系统标记为"耗电大户"(在iOS的"设置 → 电池"中显示),最终被用户卸载。 本系列文章从iOS功耗模型入手,系统性地介绍耗电问题的原理、检测、优化与治理。 为什么要关注耗电 iOS设备的电池容量有限(iPhone通常在3000~5000mAh),而应用的功耗会直接影响续航时间。苹果在iOS 8之后提供了"电池用量"统计入口,用户可以清楚地看到每个App消耗的电量比例。 常见的耗电投诉场景: 场景 用户感知 典型原因 后台待机一晚电量掉20% 手机放着不用也掉电 后台定位、后台音频、后台Fetch未合理释放 App使用1小时电量掉30% 使用过程电量下降过快 CPU长时间高占用、高频网络请求、GPU密集渲染 手机发烫 设备温度异常升高 CPU/GPU长期满载、持续定位、频繁屏幕唤醒 被系统标记为"后台活动"过高 系统提示"此App正在消耗大量电池" 后台任务未合理调度,违反能效规则 苹果对"耗电"非常敏感——从iOS 9开始引入低电量模式(Low Power Mode),从iOS 13开始加强后台任务的能效审查(BackgroundTasks框架),从iOS 15开始通过MetricKit将功耗数据开放给开发者。 iOS功耗模型概述 iOS设备的功耗来源可以分为以下几大类: flowchart TB Battery["电池总功耗"] Battery --> CPU["CPU计算、编解码"] Battery --> GPU["GPU渲染、图层合成"] Battery --> Screen["屏幕显示、亮度、刷新率"] Battery --> Network["网络蜂窝、WiFi、BLE"] Battery --> Location["定位GPS、基站、WiFi定位"] Battery --> Sensor["传感器加速度计、陀螺仪、气压计"] Battery --> Audio["音视频录制、播放、相机"] Battery --> Storage["存储磁盘IO"] Battery --> IO["外设蓝牙、NFC、UWB"] 不同硬件模块的功耗量级差异很大。参考苹果WWDC的数据,定位和蜂窝数据通常是"耗电大户",屏幕是"持续耗电大户",而CPU/GPU在计算密集时瞬时功耗最高。 模块 典型功耗等级 特点 屏幕 持续高 只要亮屏就持续耗电 蜂窝数据 高 搜索基站、维持连接都耗电 GPS定位 高 冷启动搜星耗电特别明显 CPU/GPU 中~高 计算量决定功耗 WiFi 中 比蜂窝省电 蓝牙(BLE) 低 低功耗蓝牙专为续航优化 传感器 低~中 高频采样会显著增加功耗 耗电问题的本质 耗电问题的本质可以用一个简单的公式表示: ...