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 12解决push framework.jar无法开机的方法小结

《Android12解决pushframework.jar无法开机的方法小结》:本文主要介绍在Android12中解决pushframework.jar无法开机的方法,包括编译指令、框架层和s... 目录1. android 编译指令1.1 framework层的编译指令1.2 替换framework.ja

Android开发环境配置避坑指南

《Android开发环境配置避坑指南》本文主要介绍了Android开发环境配置过程中遇到的问题及解决方案,包括VPN注意事项、工具版本统一、Gerrit邮箱配置、Git拉取和提交代码、MergevsR... 目录网络环境:VPN 注意事项工具版本统一:android Studio & JDKGerrit的邮

Android实现定时任务的几种方式汇总(附源码)

《Android实现定时任务的几种方式汇总(附源码)》在Android应用中,定时任务(ScheduledTask)的需求几乎无处不在:从定时刷新数据、定时备份、定时推送通知,到夜间静默下载、循环执行... 目录一、项目介绍1. 背景与意义二、相关基础知识与系统约束三、方案一:Handler.postDel

慢sql提前分析预警和动态sql替换-Mybatis-SQL

《慢sql提前分析预警和动态sql替换-Mybatis-SQL》为防止慢SQL问题而开发的MyBatis组件,该组件能够在开发、测试阶段自动分析SQL语句,并在出现慢SQL问题时通过Ducc配置实现动... 目录背景解决思路开源方案调研设计方案详细设计使用方法1、引入依赖jar包2、配置组件XML3、核心配

Java NoClassDefFoundError运行时错误分析解决

《JavaNoClassDefFoundError运行时错误分析解决》在Java开发中,NoClassDefFoundError是一种常见的运行时错误,它通常表明Java虚拟机在尝试加载一个类时未能... 目录前言一、问题分析二、报错原因三、解决思路检查类路径配置检查依赖库检查类文件调试类加载器问题四、常见

Python中的Walrus运算符分析示例详解

《Python中的Walrus运算符分析示例详解》Python中的Walrus运算符(:=)是Python3.8引入的一个新特性,允许在表达式中同时赋值和返回值,它的核心作用是减少重复计算,提升代码简... 目录1. 在循环中避免重复计算2. 在条件判断中同时赋值变量3. 在列表推导式或字典推导式中简化逻辑

Android使用ImageView.ScaleType实现图片的缩放与裁剪功能

《Android使用ImageView.ScaleType实现图片的缩放与裁剪功能》ImageView是最常用的控件之一,它用于展示各种类型的图片,为了能够根据需求调整图片的显示效果,Android提... 目录什么是 ImageView.ScaleType?FIT_XYFIT_STARTFIT_CENTE

Android实现在线预览office文档的示例详解

《Android实现在线预览office文档的示例详解》在移动端展示在线Office文档(如Word、Excel、PPT)是一项常见需求,这篇文章为大家重点介绍了两种方案的实现方法,希望对大家有一定的... 目录一、项目概述二、相关技术知识三、实现思路3.1 方案一:WebView + Office Onl

Android实现两台手机屏幕共享和远程控制功能

《Android实现两台手机屏幕共享和远程控制功能》在远程协助、在线教学、技术支持等多种场景下,实时获得另一部移动设备的屏幕画面,并对其进行操作,具有极高的应用价值,本项目旨在实现两台Android手... 目录一、项目概述二、相关知识2.1 MediaProjection API2.2 Socket 网络

Java程序进程起来了但是不打印日志的原因分析

《Java程序进程起来了但是不打印日志的原因分析》:本文主要介绍Java程序进程起来了但是不打印日志的原因分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java程序进程起来了但是不打印日志的原因1、日志配置问题2、日志文件权限问题3、日志文件路径问题4、程序