根據fadden的指針,用一些代碼發佈後續答案。請首先閱讀他/她的回答以獲得概述。
只需將正確格式化的字符串寫入/sys/kernel/debug/tracing/trace_marker
即可正常打開,而且不會出現問題。以下是基於cutils header和C file的一些非常簡單的代碼。我更願意重新實現它,而不是牽扯任何依賴關係,所以如果你關心正確性,請檢查那裏的嚴格實現,和/或添加自己的額外檢查和錯誤處理。
這已經過測試,可在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的方式,所以這不會對「獎金做什麼捻」。
非常感謝你的偉大的指針!它還解決了我關於人們如何在systrace輸出中獲取跟蹤計數器的另一個問題......我已經在一個單獨的答案中添加了一些解決方案的實現代碼。留下你的接受答案。 –