Android性能优化之Perfetto

article/2025/10/14 17:28:35

Perfetto

一. 通过System Tracing抓取

1. System Tracing Overview

System Tracing即系统跟踪界面,用户可以通过如下两种方式进入系统跟踪界面:

(1)设置 – 其他设置 – 开发者选项 – 系统跟踪(Realme GT Neo 闪速版);

(2)adb shell am start com.android.traceur/com.android.traceur.MainActivity

screenhsot-1

2. System Tracing Options

系统跟踪界面包含以下这些选项,它们与网页版本中的一些选项有着一定的对应关系

(1)录制跟踪记录:开启和关闭trace功能;

(2)跟踪可调试的应用:开启和关闭支持debuggable的应用的自定义trace

(3)类别:打开特定类别的trace,对应Android apps & svcs中的Atrace userspace annotations,默认为以下几个选项

am:ActivityManagerbinder_driver:Binder Kernel driverdalvik:Dalvik VMfreq:CPU Frequencygfx:Graphicshal:Hardware Modulesidle:CPU Idleinput:Inputpm:Package Managerres:Resource Loadingsched:CPU Schedulingss:System Serverview:View Systemwebview:Webviewwm:Window Manager

(4)恢复默认类别:用户选择自定义的类别,可以重新恢复默认的类别;

(5)每个CPU的缓冲区空间:对应In-memory buffer size有以下4个选项,默认为16384KB

8192 KB16384 KB32768 KB65536 KB

(6)清除已保存的跟踪记录:清除手机中已保存的trace文件,默认情况下1个月后清除;

(7)长期跟踪:保存长期的trace到设备存储空间,对应Recording Mode中的Long trace,可以设置最大长期跟踪记录大小(默认为10GB)和最大长期跟踪记录时长(默认为30分钟);

(8)显示“快捷设置”图块:可以在快捷设置中生成一个快捷图标;

3. System Tracing Capture

设置好选项之后,点击“录制跟踪记录”即可开始抓取trace,接着开始复现相关场景,执行完操作之后可以点击下拉通知栏中的系统跟踪通知停止录制,系统会自动保存trace/data/local/traces目录,用户也可以选择分享trace

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AOJ36GcM-1632643440519)(D:\Screenshot_2021-09-22-15-21-37-26_92b64b2a7aa6eb3771ed6e18d0029815.jpg)]

/data/local/traces中保存的trace导到本地,打开https://ui.perfetto.dev/#!/viewer,可以通过以下两种方式打开trace

3.1 Open trace file

在这里插入图片描述

3.2 Open with legacy UI

在这里插入图片描述

二. 通过网页抓取

https://ui.perfetto.dev/#!/record

1. Recording Mode

Perfetto提供了三种录制模式,给用户提供可视化界面方便从不同维度定制各种选项;

1.1 Stop when full

Stop when full 模式下,Perfetto 工作受buffer sizeMax duration 影响,满足其中任一个条件Perfetto 将会停止;

trace 不会因为被覆盖而导致丢失,但如果trace太多会导致提前终止而无法录制到出问题时的trace

In-memory buffer size:代表每一个核上可以存储的最大的tracebuffer大小,默认为64MB;

Max duration:代表此次trace抓取的最大时长,默认为10s

###### [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xLrv3duk-1632643440523)(C:\Users\qinji\AppData\Roaming\Typora\typora-user-images\image-20210922103917192.png)]

1.2 Ring buffer

Ring buffer的选项与Stop when full一致,区别在于其只会受到Max duration 的影响,时间到了就停止抓取 Trace,但是 Trace会有被覆盖的风险;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RoJfxhxk-1632643440524)(C:\Users\qinji\AppData\Roaming\Typora\typora-user-images\image-20210922104043875.png)]

1.3 Long trace

Long trace 用于长时间地抓取 Trace,但是由于需要定时将 buffer 中的 Trace 写到文件里面去,所以可能会有 IO 的影响;

Max file size:代表生成 Long Trace 的最大文件大小,默认为100M

Flush on disk every:代表间隔多长时间将In-memory buffer 中的 trace 写入到文件中。这个数值太大会容易丢 Trace,而太小容易影响IO,默认为2500ms

System TracingMax Duration默认为30mMax file size默认为10GB

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9YwyBVVY-1632643440525)(C:\Users\qinji\AppData\Roaming\Typora\typora-user-images\image-20210922104147792.png)]

2. Recording command

Recording command用于生成录制指令,点击右上角的复制按钮,在 PC 连接手机的情况下,运行这个指令就可以抓取 Trace
在这里插入图片描述

3. CPU

3.1 Coarse CPU usage counter

通过轻量级的轮询/proc/stat节点,周期性的监控CPU的使用情况;

3.2 Scheduling details

记录每个CPU核上调度任务的详情;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-T9uHawIw-1632643440526)(C:\Users\qinji\AppData\Roaming\Typora\typora-user-images\image-20210922155637565.png)]

3.3 CPU frequency and idle states

通过ftrace记录CPU频率和idle状态的改变;
在这里插入图片描述

3.4 Syscalls

记录进入和退出系统调用的过程,仅能在userdebugeng版本上生效;

4. GPU

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zHFkid6x-1632643440527)(C:\Users\qinji\AppData\Roaming\Typora\typora-user-images\image-20210922112703182.png)]

4.1 GPU frequency

通过ftrace记录GPU的频率;

4.2 GPU memory

记录单个进程或者整个GPU的内存使用情况(仅在Android 12+的版本上可用);

5.Power

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4IGnzl5d-1632643440528)(C:\Users\qinji\AppData\Roaming\Typora\typora-user-images\image-20210922113718779.png)]

5.1 Battery drain & power rails

记录电池耗电情况;

5.2 Board voltages & frequencies

记录板级传感器电压和频率的改变;

6. Memory

6.1 Native heap profiling

记录Android进程的native堆的分配和回收(仅在Android 10+的版本上可用);

6.2 Java heap dumps

记录Android应用的java对象的分配情况(仅在Android 11+的版本上可用);

6.3 Kernel meminfo

记录/pro/meminfo节点的轮询情况;

6.4 High-frequency memory events

通过ftracemm_eventrss_station events,记录短期高频的内存增长情况(仅在Android Q+的版本上可用);

6.5 Low memory killer

记录LMK事件和OOM评分调整情况;

6.6 Per process stats

定期取样系统中所有进程的信息:包括线程列表,内存计数(包括RSSswap/proc/status)和oom_score_adj

6.7 Virtual memory stats

通过定期轮询/proc/vmstat获取虚拟内存数据,包括统计swapevictioncompressionpagecache efficiency数据;

7. Android apps & svcs

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-htj2McBO-1632643440529)(C:\Users\qinji\AppData\Roaming\Typora\typora-user-images\image-20210922141424480.png)]

7.1 Atrace userspace annotations

对应System Tracing中的“类别”,打开这个选项之后,可以选择合适的 atrace tag 开启对应的 Trace ;

7.2 Event log

Event log 可以实时记录 Log,然后将 LogTrace 信息一一对应,非常有利于分析问题;

7.3 Frame timeline

Frame timeline记录从surface_flinger获取到的期望的和实际的帧的情况(仅在Android 12+的版本上可用);

8. Chrome

Chrome 主要用于分析 Webview 相关的性能问题;

9. Advanced Settings

Advanced Settings 可以开启 ftrace,主要用于分析内核性能问题;
在这里插入图片描述


http://chatgpt.dhexx.cn/article/i3ZOiJJh.shtml

相关文章

[ES6] 01. Intro to ES6 and traceur compiler

---恢复内容开始--- ES6 is ECMAScript version 6, which JavaScript is based on. The next version of JavaScript is going to be based on version 6 of ECMAScript. Tracer is a way to compile that next version of JavaScript back into JavaScript of today, meaning …

Android性能优化工具

一、性能优化工具基础 1.1 概述 在Android开发中,开发者可通过"系统跟踪"观察Android设备的运行情况并生成跟踪报告,在此基础上进行分析优化。Android 平台提供了多种获取跟踪信息的工具: Android Studio CPU 性能剖析器Systrace…

搭建Babel运行环境,Traceur ES6模板,块级作用域,let和const命令

搭建Babel运行环境 Babel(http://babeljs.io/)可用于将使用ES6语法的脚本转化为ES5语法的脚本,基本功能的安装步骤如下: 1、安装node解释器和npm包管理工具 2、安装babel解释器 npm install -g babel (建议这个过程完…

ES6转ES5,Traceur使用方式

ES6于2015年6月正式发布,各大浏览器的最新版本对 ES6 的支持可以查看https://kangax.github.io/compat-table/es6/。 目前各大浏览器和开发环境对支持ES6的支持情况参差不齐,在实际项目开发中,我们仍旧不得不降级使用ES5语法以兼容各平台。幸…

Traceur 使用方式

ES6于2015年6月正式发布,各大浏览器的最新版本对 ES6 的支持可以查看https://kangax.github.io/compat-table/es6/。 目前各大浏览器和开发环境对支持ES6的支持情况参差不齐,在实际项目开发中,我们仍旧不得不降级使用ES5语法以兼容各平台。幸…

Rxjava:interval的使用

以固定的时间间隔不断发射数据。 测试&#xff1a; Test public void testSimple(){Observable.interval(1, TimeUnit.SECONDS).subscribe(new Action1<Long>() {Overridepublic void call(Long aLong) {System.out.println("aLong " aLong);}});for (;;){…

FlinkSql系列6之 Interval Join

FlinkSql系列6之 Interval Join 前言 本次我们来学习flinksql的Interval Join,这个方式主要是针对两个流在一定时间区间内的join,支持事件时间和处理时间&#xff0c;而且这个流每次只会产生一条数据&#xff0c;是一个完全的追加流。 一、Interval Join是什么&#xff1f; I…

Flink Interval Join使用以及源码解析

1、Interval Join 概述 在之前的Join算子中&#xff0c;一般使用的是coGroup算子&#xff0c;因为一个算子可以提供多种语义&#xff0c;但是也是有一些弊端的。因为coGroup只能实现在同一个窗口的两个数据流之间进行join&#xff0c;在实际的计算过程中&#xff0c;往往会遇到…

mysql datesub interval_Mysql之INTERVAL与DATE_SUB与EXTRACT函数的使用

1. INTERVAL INTERVAL代表的是时间间隔 MySQL中的时间间隔类型有如下几种: 1.1 利用INTERVAL做时间的加减法 示例: 加法:SQL>SELECT DATE 2018-11-01 + INTERVAL 10 11 DAY_HOUR; 结果:2018-11-11 11:00:00 减法:SQL> select date 2018-11-11 11:00:00 -INTERVAL 10 11…

ORACLE中的INTERVAL

ORACLE中的INTERVAL 关于INTERVALINTERVAL类型INTERVAL YEAR TO MONTHINTERVAL DAY TO SECOND 关于INTERVAL oracle中提供了两种日期时间类型&#xff0c;分别是DATE和TIMESTAMP用来存储时间点的数据&#xff0c;同时还提供了INTERVAL来存储一段时间的数据。例如你2022年11月1…

Flink SQL之Interval Joins

1.Interval Joins&#xff08;区间Join&#xff09; 区间是双流join的优化&#xff0c;基于处理时间或事件时间&#xff0c;在一定时间区间内数据&#xff0c;相同的key进行join&#xff08;支持 Batch\Streaming&#xff09;。Interval Join 可以让一条流去 Join 另一条流中前…

MySQL INTERVAL 关键字指南

在本教程中&#xff0c;我们将了解 MySQL INTERVAL 关键字及其值以对日期和时间算术执行操作。那么&#xff0c;让我们开始吧&#xff01; 另请阅读&#xff1a;MySQL 中的 While 循环 – 完整参考 MySQL INTERVAL 简介 在 MySQL 中&#xff0c;INTERVAL 关键字用于添加或减…

Flink之IntervalJoin介绍

InterValJoin算子 间隔流&#xff0c;一条流去join另一条流去过去一段时间内的数据&#xff0c;该算子将keyedStream与keyedStream转化为DataStream&#xff1b;再给定的时间边界内&#xff08;默认包含边界&#xff09;&#xff0c;相当于一个窗口&#xff0c;按指定的key对俩…

Mysql的INTERVAL()函数和INTERVAL关键字

一&#xff0c;INTERVAL()函数 INTERVAL()函数可以返回分段后的结果&#xff0c;语法如下&#xff1a; INTERVAL(N,N1,N2,N3,..........) 其中&#xff0c;N是要判断的数值&#xff0c;N1,N2,N3,...是分段的间隔。 这个函数的返回值是段的位置&#xff1a; 如果N<N1&am…

Mysql_interval函数与关键字

目录 一、统计不同区间的数量&#xff1a;INTERVAL()函数 二、时间间隔&#xff1a;INTERVAL关键字 一、统计不同区间的数量&#xff1a;INTERVAL()函数 INTERVAL()函数可以返回分段后的结果&#xff0c;语法如下&#xff1a; INTERVAL(N,N1,N2,N3,......,Nn) 其中&#x…

INTERVAL记录

INTERVAL作为sql中关键字 interval在sql中一般表示为时间间隔的意思 常用在date_add()、**date_sub()**函数中&#xff0c;常用于时间的加减法 上述sql表示为当前时间一年后的时间。 interval后可选择的时间粒度&#xff1a; MICROSECOND&#xff0c; SECOND&#xff0c; MIN…

万能的Attention及其代码实现

最近看到以前的代码&#xff0c;想到了attention&#xff0c;趁着代码还在就来整理一下。 文章目录 [Squeeze-and-Excitation Networks](https://arxiv.org/abs/1709.01507)[Concurrent Spatial and Channel ‘Squeeze &Excitation’ in Fully Convolutional Networks](ht…

NLP中的Attention总结

Attention是模拟人脑的注意力机制。人在看到一些东西&#xff0c;往往只关注重要的信息&#xff0c;而忽略其他信息。自然语言处理中的attention是对文本分配注意力权重&#xff0c;Attention的本质就是从关注全部变为关注重点。 1 Attention的原理 Attention的计算过程&#…

Attention 理解汇总

在 Encoder-Decoder中&#xff0c;预测每个Decoder 的语义编码 c 是一样的&#xff0c;句子 X 中每个词对输出 Y 的每个词的影响都是相同的。 这样有两个弊端&#xff1a; 一是语义向量无法完全表示整个序列的信息&#xff1b; 二是先输入的内容携带的信息会被后输入的信息稀…

[深度学习] 自然语言处理 --- Self-Attention(三) 知识点与源码解析

在当前的 NLP 领域&#xff0c;Transformer / BERT 已然成为基础应用&#xff0c;而 Self-Attention 则是两者的核心部分&#xff0c;下面尝试用 Q&A 和源码的形式深入 Self-Attention 的细节。 一 Q&A 1. Self-Attention 的核心是什么&#xff1f; Self-Attention …