一、这份报告是什么
iOS 系统会定期生成 log-power 类型的诊断报告,记录一段时间内设备上所有 App 的电量、性能数据。你可以在「设置 → 隐私与安全 → 分析与改进 → 分析数据」里找到它。
文件结构是一个大 JSON,分两层:
- 第一层:全局设备信息(头部字段)
-
第二层:
metrics数组,每个元素是一个 App 的详细数据
二、全局字段:在哪里看设备信息和整体电量
打开文件最开头,你会看到:
{"bug_type":"278","os_version":"iPhone OS 18.5 (22F76)"}
{
"energy_consumed" : 13103781,
"log_timestamp" : "2026-03-06T14:06:09+0000",
"hangtracer_enabled" : 1000,
"init_count" : 2,
"gms_opt_in" : false,
"machine_config" : "iPhone14,5",
"language" : "zh-Hans-CN",
"total_drain" : 157,
"os_variant" : 0,
"plugged_in_duration" : 16021,
"region_format" : "001",
"os_version" : "iPhone OS 18.5 (22F76)",
"log_version" : 13,
"metrics" : [ ... ]
}
逐字段解读
| 字段 | 含义 | 本次数据 | 怎么理解 |
|---|---|---|---|
bug_type |
报告类型,278 = 电量报告 | 278 | 固定值,确认这是电量报告 |
machine_config |
设备型号 | iPhone14,5 | 即 iPhone 13 |
os_version |
系统版本 | iPhone OS 18.5 (22F76) | iOS 18.5 |
log_timestamp |
报告生成时间(UTC) | 2026-03-06T14:06:09 | 北京时间 22:06:09 |
energy_consumed |
采集周期内整机总能耗 | 13,103,781 | 苹果内部能耗单位,越大越耗电 |
total_drain |
采集周期内总电量消耗 | 157 | 单位是百分之一,即消耗了 1.57% 电量 |
plugged_in_duration |
充电时长(秒) | 16,021 | 约 4.5 小时处于充电状态 |
hangtracer_enabled |
卡顿检测阈值(ms) | 1000 | 主线程阻塞超过 1000ms 记录为 hang |
init_count |
报告初始化次数 | 2 | 通常为重启次数 |
language |
设备语言 | zh-Hans-CN | 简体中文 |
log_version |
报告格式版本 | 13 | — |
是否在充电:plugged_in_duration: 16021 说明采集周期内有 4.5 小时在充电,但不区分具体哪段时间。每个 App 的 app_time 里有 fg_unplugged(前台非充电时长)和 fg_total(前台总时长),两者的差值就是前台充电时长,可以间接判断。
三、App 级字段:在哪里看每个 App 的数据
metrics 数组里每个元素代表一个 App,结构如下:
App 基本信息
├── power_metrics(电量相关)
│ ├── app_energy ← 在这里看能耗
│ ├── app_time ← 在这里看时长、CPU/GPU、定位、信号
│ ├── network_io ← 在这里看网络流量
│ └── display_apl ← 在这里看屏幕帧数和亮度
└── performance_metrics(性能相关)
├── memory ← 在这里看内存
├── disk_io ← 在这里看磁盘读写
└── app_performance ← 在这里看卡顿、掉帧、启动、退出
├── hang ← 卡顿
├── animation ← 掉帧
├── launch ← 启动
├── resume ← 恢复
└── processExits ← 进程退出原因
四、实战案例:喜马拉雅分析
4.1 App 基本信息
"app_bundleid" : "com.gemd.iting",
"app_version" : "9.3.21",
"app_build_version" : "9.3.21",
"app_distributorid" : "com.apple.AppStore"
喜马拉雅 v9.3.21,从 App Store 安装。
4.2 在哪里看时长 → app_time
"app_time" : {
"GPU" : 3, // GPU 使用时长(秒)
"CPU" : 3017, // CPU 使用时长(秒)
"fg_total" : 313, // 前台总时长(秒)
"fg_unplugged" : 313, // 前台非充电时长(秒)
"bg_total" : { // 后台总时长
"audio" : 10199, // 其中音频播放时长(秒)
"location_audio" : 0, // 定位+音频时长
"total" : 14289, // 后台总计(秒)
"location" : 0 // 定位时长
},
"bg_unplugged" : { // 后台非充电时长(结构同上)
"audio" : 10199,
"location_audio" : 0,
"total" : 14289,
"location" : 0
},
"cellular_condition" : { // 蜂窝信号分布(秒)
"signalBarUnknown" : 0,
"signalBar0" : 14540, // 无信号
"signalBar1" : 306, // 1 格
"signalBar2" : 22, // 2 格
"signalBar3" : 0, // 3 格
"signalBar4" : 0 // 满格
}
}
怎么读
| 你想知道的 | 看哪个字段 | 喜马拉雅的值 | 分析 |
|---|---|---|---|
| 用户前台用了多久 | fg_total |
313 秒(约 5 分钟) | 前台使用时间很短 |
| 前台是否在充电 |
fg_total - fg_unplugged
|
313 - 313 = 0 | 前台期间没有充电 |
| 后台跑了多久 | bg_total.total |
14,289 秒(约 4 小时) | 后台时间是前台的 45 倍 |
| 后台在干嘛 | bg_total.audio |
10,199 秒(约 2.8 小时) | 主要在后台播音频 |
| 后台非音频时长 |
bg_total.total - bg_total.audio
|
4,090 秒(约 1.1 小时) | 有 1 小时后台没播音频但 App 还活着 |
| CPU 忙了多久 | CPU |
3,017 秒(约 50 分钟) | 后台 4 小时里 CPU 活跃了 50 分钟,占比 21%,偏高 |
| GPU 忙了多久 | GPU |
3 秒 | 几乎没有 GPU 开销,正常(音频 App 不需要 GPU) |
| 蜂窝信号好不好 | cellular_condition |
signalBar0 占 97.8% | 几乎全程无蜂窝信号,在 WiFi 环境下 |
4.3 在哪里看能耗 → app_energy
"app_energy" : {
"bg_audio" : { // 后台音频能耗
"10" : 32554,
"6" : 98819,
"4" : 28936,
"2" : 60069,
"7" : 542765
},
"bg" : { // 后台非音频能耗
"10" : 13054,
"6" : 39628,
"4" : 11603,
"2" : 24088,
"7" : 217659
},
"fg" : { // 前台能耗
"7" : 16659,
"3" : 258,
"4" : 945,
"1" : 33888,
"6" : 3034,
"2" : 2726,
"10" : 2120
},
"total" : { // 总能耗
"7" : 777084,
"3" : 258,
"4" : 41485,
"1" : 33888,
"6" : 141482,
"2" : 86884,
"10" : 47729
}
}
怎么读
app_energy 里的数字键(1、2、3、4、6、7、10 等)是苹果内部的能耗类型编号,苹果没有公开文档说明每个编号的含义,但从数据规律可以推断:
- 值越大代表该类型能耗越高
- 不同 App 出现的编号不同,取决于它使用了哪些硬件资源
关键看法:不需要纠结每个编号的含义,重点看四个场景的对比:
| 场景 | key 7 的值 | 占 total 比例 | 说明 |
|---|---|---|---|
| bg_audio(后台音频) | 542,765 | 69.8% | 后台音频播放是能耗大头 |
| bg(后台非音频) | 217,659 | 28.0% | 后台非音频能耗占了近三成 |
| fg(前台) | 16,659 | 2.1% | 前台只用了 5 分钟,能耗低是正常的 |
| total(总计) | 777,084 | 100% | — |
4.4 在哪里看网络流量 → network_io
"network_io" : {
"cellular" : {
"totalUpload" : 0, // 蜂窝上传(字节)
"totalDownload" : 0 // 蜂窝下载(字节)
},
"wifi" : {
"totalUpload" : 10665383, // WiFi 上传(字节)
"totalDownload" : 202980783 // WiFi 下载(字节)
}
}
怎么读
| 你想知道的 | 计算方式 | 喜马拉雅的值 | 分析 |
|---|---|---|---|
| WiFi 下载量 |
wifi.totalDownload ÷ 1048576 |
193.5 MB | 2.8 小时音频约需 80MB(64kbps),多出 100+MB |
| WiFi 上传量 |
wifi.totalUpload ÷ 1048576 |
10.2 MB | 上传量偏大,可能是埋点/日志上报 |
| 蜂窝流量 | cellular.* |
全部为 0 | 没走蜂窝,和信号 97.8% 无信号吻合 |
4.5 在哪里看屏幕帧数和亮度 → display_apl
"display_apl" : {
"totalFrameCount" : 18823, // 总渲染帧数
"averagePixelLuminance" : 67 // 平均像素亮度(0-255)
}
怎么读
-
totalFrameCount:App 在前台期间总共渲染了多少帧。喜马拉雅前台 313 秒渲染了 18,823 帧,约 60 FPS,说明前台界面一直在刷新 -
averagePixelLuminance:平均像素亮度 67/255 ≈ 26%,偏暗,说明可能用了深色模式或界面本身偏暗,对 OLED 屏幕来说是省电的
4.6 在哪里看内存和磁盘 → performance_metrics
"performance_metrics" : {
"disk_io" : {
"totalWrites" : 587624448, // 磁盘写入(字节)
"totalReads" : 3789922304 // 磁盘读取(字节)
},
"memory" : {
"average" : 119685864, // 平均内存占用(字节)
"peak" : 259261736 // 峰值内存占用(字节)
}
}
怎么读
| 你想知道的 | 字段 | 喜马拉雅的值 | 分析 |
|---|---|---|---|
| 平均内存 |
memory.average ÷ 1048576 |
114 MB | 音频 App 来说偏高 |
| 峰值内存 |
memory.peak ÷ 1048576 |
247 MB | 峰值是平均的 2.2 倍,存在内存尖峰 |
| 磁盘读取 |
disk_io.totalReads ÷ 1073741824 |
3.53 GB | 非常大,可能频繁读缓存或数据库 |
| 磁盘写入 |
disk_io.totalWrites ÷ 1048576 |
560 MB | 偏高,可能在持续写缓存或日志 |
4.7 在哪里看卡顿 → app_performance.hang
"hang" : {
"count" : 17, // 卡顿总次数
"sessions" : [ // 每次卡顿的时长(ms)
250, 250, 260, 260, 280,
290, 290, 290, 290, 300,
330, 360, 440, 510, 570,
570, 1790
]
}
怎么读
-
count:主线程阻塞超过阈值(本报告阈值为全局字段hangtracer_enabled: 1000,但实际记录了 250ms 起的卡顿)的次数 -
sessions:每次卡顿的持续时长,单位毫秒,从小到大排列
| 统计 | 值 | 说明 |
|---|---|---|
| 总次数 | 17 次 | 前台只用了 5 分钟就卡了 17 次 |
| 最短 | 250 ms | 轻微卡顿 |
| 最长 | 1,790 ms | 接近 2 秒的严重卡顿 |
| 平均 | 约 400 ms | — |
| 卡顿频率 | 约每 18 秒一次 | 体验很差 |
发现的问题:
- 5 分钟前台 17 次 hang,平均每 18 秒卡一次
- 最长一次 1.79 秒,用户会明显感知到界面冻住
- 说明主线程有阻塞操作,可能是同步网络请求、大文件读写、或数据库查询在主线程
4.8 在哪里看掉帧 → app_performance.animation
"animation" : {
"scrollCount" : 332, // 滚动操作次数
"scrollDuration" : 185874, // 滚动总时长(ms)
"glitchCount" : 28, // 掉帧次数
"glitchDuration" : 653, // 掉帧总时长(ms)
"glitchTimeRatio" : 3 // 掉帧时间占比(%)
}
怎么读
| 你想知道的 | 字段 | 喜马拉雅的值 | 分析 |
|---|---|---|---|
| 用户滚动了多少次 | scrollCount |
332 次 | 5 分钟滚了 332 次,操作频繁 |
| 滚动总时长 |
scrollDuration ÷ 1000 |
186 秒(约 3 分钟) | 前台 5 分钟里有 3 分钟在滚动 |
| 掉帧次数 | glitchCount |
28 次 | — |
| 掉帧率 | glitchTimeRatio |
3% | 还算可接受,但结合 17 次 hang 来看主线程确实有问题 |
4.9 在哪里看进程退出原因 → app_performance.processExits
"processExits" : {
"bg" : {
"cumulativeNormalAppExitCount" : 1
}
}
怎么读
| 退出类型 | 含义 | 喜马拉雅 |
|---|---|---|
cumulativeNormalAppExitCount |
正常退出(用户主动关闭或系统正常回收) | bg: 1 次 |
cumulativeBackgroundTaskAssertionTimeoutExitCount |
后台任务超时被系统杀掉 | 无(但同报告中另一个 App 有) |
cumulativeMemoryPressureExitCount |
内存压力被杀 | 无 |
cumulativeAppWatchdogExitCount |
看门狗超时被杀 | 无 |
喜马拉雅只有 1 次正常后台退出,没有异常退出,说明没有被系统强杀。
4.10 在哪里看启动和恢复 → app_performance.resume
"resume" : {
"count" : 1,
"sessions" : [ 145 ]
}
-
count:App 从后台恢复到前台的次数 -
sessions:每次恢复耗时(ms)
喜马拉雅恢复了 1 次,耗时 145ms,速度正常。
五、快速查阅表:我想看 XX 去哪里找
| 我想看 | 在哪里找 | 字段路径 |
|---|---|---|
| 设备型号 | 全局头部 | machine_config |
| 系统版本 | 全局头部 | os_version |
| 总电量消耗 | 全局头部 |
total_drain(单位:百分之一) |
| 充电时长 | 全局头部 |
plugged_in_duration(秒) |
| App 前台时长 | App → power_metrics |
app_time.fg_total(秒) |
| App 后台时长 | App → power_metrics |
app_time.bg_total.total(秒) |
| 后台音频时长 | App → power_metrics |
app_time.bg_total.audio(秒) |
| 后台定位时长 | App → power_metrics |
app_time.bg_total.location(秒) |
| 是否在充电 | App → power_metrics |
fg_total - fg_unplugged = 前台充电时长 |
| CPU 使用时长 | App → power_metrics |
app_time.CPU(秒) |
| GPU 使用时长 | App → power_metrics |
app_time.GPU(秒) |
| 蜂窝信号质量 | App → power_metrics |
app_time.cellular_condition.signalBar0~4(秒) |
| 定位精度使用 | App → power_metrics |
app_time.location_activity.*(秒) |
| 能耗分布 | App → power_metrics | app_energy.fg / bg / bg_audio / total |
| WiFi 流量 | App → power_metrics |
network_io.wifi.totalUpload/Download(字节) |
| 蜂窝流量 | App → power_metrics |
network_io.cellular.totalUpload/Download(字节) |
| 屏幕帧数 | App → power_metrics | display_apl.totalFrameCount |
| 平均亮度 | App → power_metrics |
display_apl.averagePixelLuminance(0-255) |
| 平均内存 | App → performance_metrics |
memory.average(字节) |
| 峰值内存 | App → performance_metrics |
memory.peak(字节) |
| 磁盘读写 | App → performance_metrics |
disk_io.totalReads/Writes(字节) |
| 卡顿次数和时长 | App → performance_metrics |
app_performance.hang.count / sessions(ms) |
| 滚动掉帧 | App → performance_metrics | app_performance.animation.* |
| 启动耗时 | App → performance_metrics |
app_performance.launch.fg/bg.sessions(ms) |
| 恢复耗时 | App → performance_metrics |
app_performance.resume.sessions(ms) |
| 进程退出原因 | App → performance_metrics | app_performance.processExits.fg/bg.* |
六、喜马拉雅原始数据
{
"app_sessionreporter_key" : "3B130206-D148-4E9E-B449-FBE1834D588D",
"app_build_version" : "9.3.21",
"app_is_beta" : "false",
"app_multiple_versions" : 0,
"app_version" : "9.3.21",
"app_adamid" : 876336838,
"app_arch" : "",
"app_bundleid" : "com.gemd.iting",
"slice_uuid" : "",
"app_storefront" : 143465,
"app_distributorid" : "com.apple.AppStore",
"power_metrics" : {
"network_io" : {
"cellular" : {
"totalUpload" : 0,
"totalDownload" : 0
},
"wifi" : {
"totalUpload" : 10665383,
"totalDownload" : 202980783
}
},
"display_apl" : {
"totalFrameCount" : 18823,
"averagePixelLuminance" : 67
},
"app_energy" : {
"bg_audio" : {
"10" : 32554,
"6" : 98819,
"4" : 28936,
"2" : 60069,
"7" : 542765
},
"bg" : {
"10" : 13054,
"6" : 39628,
"4" : 11603,
"2" : 24088,
"7" : 217659
},
"fg" : {
"7" : 16659,
"3" : 258,
"4" : 945,
"1" : 33888,
"6" : 3034,
"2" : 2726,
"10" : 2120
},
"total" : {
"7" : 777084,
"3" : 258,
"4" : 41485,
"1" : 33888,
"6" : 141482,
"2" : 86884,
"10" : 47729
}
},
"app_time" : {
"GPU" : 3,
"CPU" : 3017,
"bg_unplugged" : {
"audio" : 10199,
"location_audio" : 0,
"total" : 14289,
"location" : 0
},
"fg_total" : 313,
"fg_unplugged" : 313,
"cellular_condition" : {
"signalBarUnknown" : 0,
"signalBar1" : 306,
"signalBar0" : 14540,
"signalBar4" : 0,
"signalBar3" : 0,
"signalBar2" : 22
},
"bg_total" : {
"audio" : 10199,
"location_audio" : 0,
"total" : 14289,
"location" : 0
}
}
},
"performance_metrics" : {
"disk_io" : {
"totalWrites" : 587624448,
"totalReads" : 3789922304
},
"memory" : {
"average" : 119685864,
"peak" : 259261736
},
"app_performance" : {
"resume" : {
"count" : 1,
"sessions" : [ 145 ]
},
"hang" : {
"count" : 17,
"sessions" : [
250, 250, 260, 260, 280,
290, 290, 290, 290, 300,
330, 360, 440, 510, 570,
570, 1790
]
},
"processExits" : {
"bg" : {
"cumulativeNormalAppExitCount" : 1
}
},
"animation" : {
"scrollCount" : 332,
"glitchDuration" : 653,
"glitchCount" : 28,
"scrollDuration" : 185874,
"glitchTimeRatio" : 3
}
}
},
"app_is_clip" : "false"
}