Android Perfetto 性能分析

Perfetto是Android为我们提供的性能分析工具,网上已经有很多文章来介绍这个工具了,这里就不再赘述,仅贴几篇我觉得有用的文章/网站在此记录:

  • systrace/perfetto中需要actrace打tag相关方法
  • 常用的SQL查询
  • perfetto ui

perfetto命令可能用到的参数可以用 -h 查询到,我们常用的是 -o-t-b

$ perfetto -h
[307.548] perfetto_cmd.cc:187
Usage: perfetto--background     -d      : Exits immediately and continues tracing inbackground--config         -c      : /path/to/trace/config/file or - for stdin--out            -o      : /path/to/out/trace/file or - for stdout--upload                 : Upload field trace (Android only)--dropbox        TAG     : DEPRECATED: Use --upload insteadTAG should always be set to 'perfetto'--no-guardrails          : Ignore guardrails triggered when using --dropbox(for testing).--txt                    : Parse config as pbtxt. Not for production use.Not a stable API.--reset-guardrails       : Resets the state of the guardails and exits(for testing).--query                  : Queries the service state and prints it ashuman-readable text.--query-raw              : Like --query, but prints raw proto-encoded bytesof tracing_service_state.proto.--help           -hlight configuration flags: (only when NOT using -c/--config)--time           -t      : Trace duration N[s,m,h] (default: 10s)--buffer         -b      : Ring buffer size N[mb,gb] (default: 32mb)--size           -s      : Max file size N[mb,gb] (default: in-memory ring-buffer only)ATRACE_CAT               : Record ATRACE_CAT (e.g. wm)FTRACE_GROUP/FTRACE_NAME : Record ftrace event (e.g. sched/sched_switch)FTRACE_GROUP/*           : Record all events in group (e.g. sched/*)statsd-specific flags:--alert-id           : ID of the alert that triggered this trace.--config-id          : ID of the triggering config.--config-uid         : UID of app which registered the config.--subscription-id    : ID of the subscription that triggered this trace.Detach mode. DISCOURAGED, read https://docs.perfetto.dev/#/detached-mode :--detach=key          : Detach from the tracing session with the given key.--attach=key [--stop] : Re-attach to the session (optionally stop tracing once reattached).--is_detached=key     : Check if the session can be re-attached (0:Yes, 2:No, 1:Error).

常用的抓 perfetto 的命令如下:

$ adb shell perfetto -o /data/misc/perfetto-traces/trace.file -t 30s am adb aidl dalvik audio binder_lock binder_driver bionic camera database gfx hal input network nnapi pm power rs res rro sm ss vibrator video webview wm sched freq dalvik

命令后面跟着的 am、adb、aidl、dalvik,查询网上的资料我们可以知道这些都是ATRACE_CAT

我们自己在添加 trace point时,需要先添加ATRACE_TAG ,例如:

#define ATRACE_TAG ATRACE_TAG_GRAPHICS

我理解的是这个文件中所有的 trace 都属于 GRAPHIC 组,那么到底有哪些组呢?

参考 system/core/libcutils/include/cutils/trace.h

#define ATRACE_TAG_NEVER            0       // This tag is never enabled.
#define ATRACE_TAG_ALWAYS           (1<<0)  // This tag is always enabled.
#define ATRACE_TAG_GRAPHICS         (1<<1)
#define ATRACE_TAG_INPUT            (1<<2)
#define ATRACE_TAG_VIEW             (1<<3)
#define ATRACE_TAG_WEBVIEW          (1<<4)
#define ATRACE_TAG_WINDOW_MANAGER   (1<<5)
#define ATRACE_TAG_ACTIVITY_MANAGER (1<<6)
#define ATRACE_TAG_SYNC_MANAGER     (1<<7)
#define ATRACE_TAG_AUDIO            (1<<8)
#define ATRACE_TAG_VIDEO            (1<<9)
#define ATRACE_TAG_CAMERA           (1<<10)
#define ATRACE_TAG_HAL              (1<<11)
#define ATRACE_TAG_APP              (1<<12)
#define ATRACE_TAG_RESOURCES        (1<<13)
#define ATRACE_TAG_DALVIK           (1<<14)
#define ATRACE_TAG_RS               (1<<15)
#define ATRACE_TAG_BIONIC           (1<<16)
#define ATRACE_TAG_POWER            (1<<17)
#define ATRACE_TAG_PACKAGE_MANAGER  (1<<18)
#define ATRACE_TAG_SYSTEM_SERVER    (1<<19)
#define ATRACE_TAG_DATABASE         (1<<20)
#define ATRACE_TAG_NETWORK          (1<<21)
#define ATRACE_TAG_ADB              (1<<22)
#define ATRACE_TAG_VIBRATOR         (1<<23)
#define ATRACE_TAG_AIDL             (1<<24)
#define ATRACE_TAG_NNAPI            (1<<25)
#define ATRACE_TAG_RRO              (1<<26)
#define ATRACE_TAG_LAST             ATRACE_TAG_RRO

添加 ATRACE_TAG 后我们要如何使用命令抓到这个TAG呢?我们需要在命令中指定组才能抓到相关的信息,那么在命令中我们应该如何指定呢?

可以参考 frameworks/native/cmds/atrace/atrace.cpp,里面定义有所有的 ATRACE_CAT,前面的name也就是我们要在cmd中指定的:

static const TracingCategory k_categories[] = {{ "gfx",        "Graphics",                 ATRACE_TAG_GRAPHICS, { } },{ "input",      "Input",                    ATRACE_TAG_INPUT, { } },{ "view",       "View System",              ATRACE_TAG_VIEW, { } },{ "webview",    "WebView",                  ATRACE_TAG_WEBVIEW, { } },{ "wm",         "Window Manager",           ATRACE_TAG_WINDOW_MANAGER, { } },{ "am",         "Activity Manager",         ATRACE_TAG_ACTIVITY_MANAGER, { } },{ "sm",         "Sync Manager",             ATRACE_TAG_SYNC_MANAGER, { } },{ "audio",      "Audio",                    ATRACE_TAG_AUDIO, { } },{ "video",      "Video",                    ATRACE_TAG_VIDEO, { } },{ "camera",     "Camera",                   ATRACE_TAG_CAMERA, { } },{ "hal",        "Hardware Modules",         ATRACE_TAG_HAL, { } },{ "res",        "Resource Loading",         ATRACE_TAG_RESOURCES, { } },{ "dalvik",     "Dalvik VM",                ATRACE_TAG_DALVIK, { } },{ "rs",         "RenderScript",             ATRACE_TAG_RS, { } },{ "bionic",     "Bionic C Library",         ATRACE_TAG_BIONIC, { } },{ "power",      "Power Management",         ATRACE_TAG_POWER, { } },{ "pm",         "Package Manager",          ATRACE_TAG_PACKAGE_MANAGER, { } },{ "ss",         "System Server",            ATRACE_TAG_SYSTEM_SERVER, { } },{ "database",   "Database",                 ATRACE_TAG_DATABASE, { } },{ "network",    "Network",                  ATRACE_TAG_NETWORK, { } },{ "adb",        "ADB",                      ATRACE_TAG_ADB, { } },{ "vibrator",   "Vibrator",                 ATRACE_TAG_VIBRATOR, { } },{ "aidl",       "AIDL calls",               ATRACE_TAG_AIDL, { } },{ "nnapi",      "NNAPI",                    ATRACE_TAG_NNAPI, { } },{ "rro",        "Runtime Resource Overlay", ATRACE_TAG_RRO, { } },{ k_coreServiceCategory, "Core services", 0, { } },{ k_pdxServiceCategory, "PDX services", 0, { } },{ "sched",      "CPU Scheduling",   0, {{ REQ,      "events/sched/sched_switch/enable" },{ REQ,      "events/sched/sched_wakeup/enable" },{ OPT,      "events/sched/sched_waking/enable" },{ OPT,      "events/sched/sched_blocked_reason/enable" },{ OPT,      "events/sched/sched_cpu_hotplug/enable" },{ OPT,      "events/sched/sched_pi_setprio/enable" },{ OPT,      "events/sched/sched_process_exit/enable" },{ OPT,      "events/cgroup/enable" },{ OPT,      "events/oom/oom_score_adj_update/enable" },{ OPT,      "events/task/task_rename/enable" },{ OPT,      "events/task/task_newtask/enable" },} },{ "irq",        "IRQ Events",   0, {{ REQ,      "events/irq/enable" },{ OPT,      "events/ipi/enable" },} },{ "irqoff",     "IRQ-disabled code section tracing", 0, {{ REQ,      "events/preemptirq/irq_enable/enable" },{ REQ,      "events/preemptirq/irq_disable/enable" },} },{ "preemptoff", "Preempt-disabled code section tracing", 0, {{ REQ,      "events/preemptirq/preempt_enable/enable" },{ REQ,      "events/preemptirq/preempt_disable/enable" },} },{ "i2c",        "I2C Events",   0, {{ REQ,      "events/i2c/enable" },{ REQ,      "events/i2c/i2c_read/enable" },{ REQ,      "events/i2c/i2c_write/enable" },{ REQ,      "events/i2c/i2c_result/enable" },{ REQ,      "events/i2c/i2c_reply/enable" },{ OPT,      "events/i2c/smbus_read/enable" },{ OPT,      "events/i2c/smbus_write/enable" },{ OPT,      "events/i2c/smbus_result/enable" },{ OPT,      "events/i2c/smbus_reply/enable" },} },{ "freq",       "CPU Frequency",    0, {{ REQ,      "events/power/cpu_frequency/enable" },{ OPT,      "events/power/clock_set_rate/enable" },{ OPT,      "events/power/clock_disable/enable" },{ OPT,      "events/power/clock_enable/enable" },{ OPT,      "events/clk/clk_set_rate/enable" },{ OPT,      "events/clk/clk_disable/enable" },{ OPT,      "events/clk/clk_enable/enable" },{ OPT,      "events/power/cpu_frequency_limits/enable" },{ OPT,      "events/power/suspend_resume/enable" },} },{ "membus",     "Memory Bus Utilization", 0, {{ REQ,      "events/memory_bus/enable" },} },{ "idle",       "CPU Idle",         0, {{ REQ,      "events/power/cpu_idle/enable" },} },{ "disk",       "Disk I/O",         0, {{ OPT,      "events/f2fs/f2fs_sync_file_enter/enable" },{ OPT,      "events/f2fs/f2fs_sync_file_exit/enable" },{ OPT,      "events/f2fs/f2fs_write_begin/enable" },{ OPT,      "events/f2fs/f2fs_write_end/enable" },{ OPT,      "events/ext4/ext4_da_write_begin/enable" },{ OPT,      "events/ext4/ext4_da_write_end/enable" },{ OPT,      "events/ext4/ext4_sync_file_enter/enable" },{ OPT,      "events/ext4/ext4_sync_file_exit/enable" },{ REQ,      "events/block/block_rq_issue/enable" },{ REQ,      "events/block/block_rq_complete/enable" },} },{ "mmc",        "eMMC commands",    0, {{ REQ,      "events/mmc/enable" },} },{ "load",       "CPU Load",         0, {{ REQ,      "events/cpufreq_interactive/enable" },} },{ "sync",       "Synchronization",  0, {// linux kernel < 4.9{ OPT,      "events/sync/enable" },// linux kernel == 4.9.x{ OPT,      "events/fence/enable" },// linux kernel > 4.9{ OPT,      "events/dma_fence/enable" },} },{ "workq",      "Kernel Workqueues", 0, {{ REQ,      "events/workqueue/enable" },} },{ "memreclaim", "Kernel Memory Reclaim", 0, {{ REQ,      "events/vmscan/mm_vmscan_direct_reclaim_begin/enable" },{ REQ,      "events/vmscan/mm_vmscan_direct_reclaim_end/enable" },{ REQ,      "events/vmscan/mm_vmscan_kswapd_wake/enable" },{ REQ,      "events/vmscan/mm_vmscan_kswapd_sleep/enable" },{ OPT,      "events/lowmemorykiller/enable" },} },{ "regulators",  "Voltage and Current Regulators", 0, {{ REQ,      "events/regulator/enable" },} },{ "binder_driver", "Binder Kernel driver", 0, {{ REQ,      "events/binder/binder_transaction/enable" },{ REQ,      "events/binder/binder_transaction_received/enable" },{ REQ,      "events/binder/binder_transaction_alloc_buf/enable" },{ OPT,      "events/binder/binder_set_priority/enable" },} },{ "binder_lock", "Binder global lock trace", 0, {{ OPT,      "events/binder/binder_lock/enable" },{ OPT,      "events/binder/binder_locked/enable" },{ OPT,      "events/binder/binder_unlock/enable" },} },{ "pagecache",  "Page cache", 0, {{ REQ,      "events/filemap/enable" },} },{ "memory",  "Memory", 0, {{ OPT,      "events/mm_event/mm_event_record/enable" },{ OPT,      "events/kmem/rss_stat/enable" },{ OPT,      "events/kmem/ion_heap_grow/enable" },{ OPT,      "events/kmem/ion_heap_shrink/enable" },{ OPT,      "events/ion/ion_stat/enable" },} },
};

这篇先到这里,perfetto 文件如何分析,我们后面再聊。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/674486.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言--------指针(1)

0.指针&指针变量 32位平台&#xff0c;指针变量是4个字节&#xff08;32bit/84)--------x86 64位平台&#xff0c;指针变量是8个字节&#xff08;64bit/88)--------x64 编号指针地址&#xff1b;我们平常讲的p是指针就是说p是一个指针变量&#xff1b; ************只要…

gtkmm 与 Cambalache 与 Gtk::Builder (新手向)_

文章目录 前言Cambalache检查Xml.cpp文件如何写才能显示UI首先creat获取ui里的对象显示 前言 新手刚刚使用时的笔记 Cambalache检查Xml 窗口右键inspect UI Definition切换到Xml视图, 可以全选复制粘贴到你的ui文件里, Cambalache 只能保存为.cmb工程文件, 导出也不知道导出…

Django学习记录02

1.请求与响应 1.1get与post的区别 get 一般是从url输入地址&#xff0c;会调用get请求 post 一般是内部数据传输# get请求 def something(request):# req是一个对象&#xff0c;封装了用户发送过来的所有请求相关数据# 1.获取请求方式 http://localhost:8000/something# pri…

springboot基础案例(二)

文章目录 前言一.需求分析: 分析这个项目含有哪些功能模块二.库表设计(概要设计): 1.分析系统有哪些表 2.分析表与表关系 3.确定表中字段(显性字段 隐性字段(业务字段))2.1 创建一个库: ems-thymeleaf2.2 创建 2张表三.编码(环境搭建)1.创建一个springboot项目 项目名字: ems-t…

【自然语言处理-工具篇】spaCy<2>--模型的使用

前言 之前已经介绍了spaCy的安装,接下来我们要通过下载和加载模型去开始使用spaCy。 下载模型 经过训练的 spaCy 管道可以作为 Python 包安装。这意味着它们是应用程序的一个组件,就像任何其他模块一样。可以使用 spaCy download的命令安装模型,也可以通过将 pip 指向路径或…

004集—二调数据库标注分子分母模式及统计净面积——arcgis

二调数据库中分子分母标注方法为&#xff1a; 表达式如下&#xff1a; "<und>"& [TBBH] &"</und>" &vbnewline& [DLBM] "<und>"&[DLBM]&"</und>" &vbnewline& [DLMC] &quo…

一文读懂:MybatisPlus从入门到进阶

快速入门 简介 在项目开发中&#xff0c;Mybatis已经为我们简化了代码编写。 但是我们仍需要编写很多单表CURD语句&#xff0c;MybatisPlus可以进一步简化Mybatis。 MybatisPlus官方文档&#xff1a;https://www.baomidou.com/&#xff0c;感谢苞米豆和黑马程序员。 Mybat…

zk集群--集群同步

1.概述 前面一章分析了集群下启动阶段选举过程&#xff0c;一旦完成选举&#xff0c;通过执行QuorumPeer的setPeerState将设置好选举结束后自身的状态。然后&#xff0c;将再次执行QuorumPeer的run的新的一轮循环&#xff0c; QuorumPeer的run的每一轮循环&#xff0c;先判断…

Python面试题13-18

解释Python中的字典推导式&#xff08;dictionary comprehensions&#xff09;是什么&#xff0c;以及它们的作用&#xff1f; 字典推导式是一种用来创建字典的简洁方式&#xff0c;类似于列表推导式。它允许在一行代码中根据某种规则从可迭代对象中创建字典。解释Python中的虚…

【学网攻】 第(23)节 -- PPP协议

系列文章目录 目录 系列文章目录 文章目录 前言 一、PPP协议是什么&#xff1f; 二、实验 1.引入 实验目的 实验背景你是某公司的网络管理员&#xff0c;现在需要与另一个公司进行通信,需要你配置PPP协议保证双方发送的人是真正的而非黑客 技术原理 实验步骤新建Pack…

【NLP冲吖~】二、隐马尔可夫模型(Hidden Markov model, HMM)

0、马尔可夫模型 某一状态只由前一个状态决定&#xff0c;即为一阶马尔可夫模型&#xff1b; 状态间的转移依赖于前n个状态的过程&#xff0c;即为n阶马尔可夫模型 马尔科夫链&#xff1a; 如果 S t 1 S_{t1} St1​只依赖于前一时刻 S t S_t St​&#xff0c;不依赖于 S 1 , …

Midjourney提示词风格调试测评

在Midjourney中提示词及风格参数的变化无疑会对最终的作品产生影响&#xff0c;那影响具体有多大&#xff1f;今天我我们将通过一个示例进行探究。 示例提示词&#xff1a; 计算机代码海洋中的黄色折纸船&#xff08;图像下方&#xff09;风格参考:金色长发的女人&#xff0c…

单片机——ISP下载、ICP下载、IAP下载

文章目录 ISPICPIAP ISP 在线系统编程&#xff0c;使用引导程序加上外围UART/SPI接口烧录 其本质是将程序的hex文件烧录到板子里的过程 可以使用flymcu这个软件 System memory是STM32在出厂时&#xff0c;由ST在这个区域内部预置了一段BootLoader&#xff0c; 也就是我们常说…

Hair Tool for Blender3D

CGer.com - Hair Tool for Blender3D - CGer资源网 Hair Tool 1.5 for Blender3D 链接: https://pan.baidu.com/s/1kVABn6n 密码: gwprHair Tool 1.65-1.8 for Blender链接: https://pan.baidu.com/s/1A7cW_Ms2baGQ2M0iE1dQhQ 密码: 81bqHair Tool for Blender 1.9.2链接: http…

SpringCache缓存快速实现注解

SpringCache是一个框架&#xff0c;只需要添加一个注解&#xff0c;就能实现缓存功能的实现&#xff0c;常用的就是Redis的缓存实现 依赖 spring-boot-starter-data-redis 与 spring-boot-starter-cache EnableCatching标注在启动类上&#xff0c;开启基于注解的缓存功能 …

【C++】C++的简要介绍

简单不先于复杂&#xff0c;而是在复杂之后。 文章目录 1. 什么是C2. C的发展史3. C的重要性3.1 语言的使用广泛度3.2 在工作领域3.3 在校招领域3.3.1 岗位需求3.3.2 笔试题 3.3.3 面试题 4. 如何学习C4.1 别人怎么学&#xff1f; 1. 什么是C C语言是结构化和模块化的语言&…

深度分析一款新型Linux勒索病毒

前言 DarkRadiation勒索病毒是一款全新的Linux平台下的勒索病毒&#xff0c;2021年5月29日首次在某平台上发布了此勒索病毒的相关的信息&#xff0c;6月中旬趋势科技针对这个新型的勒索病毒进行了相关的分析和报道。 DarkRadiation勒索病毒采用Bash脚本语言编写实现&#xff0…

Acwing---143. 最大异或对

最大异或对 1.题目2.基本思想3.代码实现 1.题目 在给定的 N个整数 A1&#xff0c;A2……AN 中选出两个进行 xor&#xff08;异或&#xff09;运算&#xff0c;得到的结果最大是多少&#xff1f; 输入格式 第一行输入一个整数 N。 第二行输入 N 个整数 A1&#xff5e;AN。 输…

最好的 4 个 Android 屏幕解锁锁软件免费下载

实际上&#xff0c;如今每个 Android 智能手机用户都将手机设置为图案锁定。此功能可以保护隐私&#xff0c;特别是当用户不在打电话时。通过绘制锁定屏幕图案&#xff0c;用户可以解锁手机&#xff0c;然后访问其主屏幕。如果用户被锁定在电话模式之外会发生什么&#xff1f;“…

基于SpringBoot3的快速迭代平台

SpringBoot3的快速开发平台 前言一、技术栈二、项目结构三、总结 前言 MateBoot是一个基于SpringBoot3的快速开发平台&#xff0c;采用前后端分离的模式&#xff0c;前端采用Element Plus组件&#xff0c;后端采用SpringBoot3、Sa-token、Mybatis-Plus、Redis、RabbitMQ、Fast…