用户对 App 耗电的感知很直接——用完某个 App 手机发烫、掉电快,用户第一反应就是卸载。iOS 系统的电池统计可以显示每个 App 的耗电占比,但定位到具体代码层面的耗电原因需要更细致的分析工具。
iOS 耗电的主要来源
App 的能耗主要来自几个模块。CPU 高负载会让设备发热,常见原因包括死循环、频繁的定时器任务和大量 JSON 解析。GPU 渲染压力主要在游戏和图形类应用中体现,复杂的 Shader 和过度的绘制层会增加能耗。网络请求的耗电也很可观,尤其在弱网环境下,蜂窝数据模块的功耗会比 Wi-Fi 高很多。
定位模块(GPS)是高耗电大户。持续使用精确定位的 App 的耗电强度很高。后台唤醒频繁也是常见问题——App 被切到后台后反复被系统拉起执行任务,设备无法进入休眠状态。
Xcode Energy Log
Xcode 的 Energy Log 模板可以检测能耗。在 Instruments 里选择 Energy Log,运行 App 后记录能耗数据。Energy Log 会将消耗分为高、中、低三档。日志里会标注哪些操作触发了高能耗——比如 GPS 持续使用、后台活动或者 CPU 长时间满载。
Energy Log 的问题是不够精细,只显示能耗等级变化,难以定位到具体的函数或模块。
KeyMob 能耗监控的功能
KeyMob 的能耗监控模块提供了更细致的硬件级分解。在性能图表里勾选"App能耗监控",工具会实时显示 App 的能耗曲线。数据按硬件模块分类:CPU、GPU 和网络等分别展示各自的耗电占比。
如果能耗主要来自 Overhead 部分,说明系统调用和进程切换太多,需要检查后台服务的唤醒频率。Location 耗电高表示 GPS 或 WiFi 定位模块使用过频,可以优化地理围栏的检测间隔。Networking 耗电高意味着数据传输量大,可以考虑启用数据压缩或减少非必要请求。CPU 和 GPU 耗电则对应着计算逻辑和渲染性能的优化空间。
配合使用记录模块,可以看到 App 过去的使用历史——每个 App 的启动时间、运行时长和使用了哪些硬件资源。结合能耗数据和运行时长来判断异常耗电:某 App 跑了两小时但主要都在后台活动,且能耗曲线很高,说明后台行为可能需要优化。
优化方向
根据能耗数据定位到具体模块后,优化的方向就比较明确了。CPU 方面减少无意义的轮询和定时器、避免主线程做大量计算、使用后台 BLE 或推送取代网络轮询。GPU 方面减少视图层级,避免离屏渲染。网络方面请求合并、启用数据压缩、控制后台数据同步的频率。定位方面在不需要时关闭精确定位,使用 region monitoring 替代持续定位。
建议
能耗优化不像性能优化那样改动一个点马上能看到 FPS 提升,更多是持续积累的改进。每次版本迭代时跑一次 KeyMob 的能耗监控,保存数据对比前后变化,逐步减少 App 的耗电。