--------------------------------------------------------------

这篇文章的小目标:

1. systrace是怎么抓出来的

2. 这些信息的来源是什么

------------------------------------

[Android systrace系列] systrace入门第一式 介绍了用命令行抓取systrace的方法。

打开systrace.py的目录,会发现一大堆python文件,让人以为抓取systrace的流程很复杂。

其实不然,systrace是附属于catapult这个项目(传送门),是一个抓trace的框架,而且不仅仅为Andorid服务。

打开/catapult/systrace/systrace/tracing_agents,我们就能发现很多抓trace的agent,这是抓不同类型信息对应的代码逻辑。

抓Android默认用到这三个agent,对应三类信息:

atrace_agent(atrace,负责收集用户空间打印的systrace log和kernel ftrace事件)

android_process_data_agent(ps命令,用来对应进程名与PID)

android_cgroup_agent(cgroup中cpuset子系统,市面销售的机器不一定能抓到)

atrace抓取的信息是Android systrace中最核心的部分。

通过atrace_agent.py的函数StartAgentTracing和StopAgentTracing,我们终于知道了systrace的主要部分是通过atrace命令抓取的。

实质上,只抓取atrace就可以生成systrace html文件了。

虽然使用systrace.py是抓取systrace最常规的方法,但如果要在测试脚本加入抓systrace的操作,我认为atrace命令是最直接的方法,也可以节省测试脚本的运行时间。

这也有助于了解systrace的细节,衍生出更多技巧。

0. 执行adb shell atrace --list_categories,选择你需要的log类别

1. adb shell atrace --async_start -b 8192 gfx input view webview wm am sm audio video camera hal res dalvik rs bionic power pm ss database network sched freq idle disk sync memreclaim binder_driver binder_lock gfx ion

2. 重现问题,现象出现后,执行 adb shell atrace --async_stop -z > a.out

3. 事后转换成html文件,systrace.py --from-file a.out -o a.html

现在我们阅读atrace的代码,寻找更多细节。

代码路径://android/frameworks/native/cmds/atrace/atrace.cpp

这个数组,就是之前提到的systrace信息的两大来源,用户空间打印的systrace log和kernel ftrace事件。

用户空间systrace log:ATRACE_TAG 开头的

kernel ftrace:events开头的

static const TracingCategory k_categories[] = {
{ "gfx", "Graphics", ATRACE_TAG_GRAPHICS, {
{ OPT, "events/mdss/enable" },
{ OPT, "events/sde/enable" },
} },
{ "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, { } },
{ 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/cgroup/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" },
} },
{ "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, {
// before linux kernel 4.9
{ OPT, "events/sync/enable" },
// starting in linux kernel 4.9
{ OPT, "events/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" },
{ 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" },
} },
};

各个ATRACE_TAG_XXX的功能是掩码,在 //android/system/core/include/cutils/trace.h 的函数

static inline void atrace_begin(uint64_t tag, const char* name) 中控制是否写入相应TAG的log。

systrace在各层的调用接口,以及最终systrace的log格式如下表:

跟踪上表的代码很容易会发现,用户空间的systrace log,最终通过libcutils的接口,写入到

手机的 /sys/kernel/debug/tracing/trace_marker,就是写入到kernel ftrace的buffer中。

用户空间打印的systrace log 和 kernel ftrace事件在这里胜利会师了。

用纯文本打开systrace html 文件,除了上述两类log,开头还有一大段Javascript。

通过Javascript的解析处理,呈现出systrace可视化的分析界面。

转载请注明出处:https://www.cnblogs.com/zzcperf/p/14052681.html

[Android systrace系列] systrace的信息从哪里来的更多相关文章

  1. [Android systrace系列] systrace入门第一式

    转载请注明出处:https://www.cnblogs.com/zzcperf/p/13978915.html Android systrace是分析性能问题最称手的工具之一,可以提供丰富的手机运行信 ...

  2. [Android systrace系列] 抓取开机过程systrace

    ------------------------------------------------------------------------- 这篇文章的小目标:了解抓取开机过程systrace的 ...

  3. Android:通过systrace进行性能分析

    一.Systrace 简介 Systrace 允许您在系统级别(如SurfaceFlinger.WindowManagerService等Framework部分关键模块.服务.View系统等)收集和检 ...

  4. Android拓展系列(11)--打造Windows下便携的Android源码阅读环境

    因为EXT和NTFS格式的差异,我一直对于windows下阅读Android源码感到不满. 前几天,想把最新的android5.0的源码下下来研究一下,而平时日常使用的又是windows环境,于是专门 ...

  5. Android UI系列-----时间、日期、Toasts和进度条Dialog

    您可以通过点击 右下角 的按钮 来对文章内容作出评价, 也可以通过左下方的 关注按钮 来关注我的博客的最新动态. 如果文章内容对您有帮助, 不要忘记点击右下角的 推荐按钮 来支持一下哦 如果您对文章内 ...

  6. Android Studio系列教程五--Gradle命令详解与导入第三方包

    Android Studio系列教程五--Gradle命令详解与导入第三方包 2015 年 01 月 05 日 DevTools 本文为个人原创,欢迎转载,但请务必在明显位置注明出处!http://s ...

  7. 一个异常与Android Studio系列教程参考

    由于编译过程中遇到了错误:

  8. android开发系列之gradle认识

    后面的系列博客,我将会写一写自己这段时间对于android的学习.认识.体会,希望能够与大家分享. 相信大家从ADT开发切换到android studio最大.最直观的变化就是gradle,因为在an ...

  9. Android学习系列(7)--App轮询服务器消息

    这篇文章是android开发人员的必备知识. 1.轮询服务器     一般的应用,定时通知消息可以采用轮询的方法从服务器拿取消息,当然实时消息通知的话,建议采用推送服务.    其中需要注意轮询的频率 ...

随机推荐

  1. pycharm新建项目时选择virtualenv的说明

    虚拟环境及venv和virtualenv介绍:https://www.cnblogs.com/mind18/p/13877170.html pip介绍:https://www.cnblogs.com/ ...

  2. CF1413C Perform Easily 题解

    毒瘤C题,考场卡我1个小时 首先,这道题难点在哪里?它的最大值与最小值都是浮动的. 怎么办?把最小/最大值固定! 以把最小值固定为例,我们枚举每个音符,并枚举它使用哪条琴弦,将它此时的位置强制其作为最 ...

  3. 【原创】ARM平台内存和cache对xenomai实时性的影响

    目录 1. 问题概述 2. stress 内存压力原理 2. cache 因素 2.1 未加压 2.2 加压(cpu/io) 3. 内存管理因素 3.1 内存分配/释放 3.2 MMU拥塞 4 总结 ...

  4. POI做题记录

    嘿嘿,偷学一波! 由于博主做的题比较少,所以没按年份整理,直接按照做题时间放上来了. 2020年9月20日 [POI2013]LUK-Triumphal arch 给你一颗\(n\)个点的树(\(n\ ...

  5. Preparation for MCM/ICM Writing

    Preparation for MCM/ICM Writing -- by Chance Zhang $1^{st}ed$ key words: MCM/ICM, format, phrases, t ...

  6. unix进程间通信方式(IPC)

    unix进程间通信方式(IPC) 管道(Pipe):管道可用于具有亲缘关系进程间的通信,允许一个进程和另一个与它有共同祖先的进程之间进行通信. 命名管道(named pipe):命名管道克服了管道没有 ...

  7. nginx负载均衡基本配置和日志按天写

    简单记录一下. upstream dynamic_pools{        server 127.0.0.1:8080;    } #动态命令转交给后端        location /api   ...

  8. C++ 设计模式 4:行为型模式

    0 行为型模式 类或对象怎样交互以及怎样分配职责,这些设计模式特别关注对象之间的通信. 1 模板模式 模板模式(Template Pattern)定义:一个抽象类公开定义了执行它的方法的方式/模板.它 ...

  9. netfilter 的扩展功能

    目前内核已经有filter 功能,但是往往实际运用中需要用到一些定制的filter  功能, 所以这个时候仅仅依靠现有的不能完成,于是就出现了conntrack的扩展功能, 最直接的就是tftp he ...

  10. Socket connect 等简要分析

    connect 系统调用 分析 #include <sys/types.h> /* See NOTES */#include <sys/socket.h>int connect ...