《PerfettoSQL 的通用查询模板》---Android-trace

PerfettoSQL 的通用查询模板 ,可以直接在 ui.perfetto.dev → Query(SQL) 或 trace_processor_shell 中执行,用来分析:

某个 package 下的方法的耗时

(例如 com.example.app,可替换为你的包名)


✅ 一、最常用 ------ 根据 slice 名(atrace / traceEvent)分析耗时

前提:你在代码里用过

kotlin 复制代码
Trace.beginSection("xxx")
Trace.endSection()

或者使用了 android.os.Trace / androidx.tracing / systrace tag(一般 slice 名会带上函数名或模块名)。

✔ 查询某个 package 下的所有方法耗时(降序)

sql 复制代码
SELECT
  name AS method,
  ts/1e6 AS start_ms,
  dur/1e6 AS dur_ms,
  dur AS dur_ns,
  utid
FROM slice
WHERE name LIKE 'com.example.%'
ORDER BY dur DESC;

👉 把 com.example.% 换成你的包名前缀即可

例如:my.company.% 或 com.xxx.yyy.%


二、按函数名聚合(统计总耗时/调用次数/平均耗时)

如果你想看某个 package 下哪些方法最耗时:

sql 复制代码
SELECT
  name AS method,
  COUNT(*) AS call_count,
  SUM(dur)/1e6 AS total_ms,
  AVG(dur)/1e6 AS avg_ms,
  MAX(dur)/1e6 AS max_ms
FROM slice
WHERE name LIKE 'com.example.%'
GROUP BY name
ORDER BY total_ms DESC;       -- 或 avg_ms / max_ms

用途:快速知道该包下哪些 "方法" 最耗时(前提是 slice 名 = 方法名)。


三、如果你知道某个线程(比如主线程)------ 只查它

sql 复制代码
SELECT
  s.name,
  s.ts/1e6 AS start_ms,
  s.dur/1e6 AS dur_ms
FROM slice s
JOIN thread t USING(utid)
WHERE t.name = 'main'
  AND s.name LIKE 'com.example.%'
ORDER BY s.dur DESC;

四、如果 trace 使用了 Android Runtime Instrumentation(method tracing)

如果 trace 是通过 method tracing(如 Debug.startMethodTracing 或 Perfetto 的 method-profiling)生成的,方法信息会存在 stack_profile_callsite 和 stack_profile_frame 表中。

✔ 查真正的 Java 方法耗时(方法级 profiling)

sql 复制代码
SELECT
  f.name AS method,
  SUM(c.total_time) / 1e6 AS total_ms,
  SUM(c.call_count) AS calls,
  (SUM(c.total_time) / SUM(c.call_count)) / 1e6 AS avg_ms
FROM stack_profile_frame f
JOIN stack_profile_callsite c ON f.id = c.frame_id
WHERE f.name LIKE 'com.example.%'
GROUP BY f.name
ORDER BY total_ms DESC;

⚠ 注意:

  • 要求 trace 中启用了 Java/Kotlin 方法级 profiling(method sampling/profiler)
  • f.name 才是真正的 Java 方法名 → 比普通 slice 更精确
  • 如果你不确定 trace 里有没有 profiling,可以让我帮你判断(你可上传 trace 文件)

五、如果你是 C++(native)代码 ------ 根据 symbol 分析

sql 复制代码
SELECT
  f.name AS function,
  SUM(c.total_time)/1e6 AS total_ms,
  SUM(c.call_count) AS calls
FROM stack_profile_frame f
JOIN stack_profile_callsite c ON f.id = c.frame_id
WHERE f.name LIKE '%YourNativeFunctionOrModule%'
GROUP BY f.name
ORDER BY total_ms DESC;

相关推荐
椒颜皮皮虾྅18 分钟前
让文档不止于文字:DeploySharp + PP-Structure,打通版面分析与表格重建
开发语言·学习·c#·.net·cuda
Frag0ut21 分钟前
Notepad++ 零基础入门:从记事本到代码编辑器的平滑过渡(2026最新版)
python·编辑器·html·json·notepad++·markdown·记事本
深蓝AI25 分钟前
Webhook 重投别再执行两次:Python + SQLite 收件箱实测
python
Eider199828 分钟前
Python基础知识之并发相关-2
开发语言·前端·python
第九序言T31 分钟前
Python 数据处理进阶(二十二)用 Pandas 做一次完整的用户行为分析
开发语言·python·数据分析·pandas
云和数据.ChenGuang34 分钟前
再论深拷贝和浅拷贝
开发语言·人工智能·python·1024程序员节
用户60709759149061 小时前
AOSP 14 OTA 升级指导(三):三条升级链路——Java API、自研 HAL 与 TR069
android
第九序言T1 小时前
Python 数据处理进阶(二十一)相关性与分组对比:数据里藏着什么关系
大数据·人工智能·python·数据分析·pandas
Gent_倪1 小时前
Python 语句梳理
python
晚风予卿云月2 小时前
【C++高并发内存池】 2.ThreadCache设计
开发语言·c++·高并发内存池·tcmalloc