iOS 电量报告分析

一、这份报告是什么

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"
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 前言-理论篇 耗电量分析是衡量应用性能表现的一个重要指标,要做好一款app,不仅仅是实现功能,我们需要考虑很多性能...
    繁星mind阅读 11,044评论 2 25
  • 01 | App启动性能分析 基本的测试checklist和手段 专项测试(用户维度) 崩溃(Crash,弱网) ...
    提摩太_e9ec阅读 803评论 0 1
  • 电池续航时间是移动用户体验中最重要的一个方面。没电的设备完全无法使用。因此,对于应用来说,尽可能地考虑电池续航时间...
    闫回阅读 612评论 0 1
  • 卡顿原因 人眼能感觉到的帧率是每秒24帧,而屏幕每16毫秒会刷新一次,也就是每秒会刷新60次。当每秒刷新次数少于6...
    Archer_J阅读 3,185评论 0 16
  • 最近观看 WWDC 2020 关于电量和性能调试的 session: Diagnose performance i...
    uniapp阅读 2,490评论 0 6

友情链接更多精彩内容