前言:雖然有翻譯軟件,雖然有chatgpt,畢竟語言隔閡,對(duì)這個(gè)工具還是一知半解,因此想通過翻譯的方式和大家來一起學(xué)習(xí)下Perfetto這個(gè)強(qiáng)大的工具
#####################以下分割線#####################
英文原文在這里
ATrace:安卓系統(tǒng)和應(yīng)用跟蹤事件
在 Android 上,應(yīng)用可以將自定義切片和計(jì)數(shù)器跟蹤點(diǎn)注入trace。這可以通過以下方法實(shí)現(xiàn):
Java/Kotlin apps (SDK):
android.os.Trace. 參閱 https://developer.android.com/reference/android/os/Trace.Native processes (NDK):
ATrace_beginSection() / ATrace_setCounter()在 中<trace.h>定義。請(qǐng)參閱 https://developer.android.com/ndk/reference/group/tracing.Android 內(nèi)部流程:
ATRACE_BEGIN()/ATRACE_INT()在libcutils/trace.h中定義。
此 API 自 Android 4.3(API 級(jí)別 18)起可用,比 Perfetto更早。所有這些注解在內(nèi)部都是通過libcutils API路由的,現(xiàn)在和將來都將繼續(xù)得到Perfetto的支持。
有兩種類型的trace事件:系統(tǒng)和應(yīng)用事件。
系統(tǒng)事件: :僅由使用 libcutils 的 Android 內(nèi)部發(fā)出。這些事件按類別(也稱為標(biāo)簽)分組,例如“am”(ActivityManager),“pm”(PackageManager)。有關(guān)類別的完整列表,請(qǐng)參閱 Perfetto UI的“Record new trace page of the”頁。
這些類別可用于啟用跨多個(gè)進(jìn)程的事件組,而不必?fù)?dān)心哪個(gè)特定的系統(tǒng)進(jìn)程發(fā)出它們。
應(yīng)用事件: 具有相同的系統(tǒng)事件語義。但是,與系統(tǒng)事件不同的是,它們沒有任何標(biāo)記篩選功能(所有應(yīng)用事件共享同一標(biāo)記 ATRACE_TAG_APP ),但可以基于每個(gè)應(yīng)用啟用。
有關(guān)如何啟用系統(tǒng)和應(yīng)用事件的說明,請(qǐng)參閱下面的 TraceConfig 部分。
檢測開銷
ATrace 每個(gè)事件 1-10us 的不可忽視的成本。這是因?yàn)槊總€(gè)事件都涉及字符串化、JNI 調(diào)用(如果來自native運(yùn)行環(huán)境)以及用戶空間 < >內(nèi)核空間之前的調(diào)用,以將標(biāo)記寫入其中 /sys/kernel/debug/tracing/trace_marker (這是最耗時(shí)的部分)。
我們的團(tuán)隊(duì)專門針對(duì)android,移植一個(gè)輕量版的 Tracing SDK 。但目前,建議繼續(xù)在Android上使用現(xiàn)有的ATrace API。
UI
在 UI 級(jí)別,這些函數(shù)在進(jìn)程組的范圍內(nèi)創(chuàng)建切片和計(jì)數(shù)器,如下所示:

SQL
在 SQL 級(jí)別,ATrace 事件在標(biāo)準(zhǔn) slice 和計(jì)數(shù)表中可用,以及來自其他數(shù)據(jù)源的其他計(jì)數(shù)器和 counter 切片。
切片
select s.ts, t.name as thread_name, t.tid, s.name as slice_name, s.dur
from slice as s left join thread_track as trk on s.track_id = trk.id
left join thread as t on trk.utid = t.utid

計(jì)數(shù)器
select ts, p.name as process_name, p.pid, t.name as counter_name, c.value
from counter as c left join process_counter_track as t on c.track_id = t.id
left join process as p on t.upid = p.upid

跟蹤配置
buffers {
size_kb: 102400
fill_policy: RING_BUFFER
}
data_sources {
config {
name: "linux.ftrace"
ftrace_config {
# Enables specific system events tags.
atrace_categories: "am"
atrace_categories: "pm"
# Enables events for a specific app.
atrace_apps: "com.google.android.apps.docs"
# Enables all events for all apps.
atrace_apps: "*"
}
}
}
#####################以上分割線#####################
后記:
1 本次主要使用百度翻譯,雖然被罵,但至少翻譯這個(gè)工具降低了門檻。
2 英文文檔中的長難句真的是又長又難,基于百度的翻譯,然后自己再調(diào)整下,水平實(shí)在有限。
3 技術(shù)背景知識(shí)不夠,有些專有名詞不知道怎么翻譯,也不知道百度翻譯的是否準(zhǔn)確,功夫在詩外。
4 萬事開頭難,中間難不難,還不知道。中間的事后面再說,正確一天翻譯一篇。
5 雖然可能會(huì)有人不屑,但總要有人去做不起眼的小事。
6 google 厲害,這個(gè)perfetto 工具也很厲害。君子善假于物也。
7 工具的使用是最簡單的入門,背后還有更多的東西值得學(xué)習(xí)。
8 水平實(shí)在有限,聞過則喜,希望有更多的人反饋,期待更好的建議