根据fadden的指针,用一些代码发布后续答案。请先阅读他/她的答案以获得概述。
只需将格式正确的字符串写入/sys/kernel/debug/tracing/trace_marker
,即可毫无问题地打开。下面是一些基于cutils 头文件和C 文件的极简代码。我更喜欢重新实现它而不是引入任何依赖项,所以如果您非常关心正确性,请检查那里的严格实现,和/或添加您自己的额外检查和错误处理。
这经过测试可以在 Android 4.4.2 上运行。
必须首先打开跟踪文件,将文件描述符保存在atrace_marker_fd
全局中:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#define ATRACE_MESSAGE_LEN 256
int atrace_marker_fd = -1;
void trace_init()
{
atrace_marker_fd = open("/sys/kernel/debug/tracing/trace_marker", O_WRONLY);
if (atrace_marker_fd == -1) { /* do error handling */ }
}
正常的“嵌套”跟踪,如 Java Trace.beginSection
,Trace.endSection
通过以下方式获得:
inline void trace_begin(const char *name)
{
char buf[ATRACE_MESSAGE_LEN];
int len = snprintf(buf, ATRACE_MESSAGE_LEN, "B|%d|%s", getpid(), name);
write(atrace_marker_fd, buf, len);
}
inline void trace_end()
{
char c = 'E';
write(atrace_marker_fd, &c, 1);
}
还有两种可用的跟踪类型,据我所知,Java 无法访问它们:跟踪计数器和异步跟踪。
计数器跟踪整数的值并在 systrace HTML 输出中绘制一个小图。非常有用的东西:
inline void trace_counter(const char *name, const int value)
{
char buf[ATRACE_MESSAGE_LEN];
int len = snprintf(buf, ATRACE_MESSAGE_LEN, "C|%d|%s|%i", getpid(), name, value);
write(atrace_marker_fd, buf, len);
}
异步跟踪产生非嵌套(即简单地重叠)间隔。它们在 systrace HTML 输出中显示为细线状态栏上方的灰色段。它们采用额外的 32 位整数参数来“区分同时发生的事件”。结束跟踪时必须使用相同的名称和整数:
inline void trace_async_begin(const char *name, const int32_t cookie)
{
char buf[ATRACE_MESSAGE_LEN];
int len = snprintf(buf, ATRACE_MESSAGE_LEN, "S|%d|%s|%i", getpid(), name, cookie);
write(atrace_marker_fd, buf, len);
}
inline void trace_async_end(const char *name, const int32_t cookie)
{
char buf[ATRACE_MESSAGE_LEN];
int len = snprintf(buf, ATRACE_MESSAGE_LEN, "F|%d|%s|%i", getpid(), name, cookie);
write(atrace_marker_fd, buf, len);
}
最后,除了重新编译 Android 之外,似乎确实没有办法指定记录时间,所以这对“额外的扭曲”没有任何作用。