性能分析--perfetto工具使用
性能作为it行业开发的一个重要组成部分 许多人刚接触起来总是云里雾里 总觉得和代码表现的相似但是却不一致 摸不着头脑 现在让我们来清晰化
性能
一、性能的定义
性能本质上是设备或系统完成特定任务的效率与能力,核心衡量维度包括:响应速度、处理能力、稳定性、并发承载能力等。对于手机而言,性能直接决定了日常使用的流畅度(如打开 APP、切换任务)、复杂场景的表现(如大型游戏、视频剪辑)以及长期使用的耐用性(是否容易卡顿)。
二、手机性能的核心分析维度
手机性能是多硬件、软件协同作用的结果,需从关键组件和实际体验两方面综合判断,核心维度如下:
1. 核心硬件:性能的 “基础配置”
硬件是性能的核心支撑,重点关注以下组件:
- 处理器(SoC):手机的 “大脑”,直接决定运算速度。
- 关键参数:芯片型号(如骁龙 8 Gen4、天玑 9300+、苹果 A18 Pro)、核心数(CPU 大核 + 小核架构,影响多任务和功耗平衡)、制程工艺(纳米数越小,如 3nm,性能更强且更省电)、GPU(图形处理单元,影响游戏、视频渲染能力)。
- 分析方式:参考专业跑分(如安兔兔、GeekBench),但需注意 “跑分≠实际体验”,部分芯片侧重性能峰值,部分侧重功耗控制。
- 内存(RAM):决定多任务能力,相当于 “临时工作台”。
- 关键参数:容量(常见 8GB、12GB、16GB,越大越能同时运行多个 APP 不杀后台)、内存类型(如 LPDDR5X 比 LPDDR5 传输速度更快,减少数据延迟)。
- 分析方式:实际测试 “后台驻留能力”(如同时打开微信、抖音、游戏等,切换后是否需要重新加载)。
- 存储(ROM):影响数据读写速度,相当于 “仓库”。
- 关键参数:容量(满足存储需求,建议至少 256GB)、存储类型(UFS 4.0 比 UFS 3.1 读写速度更快,体现在安装 APP、复制大文件、加载游戏资源的速度上)。
- 分析方式:测试大型 APP 的安装时间、4K 视频的导出速度,或查看是否支持 “内存扩展”(需注意:软件扩展的内存性能远不如物理内存)。
- 散热系统:制约性能释放的 “瓶颈”。
- 关键配置:散热面积(如 VC 液冷散热的尺寸)、散热材质(铜箔、石墨烯等)。
- 分析方式:长时间运行大型游戏(如《原神》最高画质),观察手机是否快速发热、是否出现 “降频卡顿”(帧率突然下跌)。
2. 软件优化:硬件性能的 “放大器”
同样的硬件,不同系统优化会带来差异极大的体验:
- 操作系统:如 iOS 的闭环生态(优化更极致,流畅度和稳定性突出)、Android 的开放性(不同品牌定制 UI 差异大,如 MIUI、ColorOS 的后台管理、功耗优化)。
- 系统功能:是否支持 “内存融合”“应用预加载”,后台管理策略是否合理(避免过度杀后台或占用过多内存)。
- 适配性:重点 APP(如游戏、办公软件)是否针对手机型号优化,是否支持高帧率(如 120 帧)、高分辨率渲染。
3. 实际场景测试:性能的 “最终检验”
跑分只能作为参考,实际使用场景更能反映真实性能:
- 日常流畅度:打开 / 切换 APP(如微信、淘宝、相机)的响应速度,滑动屏幕、浏览网页是否掉帧。
- 大型游戏表现:运行《原神》《王者荣耀》等游戏,测试满画质下的帧率稳定性(可用帧率监测工具)、机身发热情况、续航消耗速度。
- 重载任务能力:导出 4K 视频、压缩大型文件、运行专业办公软件(如 Excel 大数据表格),观察完成时间和过程是否卡顿。
- 长期使用稳定性:手机使用 1-2 年后,是否出现明显卡顿、续航衰减过快(需结合系统更新支持情况,如是否提供长期优化补丁)。
4. 功耗与续航:性能的 “平衡项”
高性能不等于好体验,需兼顾功耗控制:
- 重点关注 “性能功耗比”:相同负载下,功耗越低,续航越长,且不易发热。
- 测试方式:满电状态下,混合使用(游戏 1 小时 + 视频 2 小时 + 日常社交),记录剩余电量;或持续高负载场景(如连续游戏),观察续航时长。
三、总结
分析手机性能的核心逻辑是:先看硬件基础(处理器、内存、存储、散热),再看软件优化,最终通过实际场景测试验证,同时兼顾功耗与续航的平衡。避免单纯依赖跑分。
在分析性能的时候会引入一个工具 perfetto 我们开始讲解perfetto的使用
Perfetto 是 Android 10 中引入的全新下一代平台级跟踪工具,适用于 Android、Linux 和 Chrome,是用于性能检测和跟踪分析的生产级开源项目。以下是其使用方法的详细介绍:
- 开启设备追踪:Android 11 及以上版本默认开启 Perfetto,Android 9 和 10 需要手动开启,在非 Pixel 手机上需执行命令
adb shell setprop persist.traced.enable 1
。 - 抓取跟踪文件
- 使用命令行直接抓取:可以使用 ADB 命令捕获 Perfetto 追踪,进行系统级追踪的命令示例为
adb shell perfetto --config demo --out /data/misc/perfetto-traces/trace_file
,这将开始追踪并将追踪文件保存到指定位置。捕获完成后,可通过adb pull /data/misc/perfetto-traces/trace_file
下载追踪文件。 - 使用配置文件抓取:首先需要生成配置文件,配置文件可以灵活设置各种参数,如缓冲区大小、数据源、抓取持续时间等。例如:
- 使用命令行直接抓取:可以使用 ADB 命令捕获 Perfetto 追踪,进行系统级追踪的命令示例为
plaintext
buffers:{size_kb:522240fill_policy:DISCARD}
data_sources:{config{name:"linux.process_stats"target_buffer:1process_stats_config{scan_all_processes_on_start:true}}
}
data_sources:{config{name:"android.log"android_log_config{log_ids:LID_DEFAULTlog_ids:LID_SYSTEM}}
}
data_sources:{config{name:"linux.sys_stats"sys_stats_config{stat_period_ms:250stat_counters:STAT_CPU_TIMESstat_counters:STAT_FORK_COUNT}}
}
data_sources:{config{name:"linux.ftrace"ftrace_config{ftrace_events:"sched/sched_switch"ftrace_events:"power/suspend_resume"// 省略部分ftrace_eventsatrace_categories:"gfx"atrace_categories:"input"// 省略部分atrace_categoriesatrace_apps:"*"}}
}
duration_ms:30000
然后将配置文件 push 到设备上,执行命令adb push perfetto.pbtxt /data/local/tmp/perfetto.pbtxt
,接着在设备上执行adb shell 'cat /data/local/tmp/perfetto.pbtxt|perfetto --txt -c --o /data/misc/perfetto-traces/trace'
。
Perfetto 网页版(ui.perfetto.dev)是分析追踪文件的核心工具,提供了直观的可视化界面,支持查看 CPU 调度、内存使用、进程线程活动等性能数据。以下是其详细使用教程:
一、准备工作
- 获取追踪文件
先通过前文提到的方法(命令行或配置文件)抓取追踪文件(通常为 .perfetto-trace 或 .pftrace 格式),保存到本地。
二、打开网页版并加载文件
- 访问 ui.perfetto.dev,页面初始状态如下:
- 加载追踪文件的两种方式:
- 直接拖放:将本地的 .perfetto-trace 文件拖到页面中央的 “Drop a trace file here” 区域。
- 手动上传:点击页面中的 “Upload trace file” 按钮,选择本地文件。
三、核心界面布局
加载完成后,界面分为以下几个关键区域(从上到下、从左到右):
- 顶部工具栏
- 时间范围控制:可通过拖拽时间轴滑块(底部的灰色长条)缩放 / 平移时间范围,或直接输入时间(如 0.5s 到 2.5s)。
- 搜索框:输入进程名、线程名、事件类型(如 sched_switch)快速定位。
- 视图切换:点击 “+” 添加新视图(如 CPU 核心、内存、日志等),或切换预设布局(如 “CPU + 进程”)。
- 左侧面板
- Tracks(追踪项):显示所有可展开的追踪类别,如 Processes(进程)、CPUs(CPU 核心)、Android Logs(系统日志)等。
- 点击类别前的箭头可展开具体内容(如某进程的线程、某 CPU 核心的调度事件)。
- 右键点击追踪项可选择 “Hide”(隐藏)、“Pin”(固定)或 “Filter”(过滤)。
- Tracks(追踪项):显示所有可展开的追踪类别,如 Processes(进程)、CPUs(CPU 核心)、Android Logs(系统日志)等。
- 主视图区
- 以时间轴为横轴,展示各追踪项的活动(如线程运行状态、CPU 使用率、函数调用等)。
- 不同颜色代表不同状态:
- 绿色:线程处于 Running(运行)状态。
- 灰色:线程处于 Sleeping(休眠)或 Uninterruptible(不可中断睡眠)状态。
- 橙色 / 红色:可能代表调度延迟、锁等待等(具体需结合事件类型)。
- 底部时间轴
- 显示整个追踪的时间范围,拖拽滑块可缩放至感兴趣的时间段(精确到毫秒级)。
四、常用分析操作
1. 查看 CPU 调度细节
- 在左侧 CPUs 展开具体核心(如 CPU 0、CPU 1),主视图会显示该核心上的线程切换事件(sched_switch)。
- 点击某一段绿色的 “运行” 块,右侧会弹出详情面板,显示:
- 线程名、PID/TID。
- 运行开始 / 结束时间、持续时长。
- 切换前后的线程状态(如从 prev_comm=system_server 切换到 next_comm=my_app)。
2. 分析进程 / 线程活动
- 在左侧 Processes 展开目标进程(如 com.example.myapp),其下的线程会按 TID 列出。
- 观察线程的状态变化:若某线程频繁在 “运行” 和 “休眠” 间切换,可能存在调度问题;若长期处于 “阻塞” 状态,可能是锁竞争或 I/O 等待导致。
- 右键线程追踪项,选择 “Zoom to selection” 可聚焦该线程的活动时间范围。
3. 查看系统日志与自定义事件
- 若追踪配置包含 android.log 数据源,左侧 Android Logs 会显示系统日志(如 logcat 内容),可按日志级别(I/D/W/E)筛选。
- 若使用了 Perfetto SDK 添加自定义事件(如 Trace.beginSection("custom_event")),在 Processes 下的对应线程中会显示橙色 / 紫色的事件块,点击可查看事件名称和持续时间。
4. 统计与筛选
- 搜索筛选:在顶部搜索框输入关键词(如 my_app 或 sched),主视图会高亮匹配项,左侧仅显示相关追踪项。
- 导出数据:点击顶部工具栏的 “Export”,可将当前视图数据导出为 CSV 或 JSON(用于进一步分析)。
- 聚合统计:右键某类事件(如 sched_switch),选择 “Show summary” 可查看该事件的总次数、平均持续时间等统计信息。
五、高级技巧
- 对比多个追踪文件
点击顶部 “File” → “Load another trace”,可加载第二个文件,主视图会显示两个追踪的时间轴(需手动对齐时间起点),方便对比优化前后的性能差异。
- 使用 SQL 分析
Perfetto 支持通过 SQL 查询追踪数据(基于内部的 Trace Processor 引擎):
-
- 点击顶部 “Query” 按钮,打开 SQL 编辑器。
- 示例:查询某进程(PID=1234)的所有线程运行时间:
sql
SELECT thread.name, SUM(dur) AS total_runtime
FROM sched_slice
WHERE utid IN (SELECT utid FROM thread WHERE pid = 1234)
GROUP BY thread.name
ORDER BY total_runtime DESC
-
- 执行后会生成表格结果,支持导出。
- 自定义视图布局
拖拽左侧追踪项可调整顺序,右键 “Remove” 不需要的项,点击顶部 “Save layout” 可保存当前布局(下次加载文件时可复用)。
六、常见问题
- 文件过大无法加载:若文件超过 1GB,直接上传可能卡顿,建议用 Trace Processor 本地加载后,通过网页版连接(前文已提及)。
- 事件显示不全:检查追踪配置是否包含所需数据源(如 linux.ftrace 用于 CPU 调度,android.memory 用于内存跟踪),若缺失需重新抓取。
通过以上操作,可快速定位性能瓶颈(如 CPU 占用过高、线程阻塞、调度延迟等)。结合具体场景(如启动速度、流畅度),聚焦关键时间段和进程,能更高效地分析问题。
- 在 Perfetto UI 中分析追踪:Perfetto 提供了基于 Web 的可视化 UI,网址为 ui.perfetto.dev。将抓取到的追踪文件(格式为.pftrace 或.json)上传到该 UI,即可通过基于网页的可视化工具浏览时间线和事件,重点分析 CPU 调度、线程执行和内存分配等性能数据。
- 使用 Perfetto SDK 进行自定义追踪:如果需要追踪应用中的特定部分,可以使用 Perfetto SDK 来添加自定义追踪点。首先在
build.gradle
文件中添加依赖项implementation 'com.google.perfetto:trace:VERSION'
,然后在代码中使用Trace
API 来创建追踪点,例如Trace.beginSection("custom_event");
和Trace.endSection();
,这些追踪点会出现在 Perfetto 的追踪输出中。- 处理 trace 文件过大的情况:当 trace 文件大于 1G 时,直接在 Perfetto UI 中打开可能会出现内存溢出无法访问的情况。可以使用 Trace Processor 来加载 trace 文件,先下载 Trace Processor,命令为
curl -LO https://get.perfetto.dev/trace_processor
,然后赋予执行权限chmod +x./trace_processor
,接着可以通过./trace_processor trace.perfetto-trace
启动交互式 shell,或者通过./trace_processor trace.perfetto-trace --httpd
启动本地 trace processor 实例,之后在 Chrome 浏览器中打开https://ui.perfetto.dev/#!/,选择 “YES, use loaded trace”,即可自动解析 trace_processor 已经加载的 pftrace 文件。