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

相关文章

Nginx分布式部署流程分析

《Nginx分布式部署流程分析》文章介绍Nginx在分布式部署中的反向代理和负载均衡作用,用于分发请求、减轻服务器压力及解决session共享问题,涵盖配置方法、策略及Java项目应用,并提及分布式事... 目录分布式部署NginxJava中的代理代理分为正向代理和反向代理正向代理反向代理Nginx应用场景

Redis中的有序集合zset从使用到原理分析

《Redis中的有序集合zset从使用到原理分析》Redis有序集合(zset)是字符串与分值的有序映射,通过跳跃表和哈希表结合实现高效有序性管理,适用于排行榜、延迟队列等场景,其时间复杂度低,内存占... 目录开篇:排行榜背后的秘密一、zset的基本使用1.1 常用命令1.2 Java客户端示例二、zse

Redis中的AOF原理及分析

《Redis中的AOF原理及分析》Redis的AOF通过记录所有写操作命令实现持久化,支持always/everysec/no三种同步策略,重写机制优化文件体积,与RDB结合可平衡数据安全与恢复效率... 目录开篇:从日记本到AOF一、AOF的基本执行流程1. 命令执行与记录2. AOF重写机制二、AOF的

MyBatis Plus大数据量查询慢原因分析及解决

《MyBatisPlus大数据量查询慢原因分析及解决》大数据量查询慢常因全表扫描、分页不当、索引缺失、内存占用高及ORM开销,优化措施包括分页查询、流式读取、SQL优化、批处理、多数据源、结果集二次... 目录大数据量查询慢的常见原因优化方案高级方案配置调优监控与诊断总结大数据量查询慢的常见原因MyBAT

分析 Java Stream 的 peek使用实践与副作用处理方案

《分析JavaStream的peek使用实践与副作用处理方案》StreamAPI的peek操作是中间操作,用于观察元素但不终止流,其副作用风险包括线程安全、顺序混乱及性能问题,合理使用场景有限... 目录一、peek 操作的本质:有状态的中间操作二、副作用的定义与风险场景1. 并行流下的线程安全问题2. 顺

MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决

《MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决》MyBatis默认开启一级缓存,同一事务中循环调用查询方法时会重复使用缓存数据,导致获取的序列主键值均为1,... 目录问题原因解决办法如果是存储过程总结问题myBATis有如下代码获取序列作为主键IdMappe

Java中最全最基础的IO流概述和简介案例分析

《Java中最全最基础的IO流概述和简介案例分析》JavaIO流用于程序与外部设备的数据交互,分为字节流(InputStream/OutputStream)和字符流(Reader/Writer),处理... 目录IO流简介IO是什么应用场景IO流的分类流的超类类型字节文件流应用简介核心API文件输出流应用文

Docker多阶段镜像构建与缓存利用性能优化实践指南

《Docker多阶段镜像构建与缓存利用性能优化实践指南》这篇文章将从原理层面深入解析Docker多阶段构建与缓存机制,结合实际项目示例,说明如何有效利用构建缓存,组织镜像层次,最大化提升构建速度并减少... 目录一、技术背景与应用场景二、核心原理深入分析三、关键 dockerfile 解读3.1 Docke

Android实现图片浏览功能的示例详解(附带源码)

《Android实现图片浏览功能的示例详解(附带源码)》在许多应用中,都需要展示图片并支持用户进行浏览,本文主要为大家介绍了如何通过Android实现图片浏览功能,感兴趣的小伙伴可以跟随小编一起学习一... 目录一、项目背景详细介绍二、项目需求详细介绍三、相关技术详细介绍四、实现思路详细介绍五、完整实现代码

在Android中使用WebView在线查看PDF文件的方法示例

《在Android中使用WebView在线查看PDF文件的方法示例》在Android应用开发中,有时我们需要在客户端展示PDF文件,以便用户可以阅读或交互,:本文主要介绍在Android中使用We... 目录简介:1. WebView组件介绍2. 在androidManifest.XML中添加Interne