@gracker/smartperfetto 1.0.15 → 1.0.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (156) hide show
  1. package/dist/agent/agents/base/baseAgent.d.ts.map +1 -1
  2. package/dist/agent/agents/base/baseAgent.js +5 -1
  3. package/dist/agent/agents/base/baseAgent.js.map +1 -1
  4. package/dist/agent/context/enhancedSessionContext.d.ts +5 -0
  5. package/dist/agent/context/enhancedSessionContext.d.ts.map +1 -1
  6. package/dist/agent/context/enhancedSessionContext.js +13 -0
  7. package/dist/agent/context/enhancedSessionContext.js.map +1 -1
  8. package/dist/agent/core/conclusionContract.d.ts +16 -1
  9. package/dist/agent/core/conclusionContract.d.ts.map +1 -1
  10. package/dist/agent/core/conclusionGenerator.d.ts.map +1 -1
  11. package/dist/agent/core/conclusionGenerator.js +90 -7
  12. package/dist/agent/core/conclusionGenerator.js.map +1 -1
  13. package/dist/agent/core/executors/directSkillExecutor.d.ts.map +1 -1
  14. package/dist/agent/core/executors/directSkillExecutor.js +6 -12
  15. package/dist/agent/core/executors/directSkillExecutor.js.map +1 -1
  16. package/dist/agent/core/orchestratorTypes.d.ts +6 -0
  17. package/dist/agent/core/orchestratorTypes.d.ts.map +1 -1
  18. package/dist/agent/core/orchestratorTypes.js.map +1 -1
  19. package/dist/agent/experts/crossDomain/moduleExpertInvoker.d.ts.map +1 -1
  20. package/dist/agent/experts/crossDomain/moduleExpertInvoker.js +4 -1
  21. package/dist/agent/experts/crossDomain/moduleExpertInvoker.js.map +1 -1
  22. package/dist/agent/scene/sceneStage1Runner.d.ts +1 -1
  23. package/dist/agent/scene/sceneStage1Runner.d.ts.map +1 -1
  24. package/dist/agent/scene/sceneStage1Runner.js +1 -1
  25. package/dist/agent/scene/sceneStage1Runner.js.map +1 -1
  26. package/dist/agent/scene/sceneStoryService.d.ts +1 -1
  27. package/dist/agent/scene/sceneStoryService.d.ts.map +1 -1
  28. package/dist/agent/scene/sceneStoryService.js +4 -1
  29. package/dist/agent/scene/sceneStoryService.js.map +1 -1
  30. package/dist/agent/types/agentProtocol.d.ts.map +1 -1
  31. package/dist/agent/types/agentProtocol.js +4 -1
  32. package/dist/agent/types/agentProtocol.js.map +1 -1
  33. package/dist/agent/types.d.ts +7 -0
  34. package/dist/agent/types.d.ts.map +1 -1
  35. package/dist/agent/types.js.map +1 -1
  36. package/dist/agentv3/artifactStore.d.ts +5 -0
  37. package/dist/agentv3/artifactStore.d.ts.map +1 -1
  38. package/dist/agentv3/artifactStore.js +3 -0
  39. package/dist/agentv3/artifactStore.js.map +1 -1
  40. package/dist/agentv3/claudeMcpServer.d.ts.map +1 -1
  41. package/dist/agentv3/claudeMcpServer.js +125 -86
  42. package/dist/agentv3/claudeMcpServer.js.map +1 -1
  43. package/dist/agentv3/claudeRuntime.js.map +1 -1
  44. package/dist/agentv3/sessionStateSnapshot.d.ts +23 -0
  45. package/dist/agentv3/sessionStateSnapshot.d.ts.map +1 -1
  46. package/dist/assistant/application/agentAnalyzeSessionService.d.ts +6 -0
  47. package/dist/assistant/application/agentAnalyzeSessionService.d.ts.map +1 -1
  48. package/dist/assistant/application/agentAnalyzeSessionService.js +9 -3
  49. package/dist/assistant/application/agentAnalyzeSessionService.js.map +1 -1
  50. package/dist/assistant/application/assistantApplicationService.d.ts.map +1 -1
  51. package/dist/assistant/application/assistantApplicationService.js +3 -1
  52. package/dist/assistant/application/assistantApplicationService.js.map +1 -1
  53. package/dist/cli-user/commands/report.js +64 -0
  54. package/dist/cli-user/commands/report.js.map +1 -1
  55. package/dist/cli-user/io/paths.d.ts +3 -0
  56. package/dist/cli-user/io/paths.d.ts.map +1 -1
  57. package/dist/cli-user/io/paths.js +6 -0
  58. package/dist/cli-user/io/paths.js.map +1 -1
  59. package/dist/cli-user/io/sessionStore.d.ts +1 -0
  60. package/dist/cli-user/io/sessionStore.d.ts.map +1 -1
  61. package/dist/cli-user/io/sessionStore.js +5 -0
  62. package/dist/cli-user/io/sessionStore.js.map +1 -1
  63. package/dist/cli-user/repl/renderer.d.ts +8 -0
  64. package/dist/cli-user/repl/renderer.d.ts.map +1 -1
  65. package/dist/cli-user/repl/renderer.js.map +1 -1
  66. package/dist/cli-user/services/cliAnalyzeService.d.ts +3 -0
  67. package/dist/cli-user/services/cliAnalyzeService.d.ts.map +1 -1
  68. package/dist/cli-user/services/cliAnalyzeService.js +67 -0
  69. package/dist/cli-user/services/cliAnalyzeService.js.map +1 -1
  70. package/dist/cli-user/services/turnPersistence.d.ts +0 -10
  71. package/dist/cli-user/services/turnPersistence.d.ts.map +1 -1
  72. package/dist/cli-user/services/turnPersistence.js +62 -0
  73. package/dist/cli-user/services/turnPersistence.js.map +1 -1
  74. package/dist/routes/agentReportRoutes.d.ts +1 -0
  75. package/dist/routes/agentReportRoutes.d.ts.map +1 -1
  76. package/dist/routes/agentReportRoutes.js +13 -2
  77. package/dist/routes/agentReportRoutes.js.map +1 -1
  78. package/dist/routes/agentResumeRoutes.d.ts.map +1 -1
  79. package/dist/routes/agentResumeRoutes.js +29 -5
  80. package/dist/routes/agentResumeRoutes.js.map +1 -1
  81. package/dist/routes/agentRoutes.d.ts.map +1 -1
  82. package/dist/routes/agentRoutes.js +293 -91
  83. package/dist/routes/agentRoutes.js.map +1 -1
  84. package/dist/services/agentEventStore.d.ts.map +1 -1
  85. package/dist/services/agentEventStore.js +13 -3
  86. package/dist/services/agentEventStore.js.map +1 -1
  87. package/dist/services/agentReportData.d.ts +3 -0
  88. package/dist/services/agentReportData.d.ts.map +1 -1
  89. package/dist/services/agentReportData.js.map +1 -1
  90. package/dist/services/analysisResultSnapshotPipeline.d.ts +3 -0
  91. package/dist/services/analysisResultSnapshotPipeline.d.ts.map +1 -1
  92. package/dist/services/analysisResultSnapshotPipeline.js +3 -0
  93. package/dist/services/analysisResultSnapshotPipeline.js.map +1 -1
  94. package/dist/services/analysisResultSnapshotStore.d.ts.map +1 -1
  95. package/dist/services/analysisResultSnapshotStore.js +34 -2
  96. package/dist/services/analysisResultSnapshotStore.js.map +1 -1
  97. package/dist/services/enterpriseSchema.d.ts.map +1 -1
  98. package/dist/services/enterpriseSchema.js +11 -0
  99. package/dist/services/enterpriseSchema.js.map +1 -1
  100. package/dist/services/evidence/evidenceContractBuilder.d.ts +11 -0
  101. package/dist/services/evidence/evidenceContractBuilder.d.ts.map +1 -0
  102. package/dist/services/evidence/evidenceContractBuilder.js +530 -0
  103. package/dist/services/evidence/evidenceContractBuilder.js.map +1 -0
  104. package/dist/services/htmlReportGenerator.d.ts +7 -0
  105. package/dist/services/htmlReportGenerator.d.ts.map +1 -1
  106. package/dist/services/htmlReportGenerator.js +66 -0
  107. package/dist/services/htmlReportGenerator.js.map +1 -1
  108. package/dist/services/persistAgentSession.d.ts.map +1 -1
  109. package/dist/services/persistAgentSession.js +5 -0
  110. package/dist/services/persistAgentSession.js.map +1 -1
  111. package/dist/services/processIdentity/identityContractMapper.d.ts +14 -0
  112. package/dist/services/processIdentity/identityContractMapper.d.ts.map +1 -0
  113. package/dist/services/processIdentity/identityContractMapper.js +135 -0
  114. package/dist/services/processIdentity/identityContractMapper.js.map +1 -0
  115. package/dist/services/processIdentity/types.d.ts +5 -0
  116. package/dist/services/processIdentity/types.d.ts.map +1 -1
  117. package/dist/services/processIdentity/types.js.map +1 -1
  118. package/dist/services/skillEngine/skillExecutor.d.ts +14 -2
  119. package/dist/services/skillEngine/skillExecutor.d.ts.map +1 -1
  120. package/dist/services/skillEngine/skillExecutor.js +133 -13
  121. package/dist/services/skillEngine/skillExecutor.js.map +1 -1
  122. package/dist/services/skillEngine/types.d.ts +2 -0
  123. package/dist/services/skillEngine/types.d.ts.map +1 -1
  124. package/dist/services/verifier/claimVerificationRunner.d.ts +20 -0
  125. package/dist/services/verifier/claimVerificationRunner.d.ts.map +1 -0
  126. package/dist/services/verifier/claimVerificationRunner.js +88 -0
  127. package/dist/services/verifier/claimVerificationRunner.js.map +1 -0
  128. package/dist/services/verifier/deterministicClaimVerifier.d.ts +8 -0
  129. package/dist/services/verifier/deterministicClaimVerifier.d.ts.map +1 -0
  130. package/dist/services/verifier/deterministicClaimVerifier.js +178 -0
  131. package/dist/services/verifier/deterministicClaimVerifier.js.map +1 -0
  132. package/dist/types/claimVerification.d.ts +38 -0
  133. package/dist/types/claimVerification.d.ts.map +1 -0
  134. package/dist/types/claimVerification.js +6 -0
  135. package/dist/types/claimVerification.js.map +1 -0
  136. package/dist/types/dataContract.d.ts +30 -0
  137. package/dist/types/dataContract.d.ts.map +1 -1
  138. package/dist/types/dataContract.js +7 -0
  139. package/dist/types/dataContract.js.map +1 -1
  140. package/dist/types/evidenceContract.d.ts +100 -0
  141. package/dist/types/evidenceContract.d.ts.map +1 -0
  142. package/dist/types/evidenceContract.js +6 -0
  143. package/dist/types/evidenceContract.js.map +1 -0
  144. package/dist/types/identityContract.d.ts +57 -0
  145. package/dist/types/identityContract.d.ts.map +1 -0
  146. package/dist/types/identityContract.js +6 -0
  147. package/dist/types/identityContract.js.map +1 -0
  148. package/dist/types/multiTraceComparison.d.ts +3 -0
  149. package/dist/types/multiTraceComparison.d.ts.map +1 -1
  150. package/package.json +1 -1
  151. package/skills/atomic/process_identity_resolver.skill.yaml +130 -1
  152. package/skills/atomic/process_slice_cpu_hotspots.skill.yaml +321 -0
  153. package/strategies/anr.strategy.md +2 -2
  154. package/strategies/game.strategy.md +1 -1
  155. package/strategies/general.strategy.md +1 -1
  156. package/strategies/scrolling.strategy.md +1 -0
@@ -0,0 +1,321 @@
1
+ # SPDX-License-Identifier: AGPL-3.0-or-later
2
+ # Copyright (C) 2024-2026 Gracker (Chris)
3
+ # This file is part of SmartPerfetto. See LICENSE for details.
4
+
5
+ # =============================================================================
6
+ # 进程 Slice CPU 热点(原子 Skill)
7
+ # =============================================================================
8
+ # 按进程统计 named slice 的实际 Running CPU time。不同于 wall duration,
9
+ # 这里把 slice 时间段和 thread_state=Running 区间求交,避免把睡眠、IO 等
10
+ # 非执行时间误算成 CPU 消耗。
11
+
12
+ name: process_slice_cpu_hotspots
13
+ version: "1.0"
14
+ type: atomic
15
+ category: cpu
16
+ tier: B
17
+
18
+ meta:
19
+ display_name: "进程 Slice CPU 热点"
20
+ description: "按进程聚合 named slice 的实际 Running CPU 时间"
21
+ icon: "query_stats"
22
+ tags: [cpu, slice, thread_state, running, hotspot, atomic]
23
+
24
+ triggers:
25
+ keywords:
26
+ zh: [slice CPU, 函数 CPU, 热点 slice, CPU 热点, Running 时间, named slice]
27
+ en: [slice cpu, function cpu, hot slices, cpu hotspots, running time, named slice]
28
+ patterns:
29
+ - ".*(slice|函数|方法).*(CPU|cpu|消耗|热点).*"
30
+ - ".*(CPU|cpu).*(slice|function|method|named).*"
31
+
32
+ prerequisites:
33
+ modules:
34
+ - sched
35
+ required_tables:
36
+ - slice
37
+ - thread_track
38
+ - thread
39
+ - process
40
+ - thread_state
41
+
42
+ identity:
43
+ policy: verify_if_present
44
+ scope: process
45
+ aliases: [package, process_name]
46
+ rewriteTo: recommended_process_name_param
47
+
48
+ inputs:
49
+ - name: package
50
+ type: string
51
+ required: false
52
+ description: "目标应用包名或进程名前缀"
53
+ - name: process_name
54
+ type: string
55
+ required: false
56
+ description: "目标进程名;当 package 为空时使用"
57
+ - name: upid
58
+ type: integer
59
+ required: false
60
+ description: "可选 trace 内进程 ID;优先级高于 package/process_name"
61
+ - name: slice_name
62
+ type: string
63
+ required: false
64
+ description: "可选 slice 名称过滤;默认字面包含匹配,包含 % 时按 SQL LIKE 模式匹配"
65
+ - name: thread_scope
66
+ type: string
67
+ required: false
68
+ default: all
69
+ description: "线程范围:all/main/render/main_render"
70
+ - name: start_ts
71
+ type: timestamp
72
+ required: false
73
+ description: "分析起始时间戳(ns),默认 trace_start()"
74
+ - name: end_ts
75
+ type: timestamp
76
+ required: false
77
+ description: "分析结束时间戳(ns),默认 trace_end()"
78
+ - name: min_cpu_ns
79
+ type: integer
80
+ required: false
81
+ default: 0
82
+ description: "聚合后最小 CPU 时间阈值(ns)"
83
+ - name: top_k
84
+ type: integer
85
+ required: false
86
+ default: 10
87
+ description: "返回 TopK 条目"
88
+
89
+ display:
90
+ level: detail
91
+ layer: list
92
+ title: "进程 Slice CPU 热点"
93
+ columns:
94
+ - name: process_name
95
+ label: "进程"
96
+ type: string
97
+ format: truncate
98
+ - name: slice_name
99
+ label: "Slice"
100
+ type: string
101
+ format: truncate
102
+ - name: count
103
+ label: "次数"
104
+ type: number
105
+ format: compact
106
+ - name: thread_count
107
+ label: "线程数"
108
+ type: number
109
+ format: compact
110
+ - name: sample_threads
111
+ label: "样例线程"
112
+ type: string
113
+ format: truncate
114
+ - name: total_cpu_ms
115
+ label: "CPU时间"
116
+ type: duration
117
+ format: duration_ms
118
+ unit: ms
119
+ - name: total_wall_ms
120
+ label: "Wall时间"
121
+ type: duration
122
+ format: duration_ms
123
+ unit: ms
124
+ - name: avg_cpu_ms
125
+ label: "平均CPU"
126
+ type: duration
127
+ format: duration_ms
128
+ unit: ms
129
+ - name: max_cpu_ms
130
+ label: "最大CPU"
131
+ type: duration
132
+ format: duration_ms
133
+ unit: ms
134
+ - name: cpu_efficiency_pct
135
+ label: "CPU/Wall"
136
+ type: percentage
137
+ format: percentage
138
+ - name: selected_cpu_share_pct
139
+ label: "所选CPU占比"
140
+ type: percentage
141
+ format: percentage
142
+ - name: first_ts
143
+ label: "首次出现"
144
+ type: timestamp
145
+ - name: last_ts
146
+ label: "最后出现"
147
+ type: timestamp
148
+
149
+ sql: |
150
+ WITH
151
+ raw_input AS (
152
+ SELECT
153
+ COALESCE(${start_ts}, trace_start()) AS raw_start_ts,
154
+ COALESCE(${end_ts}, trace_end()) AS raw_end_ts,
155
+ ${upid} AS target_upid,
156
+ NULLIF(COALESCE(NULLIF('${process_name|}', ''), NULLIF('${package|}', '')), '') AS target_process,
157
+ NULLIF('${slice_name|}', '') AS target_slice,
158
+ CASE
159
+ WHEN '${thread_scope|all}' IN ('all', 'main', 'render', 'main_render') THEN '${thread_scope|all}'
160
+ ELSE 'all'
161
+ END AS thread_scope,
162
+ MAX(COALESCE(${min_cpu_ns|0}, 0), 0) AS min_cpu_ns,
163
+ MIN(MAX(COALESCE(${top_k|10}, 10), 1), 100) AS top_k
164
+ ),
165
+ input AS (
166
+ SELECT
167
+ MIN(raw_start_ts, raw_end_ts) AS start_ts,
168
+ MAX(raw_start_ts, raw_end_ts) AS end_ts,
169
+ target_upid,
170
+ target_process,
171
+ target_slice,
172
+ thread_scope,
173
+ min_cpu_ns,
174
+ top_k
175
+ FROM raw_input
176
+ ),
177
+ target_threads AS (
178
+ SELECT
179
+ p.upid,
180
+ p.pid,
181
+ p.name AS process_name,
182
+ t.utid,
183
+ t.tid,
184
+ COALESCE(t.name, '') AS thread_name
185
+ FROM process p
186
+ JOIN thread t ON t.upid = p.upid
187
+ CROSS JOIN input i
188
+ WHERE (
189
+ (
190
+ i.target_upid IS NOT NULL
191
+ AND p.upid = i.target_upid
192
+ )
193
+ OR (
194
+ i.target_upid IS NULL
195
+ AND (
196
+ i.target_process IS NULL
197
+ OR p.name GLOB i.target_process || '*'
198
+ OR p.name LIKE '%' || i.target_process || '%'
199
+ )
200
+ )
201
+ )
202
+ AND (
203
+ i.thread_scope = 'all'
204
+ OR (
205
+ i.thread_scope IN ('main', 'main_render')
206
+ AND (t.is_main_thread = 1 OR t.tid = p.pid)
207
+ )
208
+ OR (
209
+ i.thread_scope IN ('render', 'main_render')
210
+ AND (
211
+ t.name = 'RenderThread'
212
+ OR t.name = 'GPU completion'
213
+ OR t.name GLOB '[0-9]*.ui'
214
+ OR t.name GLOB '[0-9]*.raster'
215
+ )
216
+ )
217
+ )
218
+ ),
219
+ candidate_slices AS (
220
+ SELECT
221
+ s.id,
222
+ s.name AS slice_name,
223
+ s.ts,
224
+ s.dur,
225
+ tt.upid,
226
+ tt.process_name,
227
+ tt.utid,
228
+ tt.thread_name
229
+ FROM slice s
230
+ JOIN thread_track track ON s.track_id = track.id
231
+ JOIN target_threads tt ON track.utid = tt.utid
232
+ CROSS JOIN input i
233
+ WHERE s.dur > 0
234
+ AND s.ts < i.end_ts
235
+ AND s.ts + s.dur > i.start_ts
236
+ AND (
237
+ i.target_slice IS NULL
238
+ OR (
239
+ INSTR(i.target_slice, '%') > 0
240
+ AND s.name LIKE i.target_slice
241
+ )
242
+ OR (
243
+ INSTR(i.target_slice, '%') = 0
244
+ AND INSTR(s.name, i.target_slice) > 0
245
+ )
246
+ )
247
+ ),
248
+ per_slice_cpu AS (
249
+ SELECT
250
+ cs.id,
251
+ cs.process_name,
252
+ cs.slice_name,
253
+ cs.utid,
254
+ cs.thread_name,
255
+ MAX(cs.ts, i.start_ts) AS clipped_start_ts,
256
+ MIN(cs.ts + cs.dur, i.end_ts) AS clipped_end_ts,
257
+ MIN(cs.ts + cs.dur, i.end_ts) - MAX(cs.ts, i.start_ts) AS wall_ns,
258
+ COALESCE(SUM(
259
+ MIN(MIN(cs.ts + cs.dur, i.end_ts), ts.ts + ts.dur)
260
+ - MAX(MAX(cs.ts, i.start_ts), ts.ts)
261
+ ), 0) AS cpu_ns
262
+ FROM candidate_slices cs
263
+ CROSS JOIN input i
264
+ LEFT JOIN thread_state ts ON ts.utid = cs.utid
265
+ AND ts.state = 'Running'
266
+ AND ts.dur > 0
267
+ AND ts.ts < MIN(cs.ts + cs.dur, i.end_ts)
268
+ AND ts.ts + ts.dur > MAX(cs.ts, i.start_ts)
269
+ GROUP BY
270
+ cs.id,
271
+ cs.process_name,
272
+ cs.slice_name,
273
+ cs.utid,
274
+ cs.thread_name,
275
+ cs.ts,
276
+ cs.dur,
277
+ i.start_ts,
278
+ i.end_ts
279
+ ),
280
+ aggregate_cpu AS (
281
+ SELECT
282
+ process_name,
283
+ slice_name,
284
+ COUNT(*) AS count,
285
+ COUNT(DISTINCT utid) AS thread_count,
286
+ SUBSTR(GROUP_CONCAT(DISTINCT COALESCE(NULLIF(thread_name, ''), '<unnamed>')), 1, 240) AS sample_threads,
287
+ SUM(cpu_ns) AS total_cpu_ns,
288
+ SUM(wall_ns) AS total_wall_ns,
289
+ AVG(cpu_ns) AS avg_cpu_ns,
290
+ MAX(cpu_ns) AS max_cpu_ns,
291
+ MIN(clipped_start_ts) AS first_ts,
292
+ MAX(clipped_end_ts) AS last_ts
293
+ FROM per_slice_cpu
294
+ GROUP BY process_name, slice_name
295
+ HAVING SUM(cpu_ns) >= (SELECT min_cpu_ns FROM input)
296
+ ),
297
+ selected_total AS (
298
+ SELECT SUM(total_cpu_ns) AS total_cpu_ns
299
+ FROM aggregate_cpu
300
+ )
301
+ SELECT
302
+ process_name,
303
+ slice_name,
304
+ count,
305
+ thread_count,
306
+ sample_threads,
307
+ ROUND(total_cpu_ns / 1e6, 2) AS total_cpu_ms,
308
+ ROUND(total_wall_ns / 1e6, 2) AS total_wall_ms,
309
+ ROUND(avg_cpu_ns / 1e6, 2) AS avg_cpu_ms,
310
+ ROUND(max_cpu_ns / 1e6, 2) AS max_cpu_ms,
311
+ ROUND(100.0 * total_cpu_ns / NULLIF(total_wall_ns, 0), 1) AS cpu_efficiency_pct,
312
+ ROUND(100.0 * total_cpu_ns / NULLIF((SELECT total_cpu_ns FROM selected_total), 0), 1) AS selected_cpu_share_pct,
313
+ printf('%d', first_ts) AS first_ts,
314
+ printf('%d', last_ts) AS last_ts
315
+ FROM aggregate_cpu
316
+ WHERE total_cpu_ns > 0
317
+ ORDER BY total_cpu_ns DESC
318
+ LIMIT (SELECT top_k FROM input)
319
+
320
+ output:
321
+ format: structured
@@ -108,7 +108,7 @@ fetch_artifact(artifactId, detail="rows", offset=0, limit=50)
108
108
  |--------|------|------|--------|
109
109
  | Q4 Sleeping 极高 | >80% | **主线程被阻塞**(ANR 最常见原因) | → 第二步:用 blocked_functions 定位 |
110
110
  | Q3 Runnable 高 | >30% | CPU 饥饿——可运行但得不到 CPU | → 检查 `sched_latency`、`cpu_health`、后台进程抢占 |
111
- | Q1+Q2 Running 高 | >70% | CPU-bound——主线程在执行重计算 | → 检查 `main_thread_slices`、热点函数 |
111
+ | Q1+Q2 Running 高 | >70% | CPU-bound——主线程在执行重计算 | → 检查 `main_thread_slices`,并调用 `invoke_skill("process_slice_cpu_hotspots", { process_name, start_ts, end_ts, thread_scope: "main" })` 定位主线程热点函数/slice 的 Running CPU time |
112
112
  | 混合 | 无明显主导 | 多因素共同导致 | → 依次排查 Q4→Q3→Q1 |
113
113
 
114
114
  ### 第二步:当 Q4 占比高时 — 用 blocked_functions + 线程状态定位
@@ -197,4 +197,4 @@ fetch_artifact(artifactId, detail="rows", offset=0, limit=50)
197
197
  - 忽略 `wakeup_chain` 数据(这是定位间接依赖链的关键)
198
198
  - 把所有 ANR 统一用同一个决策路径分析,不区分 ANR 类型
199
199
  - 忽略 `app_freeze_check`(应用完全冻结 vs 部分响应是重要区分)
200
- - 不交叉检查 CPU/内存/IO 系统上下文就下结论
200
+ - 不交叉检查 CPU/内存/IO 系统上下文就下结论
@@ -100,7 +100,7 @@ invoke_skill("mali_gpu_power_state")
100
100
  | CPU 频率下降 | `invoke_skill("thermal_throttling")` | 游戏长时间运行容易触发热节流 |
101
101
  | 内存压力 | `invoke_skill("memory_analysis")` | 游戏内存占用大,可能触发 LMK |
102
102
  | CPU 调度 | `invoke_skill("cpu_analysis")` | 游戏线程调度到小核会造成帧率波动 |
103
- | 线程/进程 CPU 利用率 | `invoke_skill("cpu_thread_utilization_period")` / `invoke_skill("cpu_process_utilization_period")` | 判断 UnityMain/GameThread/RenderThread 是否 CPU-bound |
103
+ | 线程/进程 CPU 利用率 | `invoke_skill("cpu_thread_utilization_period")` / `invoke_skill("cpu_process_utilization_period")`;需要函数/slice 级热点时补 `invoke_skill("process_slice_cpu_hotspots", { process_name, start_ts, end_ts })` | 判断 UnityMain/GameThread/RenderThread 是否 CPU-bound,并用 Running CPU time 定位 named slice 热点 |
104
104
  | 功耗归因 | `invoke_skill("wattson_thread_power_attribution")` | 仅在 power_rails + cpu_freq_idle 可用时做线程能耗归因 |
105
105
  | 独立 GL swap 间隔 | `invoke_skill("gl_standalone_swap_jank")` | NativeActivity/GLSurfaceView 或引擎自管 swap 时检查生产端 present 节奏 |
106
106
 
@@ -19,7 +19,7 @@ keywords: []
19
19
 
20
20
  | 用户关注方向 | 推荐路径 | 说明 |
21
21
  |-------------|---------|------|
22
- | **CPU / 调度 / 线程** | `invoke_skill("cpu_analysis")` → 如果发现 throttling → `invoke_skill("thermal_throttling")` | 交叉检查热节流和 CPU 频率 |
22
+ | **CPU / 调度 / 线程** | `invoke_skill("cpu_analysis")` → 需要函数/slice CPU 热点时 `invoke_skill("process_slice_cpu_hotspots", { process_name: "<包名或进程名>" })` → 如果发现 throttling → `invoke_skill("thermal_throttling")` | Running CPU time 区分真实计算热点和 wall-time 阻塞,再交叉检查热节流和 CPU 频率 |
23
23
  | **内存 / OOM / 泄漏** | `invoke_skill("memory_analysis")` → 如果有 heap dump → `invoke_skill("android_heap_graph_summary")` → 如果有 LMK → `invoke_skill("lmk_analysis")` → 如果涉及 GPU 内存 → `invoke_skill("dmabuf_analysis")` | 层层深入内存问题;heap graph 用 retained/cumulative size 定位 retainer |
24
24
  | **IO / 磁盘 / 存储** | `invoke_skill("block_io_analysis")` 或 `invoke_skill("io_pressure")` | 磁盘 IO 和系统 IO 压力 |
25
25
  | **GPU / 渲染** | `invoke_skill("gpu_analysis")` | GPU 频率、利用率、Fence 等待 |
@@ -224,6 +224,7 @@ invoke_skill("scrolling_analysis", { start_ts: "<trace_start>", end_ts: "<trace_
224
224
  | UI thread 时间分解 | `invoke_skill("frame_ui_time_breakdown")` | 看 UI thread 在每帧的耗时分布 |
225
225
  | 每帧阻塞调用 | `invoke_skill("frame_blocking_calls")` | 将掉帧帧与 Binder/GC/锁竞争/futex/文件 IO 阻塞区间做重叠匹配 |
226
226
  | CPU process/thread 周期利用率 | `invoke_skill("cpu_process_utilization_period")` / `invoke_skill("cpu_thread_utilization_period")` | 用于 workload_heavy、后台抢占、线程归因 |
227
+ | 进程 slice CPU 热点 | `invoke_skill("process_slice_cpu_hotspots", { process_name, start_ts, end_ts })` | 用 `thread_state=Running` 求交,确认掉帧窗口内真正消耗 CPU 的 named slice |
227
228
  | CPU cluster 拓扑 | `invoke_skill("cpu_cluster_mapping_view")` | 解释大小核分布,辅助 small_core_placement |
228
229
  | GPU work period | `invoke_skill("android_gpu_work_period_track")` | 只有 `gpu_work_period` capability 可用时才做 GPU active region 判断 |
229
230
  | Mali power state | `invoke_skill("mali_gpu_power_state")` | Mali 设备专用;无数据时标注设备/trace 不支持 |