Android Perfetto 性能分析

2024-02-08 05:36
文章标签 分析 android 性能 perfetto

本文主要是介绍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 文件如何分析,我们后面再聊。

这篇关于Android Perfetto 性能分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/690040

相关文章

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

Springboot中分析SQL性能的两种方式详解

《Springboot中分析SQL性能的两种方式详解》文章介绍了SQL性能分析的两种方式:MyBatis-Plus性能分析插件和p6spy框架,MyBatis-Plus插件配置简单,适用于开发和测试环... 目录SQL性能分析的两种方式:功能介绍实现方式:实现步骤:SQL性能分析的两种方式:功能介绍记录

Android里面的Service种类以及启动方式

《Android里面的Service种类以及启动方式》Android中的Service分为前台服务和后台服务,前台服务需要亮身份牌并显示通知,后台服务则有启动方式选择,包括startService和b... 目录一句话总结:一、Service 的两种类型:1. 前台服务(必须亮身份牌)2. 后台服务(偷偷干

最长公共子序列问题的深度分析与Java实现方式

《最长公共子序列问题的深度分析与Java实现方式》本文详细介绍了最长公共子序列(LCS)问题,包括其概念、暴力解法、动态规划解法,并提供了Java代码实现,暴力解法虽然简单,但在大数据处理中效率较低,... 目录最长公共子序列问题概述问题理解与示例分析暴力解法思路与示例代码动态规划解法DP 表的构建与意义动

Tomcat高效部署与性能优化方式

《Tomcat高效部署与性能优化方式》本文介绍了如何高效部署Tomcat并进行性能优化,以确保Web应用的稳定运行和高效响应,高效部署包括环境准备、安装Tomcat、配置Tomcat、部署应用和启动T... 目录Tomcat高效部署与性能优化一、引言二、Tomcat高效部署三、Tomcat性能优化总结Tom

C#使用DeepSeek API实现自然语言处理,文本分类和情感分析

《C#使用DeepSeekAPI实现自然语言处理,文本分类和情感分析》在C#中使用DeepSeekAPI可以实现多种功能,例如自然语言处理、文本分类、情感分析等,本文主要为大家介绍了具体实现步骤,... 目录准备工作文本生成文本分类问答系统代码生成翻译功能文本摘要文本校对图像描述生成总结在C#中使用Deep

Android kotlin语言实现删除文件的解决方案

《Androidkotlin语言实现删除文件的解决方案》:本文主要介绍Androidkotlin语言实现删除文件的解决方案,在项目开发过程中,尤其是需要跨平台协作的项目,那么删除用户指定的文件的... 目录一、前言二、适用环境三、模板内容1.权限申请2.Activity中的模板一、前言在项目开发过程中,尤

C#使用yield关键字实现提升迭代性能与效率

《C#使用yield关键字实现提升迭代性能与效率》yield关键字在C#中简化了数据迭代的方式,实现了按需生成数据,自动维护迭代状态,本文主要来聊聊如何使用yield关键字实现提升迭代性能与效率,感兴... 目录前言传统迭代和yield迭代方式对比yield延迟加载按需获取数据yield break显式示迭

Redis主从/哨兵机制原理分析

《Redis主从/哨兵机制原理分析》本文介绍了Redis的主从复制和哨兵机制,主从复制实现了数据的热备份和负载均衡,而哨兵机制可以监控Redis集群,实现自动故障转移,哨兵机制通过监控、下线、选举和故... 目录一、主从复制1.1 什么是主从复制1.2 主从复制的作用1.3 主从复制原理1.3.1 全量复制

Redis主从复制的原理分析

《Redis主从复制的原理分析》Redis主从复制通过将数据镜像到多个从节点,实现高可用性和扩展性,主从复制包括初次全量同步和增量同步两个阶段,为优化复制性能,可以采用AOF持久化、调整复制超时时间、... 目录Redis主从复制的原理主从复制概述配置主从复制数据同步过程复制一致性与延迟故障转移机制监控与维