一、基礎實現方法
1.1 頭文件引用
#include <utils/Trace.h> // 基礎版本
#include <cutils/trace.h> // 兼容舊版本
1.2 核心宏定義
// 區間追蹤(推薦)
ATRACE_BEGIN("TraceTag");
...被監控代碼...
ATRACE_END();// 函數級自動追蹤
void criticalFunction() {ATRACE_CALL(); // 自動記錄函數名
}// 獨立標記
ATRACE_NAME("Frame_Submission");
二、進階用法
2.1 異步追蹤
// 跨線程/跨進程追蹤
const int64_t asyncCookie = 12345;
ATRACE_ASYNC_BEGIN("GPU_Upload", asyncCookie);
...
ATRACE_ASYNC_END("GPU_Upload", asyncCookie);
2.2 計數器追蹤
// 監控變量值變化
ATRACE_INT("PendingBuffers", mBufferQueue.size());
2.3 條件追蹤
if (ATRACE_ENABLED()) {ATRACE_BEGIN("ExpensiveTrace");
}
三、參數規范
參數類型 | 規范要求 |
---|---|
標簽命名 | 模塊_功能(如SF_Composite) |
單標簽長度 | ≤32字符(內核限制) |
嵌套深度 | ≤7層 |
單次區間時長 | 建議≥50μs |
四、編譯配置
4.1 模塊級配置
LOCAL_CFLAGS += -DTRACE_ENABLED=1
LOCAL_SHARED_LIBRARIES += libutils
4.2 全局配置
# 內核配置
adb shell "echo 1 > /sys/kernel/debug/tracing/events/enable"
五、調試驗證
5.1 實時調試
# 查看當前trace標簽
adb shell atrace --list_categories# 監控指定標簽
adb shell atrace -b 32768 gfx view sched freq am wm ss res dalvik rs -t 10
5.2 Perfetto采集
adb shell perfetto -o /data/misc/perfetto-traces/trace \
-t 10s --txt \
-c /etc/perfetto/configs/atrace.cfg
六、結果分析技巧
- 時間軸對齊:在Perfetto中通過
M
鍵對齊VSYNC信號 - 關鍵指標篩選:
SELECT name, AVG(dur) FROM slice WHERE name LIKE 'SF_%' GROUP BY name ORDER BY dur DESC
- 線程阻塞分析:結合
sched_wakeup
事件跟蹤鎖競爭
七、性能優化建議
- 高頻調用優化:
// 使用輕量級計數器代替區間追蹤
ATRACE_INT("InputEvents", mEventCount++);
- 條件編譯控制:
#if ATRACE_LEVEL >= ATRACE_LEVEL_DEBUGATRACE_BEGIN("DebugTrace");
#endif
- 自動作用域管理:
class AutoTrace {
public:AutoTrace(const char* name) { ATRACE_BEGIN(name); }~AutoTrace() { ATRACE_END(); }
};void renderFrame() {AutoTrace _t("Render");// 自動結束追蹤
}
八、常見問題排查
-
Trace未顯示:
- 檢查
ATRACE_ENABLED()
返回值 - 確認內核ftrace已啟用
- 驗證標簽是否在監控白名單中
- 檢查
-
時間戳異常:
adb shell "echo global > /sys/kernel/debug/tracing/trace_clock"
-
內存溢出:
adb shell "echo 8192 > /sys/kernel/debug/tracing/buffer_size_kb"
九、實戰案例
SurfaceFlinger合成耗時分析
void SurfaceFlinger::composite() {ATRACE_CALL();ATRACE_BEGIN("PreComposite");preComposition();ATRACE_END();{AutoTrace _t("RenderEngine");mRenderEngine->drawLayers();}ATRACE_INT("ActiveLayers", mLayers.size());
}
分析結果:
RenderEngine
階段出現>8ms耗時- 當
ActiveLayers
超過16層時性能顯著下降
附錄資源:
- ftrace官方文檔
- Perfetto SQL分析手冊
- 推薦調試工具:
- Perfetto UI
- systrace.py (legacy)
- Catapult Trace Viewer
通過合理配置Native層Trace監控,開發者可以精準定位渲染延遲、線程調度、內存競爭等底層性能問題。建議結合自動化分析腳本實現持續性能監控。