級跟蹤實戰(zhàn)指南)
1. 項目概述為什么我們需要systrace與perfetto在Android應(yīng)用和系統(tǒng)性能優(yōu)化的戰(zhàn)場上性能問題往往像幽靈一樣難以捉摸。應(yīng)用啟動慢了一拍列表滑動偶爾掉幀或者后臺服務(wù)莫名耗電這些現(xiàn)象背后是CPU調(diào)度、圖形渲染、鎖競爭、IO阻塞等一系列復(fù)雜系統(tǒng)行為的綜合結(jié)果。作為一名開發(fā)者如果只盯著自己應(yīng)用的代碼無異于盲人摸象。你需要一雙能透視整個Android系統(tǒng)運行狀態(tài)的“眼睛”這就是systrace和它的繼任者perfetto。簡單來說systrace和perfetto是Android平臺最核心的系統(tǒng)級性能剖析工具。它們不是用來分析某個函數(shù)耗時的Profiler而是記錄系統(tǒng)在特定時間段內(nèi)發(fā)生的所有關(guān)鍵事件并將這些事件以時間線的形式可視化出來。你可以看到每個CPU核心上正在運行哪個線程、線程在等待什么鎖、SurfaceFlinger何時進(jìn)行合成、Binder調(diào)用了多久、甚至電量管理模塊何時進(jìn)入了休眠狀態(tài)。通過這張宏觀的“交響樂譜”你能精準(zhǔn)定位出是哪個“樂手”進(jìn)程/線程在哪個“小節(jié)”時間點出了問題導(dǎo)致整場“演出”用戶體驗卡頓。atrace是systrace數(shù)據(jù)采集的命令行前端而perfetto則是Google推出的新一代、功能更強(qiáng)大的全平臺跟蹤解決方案正在逐步取代傳統(tǒng)的systrace。掌握它們意味著你拿到了從系統(tǒng)層面根治性能頑疾的“手術(shù)刀”。無論是應(yīng)用開發(fā)、系統(tǒng)框架開發(fā)還是驅(qū)動調(diào)試這都是不可或缺的硬核技能。2. 工具選型解析atrace(systrace) 與 perfetto 的定位與抉擇在開始動手之前我們必須理清atrace代表systrace和perfetto的關(guān)系與區(qū)別這決定了你后續(xù)工作流的選擇。很多人會混淆這里徹底講明白。2.1 atrace 與 systrace 的關(guān)系首先明確一個概念我們常說的“抓取systrace”這個動作通常是通過atrace命令來完成的。atrace是Android系統(tǒng)中的一個命令行工具它的作用是啟用和配置內(nèi)核及系統(tǒng)服務(wù)的跟蹤點tracepoints并將跟蹤數(shù)據(jù)寫入緩沖區(qū)。而systrace.py是一個Python腳本位于Android SDK的platform-tools/systrace目錄下它實際上是一個封裝好的自動化腳本。它的工作流程是通過ADB連接設(shè)備。在設(shè)備上執(zhí)行atrace命令并指定要抓取的類別如gfx,view,sched。將atrace輸出的原始數(shù)據(jù)流抓取到本地。調(diào)用python的trace2html模塊將原始數(shù)據(jù)轉(zhuǎn)換為可視化的HTML網(wǎng)頁。所以atrace是底層的數(shù)據(jù)采集器systrace是包含采集、轉(zhuǎn)換、可視化的一整套前端工具鏈。我們說的“使用systrace”默認(rèn)指的就是使用systrace.py這個腳本。2.2 perfetto 的革新與優(yōu)勢Perfetto是Google在Android 10API 29中正式引入并逐漸成為Android 11推薦使用的下一代系統(tǒng)跟蹤框架。它并非systrace的簡單升級而是一個全新的、更強(qiáng)大的體系。核心優(yōu)勢對比特性維度atrace (systrace)perfetto架構(gòu)基于Linux內(nèi)核的ftrace上層通過atrace封裝。全新的、高性能的用戶態(tài)和內(nèi)核態(tài)跟蹤守護(hù)進(jìn)程traced支持更多數(shù)據(jù)源。數(shù)據(jù)源主要依賴內(nèi)核ftrace擴(kuò)展性有限。原生支持ftrace并集成heap profiling內(nèi)存堆分析、native memory dumps、Android Logcat、電源管理事件等是真正的“一站式”平臺。配置方式命令行參數(shù)相對簡單但功能有限。強(qiáng)大的TraceConfig協(xié)議緩沖區(qū)protobuf配置可以極其精細(xì)地控制跟蹤時長、緩沖區(qū)大小、數(shù)據(jù)源開關(guān)、觸發(fā)條件等。跟蹤時長通常用于短時間如5-10秒的跟蹤。支持超長時間跟蹤數(shù)小時甚至數(shù)天數(shù)據(jù)會滾動寫入磁盤用于分析間歇性、難以復(fù)現(xiàn)的問題??梢暬瑟毩⒌腍TML文件在Chrome瀏覽器中打開chrome://tracing。使用更現(xiàn)代的Perfetto UI在線網(wǎng)址ui.perfetto.dev或本地部署界面更友好分析功能更強(qiáng)大如SQL查詢跟蹤數(shù)據(jù)。開銷相對較低。設(shè)計目標(biāo)就是高性能、低開銷即使長時間開啟對系統(tǒng)影響也極小。 注意從Android 12開始systrace腳本底層實際上已經(jīng)調(diào)用perfetto來捕獲ftrace數(shù)據(jù)了。但為了兼容性和操作習(xí)慣systrace.py這個入口依然保留。如何選擇新手入門、快速抓取從systrace.py開始語法簡單上手快能滿足大部分UI性能分析如卡頓、掉幀的需求。深度分析、復(fù)雜場景必須使用perfetto。例如需要分析內(nèi)存增長、跟蹤native代碼、進(jìn)行長時間功耗記錄、或者需要復(fù)雜的觸發(fā)條件時。Android 11 設(shè)備強(qiáng)烈建議直接學(xué)習(xí)并使用perfetto這是未來的方向。3. 環(huán)境準(zhǔn)備與基礎(chǔ)配置工欲善其事必先利其器。無論使用哪種工具都需要準(zhǔn)備好基礎(chǔ)環(huán)境。3.1 開發(fā)機(jī)環(huán)境準(zhǔn)備安裝Pythonsystrace.py是一個Python 2.7/3.x腳本確保你的開發(fā)機(jī)Windows/Mac/Linux已安裝Python并已添加到環(huán)境變量PATH中。安裝Android SDK Platform-Tools這是必須的因為它包含了ADBAndroid Debug Bridge和systrace腳本。如果你使用Android Studio它通常已自動安裝。你也可以從 Android開發(fā)者官網(wǎng) 單獨下載。 將platform-tools目錄的路徑添加到系統(tǒng)的PATH環(huán)境變量中以便在終端中直接使用adb和systrace.py命令。安裝Chrome瀏覽器用于可視化systrace生成的HTML文件chrome://tracing。Perfetto UI也推薦使用Chrome打開。3.2 設(shè)備端配置跟蹤功能需要設(shè)備端的支持并且通常需要開啟開發(fā)者選項和USB調(diào)試。啟用開發(fā)者選項在設(shè)備的“設(shè)置”-“關(guān)于手機(jī)”中連續(xù)點擊“版本號”7次。開啟USB調(diào)試進(jìn)入“設(shè)置”-“系統(tǒng)”-“開發(fā)者選項”找到“USB調(diào)試”并開啟??蛇x的設(shè)備端設(shè)置針對非Root設(shè)備對于systrace在“開發(fā)者選項”中找到“監(jiān)控”或“調(diào)試”類別確保“啟用跟蹤”或類似的選項是開啟的。有些廠商設(shè)備可能需要額外開啟“GPU渲染模式分析”等。對于perfettoPerfetto服務(wù)traced在Android 9上默認(rèn)運行。為了允許非Root的ADB連接進(jìn)行跟蹤你需要開啟一個額外的開關(guān)adb shell setprop persist.traced.enable 1執(zhí)行后重啟設(shè)備。這個設(shè)置允許通過ADB使用perfetto。 重要提示在生產(chǎn)環(huán)境或用戶設(shè)備上抓取trace尤其是長時間抓取可能會涉及隱私和性能問題。務(wù)必在測試設(shè)備上進(jìn)行并告知相關(guān)方。3.3 連接與驗證使用USB線連接設(shè)備和開發(fā)機(jī)在終端執(zhí)行adb devices如果看到設(shè)備序列號后面顯示device則表示連接成功。這是所有后續(xù)操作的基礎(chǔ)。4. 使用 atrace 和 systrace.py 進(jìn)行跟蹤這是最經(jīng)典、最常用的快速抓取方式特別適合分析動畫、列表滑動、應(yīng)用啟動等場景的卡頓。4.1 systrace.py 命令行實戰(zhàn)systrace.py命令的基本語法如下python systrace.py [options] [categories...]它位于android-sdk/platform-tools/systrace/目錄下。為了方便我們可以進(jìn)入該目錄執(zhí)行或?qū)⒋四夸浖尤隤ATH。一個最常用的抓取UI性能trace的命令示例cd /path/to/android-sdk/platform-tools/systrace python systrace.py -t 5 -o my_trace.html gfx view sched freq idle am wm讓我們拆解這個命令-t 5指定跟蹤時間為5秒。你需要在命令執(zhí)行后立即在設(shè)備上操作你想分析的應(yīng)用例如快速滑動列表。5秒后trace會自動停止并生成文件。-o my_trace.html指定輸出文件名為my_trace.html。gfx view sched freq idle am wm這是跟蹤類別categories決定了采集哪些系統(tǒng)事件。這是命令的核心。gfx圖形相關(guān)事件包括SurfaceFlinger、VSYNC、應(yīng)用UI線程的繪制等。分析卡頓必選。viewView系統(tǒng)事件如measure、layout、draw。schedCPU調(diào)度信息。必選可以看到每個線程在哪個CPU核心上運行、何時被切換出去。freqCPU頻率變化。idleCPU空閑狀態(tài)。amActivity Manager事件如Activity啟動、生命周期。wmWindow Manager事件。執(zhí)行流程在終端輸入上述命令并回車。終端會顯示Starting tracing (5 seconds)并開始倒計時。立即切換到你的測試設(shè)備開始執(zhí)行你想要分析的操作例如從桌面點擊應(yīng)用圖標(biāo)啟動或者在一個列表頁面瘋狂滑動。倒計時結(jié)束終端顯示Tracing completed. Collecting output...最后是Output written to: my_trace.html。用Chrome瀏覽器打開my_trace.html文件。4.2 關(guān)鍵類別Categories詳解選擇正確的類別組合至關(guān)重要。抓取過多類別會導(dǎo)致文件巨大、加載緩慢抓取過少可能會遺漏關(guān)鍵信息。核心必備類別schedCPU調(diào)度。沒有它你無法分析線程是否因為鎖或IO而阻塞也無法看到CPU利用率。這是分析任何性能問題的基石。gfx圖形系統(tǒng)。包含VSYNC信號、SurfaceFlinger合成、應(yīng)用渲染線程等。分析掉幀、卡頓的利器。viewAndroid View系統(tǒng)。可以看到performTraversals即measure/layout/draw的執(zhí)行情況。常用擴(kuò)展類別am/wm分析應(yīng)用啟動速度、頁面跳轉(zhuǎn)時非常有用。input跟蹤觸摸、按鍵等輸入事件的處理流程。freq/idle分析功耗和熱問題時看CPU是否降頻或進(jìn)入深度休眠。binder_driver查看Binder IPC調(diào)用分析跨進(jìn)程通信延遲。disk/mmc分析IO讀寫性能問題。查看所有可用類別python systrace.py -l這個命令會列出當(dāng)前連接設(shè)備支持的所有跟蹤類別。不同設(shè)備、不同系統(tǒng)版本支持的類別可能不同。4.3 atrace 命令直接使用systrace.py底層調(diào)用了atrace。你也可以直接使用adb shell atrace命令這在一些自動化腳本或需要更精細(xì)控制時有用。基本用法adb shell atrace -t 5 -c -o /data/local/tmp/trace_output gfx view sched-c在跟蹤結(jié)束后清空清除緩沖區(qū)。-o指定設(shè)備上的輸出文件路徑。抓取完成后你需要將文件拉取到本地并使用systrace.py或perfettoUI進(jìn)行轉(zhuǎn)換和查看。adb pull /data/local/tmp/trace_output . python systrace.py --from-filetrace_output -o my_trace.html 實操心得直接使用atrace命令的一個好處是你可以編寫腳本在應(yīng)用執(zhí)行特定操作時通過am命令啟動Activity等自動開始和結(jié)束跟蹤實現(xiàn)自動化性能測試。5. 使用 perfetto 進(jìn)行高級跟蹤Perfetto提供了兩種主要的使用方式通過命令行工具perfetto和通過Web UIui.perfetto.dev進(jìn)行配置和抓取。這里我們重點介紹更強(qiáng)大、更推薦的后一種方式。5.1 通過 Perfetto Web UI 抓取 Trace這是最簡單直觀的方式無需記憶復(fù)雜命令。打開Web UI在Chrome中訪問 https://ui.perfetto.dev 。錄制新Trace點擊左側(cè)邊欄的**“Record new trace”**。連接設(shè)備在“Recording settings”頁面確保你的設(shè)備通過USB連接并在“Android devices”下拉框中被識別。如果未發(fā)現(xiàn)檢查adb devices和persist.traced.enable屬性。配置Trace參數(shù)Recording mode選擇“Stop when full”或“Long trace”。前者適用于短時間抓取類似systrace后者用于長時間記錄數(shù)據(jù)會滾動保存到文件。Max duration/Buffer size設(shè)置最大時長和內(nèi)存緩沖區(qū)大小。對于短時間分析5-10秒緩沖區(qū)256MB通常足夠。Probes (數(shù)據(jù)源)這是核心配置區(qū)。你可以按需勾選atrace勾選這個并在下方展開“Android apps svcs”選擇你需要atrace類別如gfx,view,sched這相當(dāng)于systrace的功能。ftrace更底層的Linux內(nèi)核跟蹤可以勾選sched/sched_switch線程切換等事件。Java heap graphs抓取Java堆內(nèi)存分配信息用于內(nèi)存分析。Memory snapshots捕獲native內(nèi)存快照。Power電源管理相關(guān)事件。Logcat同時抓取系統(tǒng)日志便于交叉分析。開始錄制點擊右上角的“Start recording”按鈕。操作設(shè)備像使用systrace一樣立即在設(shè)備上進(jìn)行你想要分析的操作。停止并下載操作完成后回到Web UI點擊“Stop”。Perfetto會自動處理數(shù)據(jù)并下載一個.perfetto-trace或.pftrace文件。分析下載完成后該文件會自動在同一個Web UI中打開你可以開始進(jìn)行分析。5.2 使用 perfetto 命令行工具對于自動化集成或在無圖形界面的環(huán)境中命令行工具是必須的。你需要獲取perfetto可執(zhí)行文件它通常包含在Android SDK的platform-tools目錄下或者可以從 Perfetto GitHub 源碼編譯。步驟準(zhǔn)備配置文件Perfetto的強(qiáng)大之處在于其基于protobuf的配置文件trace_config.pb或文本格式的trace_config.textproto。你可以從Web UI導(dǎo)出配置或手動編寫。 一個簡單的文本格式配置文件示例 (config.textproto)duration_ms: 5000 buffers: { size_kb: 32768 fill_policy: DISCARD } data_sources: { config { name: linux.ftrace ftrace_config { ftrace_events: sched/sched_switch ftrace_events: sched/sched_wakeup ftrace_events: irq/irq_handler_entry } } } data_sources: { config { name: android.systrace systrace_config { trace_categories: gfx trace_categories: view trace_categories: sched } } }這個配置抓取5秒的trace包含ftrace的調(diào)度事件和atrace的gfx/view/sched事件。執(zhí)行抓取命令adb push config.textproto /data/local/tmp/ adb shell perfetto -c /data/local/tmp/config.textproto -o /data/local/tmp/trace.pftrace或者更簡單的一行命令通過--txt指定文本配置adb shell echo -e duration_ms: 5000\nbuffers { size_kb: 32768 }\ndata_sources { config { name: \android.systrace\ systrace_config { trace_categories: \gfx view sched\ } } } | perfetto -c - --txt -o /data/local/tmp/trace.pftrace拉取Trace文件adb pull /data/local/tmp/trace.pftrace .用Perfetto UI打開這個.pftrace文件進(jìn)行分析。 注意事項命令行方式需要你對protobuf配置有一定了解。建議先從Web UI配置并導(dǎo)出配置文件然后基于導(dǎo)出的文件進(jìn)行修改這樣學(xué)習(xí)成本最低。6. Trace文件分析與解讀實戰(zhàn)抓取到trace文件.html或.pftrace只是第一步更重要的是從中讀出問題。這里以Perfetto UI為主進(jìn)行講解其功能遠(yuǎn)超舊的Chrome Tracing。6.1 Perfetto UI 核心界面與操作打開trace文件后你會看到如下主要區(qū)域時間線概覽區(qū)Overview頂部顯示整個trace的時間范圍可以縮放和拖拽。軌道區(qū)Tracks主體部分每個水平行是一個“軌道”展示一個實體如CPU、進(jìn)程、線程、計數(shù)器隨時間的變化。CPU軌道顯示每個CPU核心的使用情況不同顏色代表不同的進(jìn)程/線程。進(jìn)程/線程軌道顯示每個線程的狀態(tài)運行Running、可運行Runnable、休眠Sleeping、不可中斷休眠Uninterruptible Sleep等。這是分析卡頓最關(guān)鍵的區(qū)域。計數(shù)器軌道如CPU頻率、內(nèi)存用量、幀率SurfaceFlinger等。事件軌道顯示特定事件如VSYNC、Binder事務(wù)等。工具欄提供選擇S、移動M、時間選擇T、測量I等工具。查詢框Query (SQL)Perfetto最強(qiáng)大的功能之一允許你用SQL查詢trace數(shù)據(jù)。例如查詢所有耗時超過5ms的Binder事務(wù)?;静僮骷记煽s放鼠標(biāo)滾輪或使用W放大、S縮小鍵。移動按住Shift鼠標(biāo)拖拽或使用A左移、D右移鍵。選擇與測量按I鍵進(jìn)入測量模式在時間線上拖動可以測量兩點間的時間差。查看詳情點擊任何一段色塊或事件下方會彈出詳情面板Current Selection顯示該事件的名稱、耗時、參數(shù)等信息。6.2 定位卡頓的通用分析流程假設(shè)我們遇到了列表滑動卡頓的問題分析流程如下定位卡頓時間點在軌道區(qū)上方的時間線上找到幀率計數(shù)器FPS突然下降或出現(xiàn)斷層的區(qū)域用I鍵框選這個區(qū)域放大查看。觀察UI線程狀態(tài)找到你的應(yīng)用進(jìn)程如com.example.myapp展開它找到主線程通常是main或包名同名的線程。在卡頓時間段內(nèi)觀察主線程的狀態(tài)條。如果主線程長時間是Running綠色說明CPU正在密集執(zhí)行你的代碼。你需要點擊該綠色塊查看詳情面板中的“Stack Trace”如果抓取時啟用了應(yīng)用層符號。這能告訴你具體是哪個函數(shù)/方法耗時最長。如果主線程長時間是Runnable藍(lán)色或Sleeping灰色說明它準(zhǔn)備好了但沒被CPU執(zhí)行或者在等待如鎖、IO。這是典型的線程調(diào)度問題。分析CPU調(diào)度立刻去看對應(yīng)時間點的CPU軌道。如果所有CPU核心都處于繁忙狀態(tài)綠色塊密集且運行著其他進(jìn)程的線程說明系統(tǒng)整體負(fù)載高你的應(yīng)用線程搶不到CPU時間片。這可能是因為后臺有大量任務(wù)。如果CPU有閑置空白但你的主線程仍是藍(lán)色Runnable這非常反常可能遇到了優(yōu)先級反轉(zhuǎn)或CPU頻率限制thermal throttling。此時可以查看freq和idle軌道確認(rèn)。檢查鎖競爭如果主線程狀態(tài)顯示為Uninterruptible Sleep (D)這通常意味著它在等待IO。但如果是在等待鎖在sched和lock事件中會有體現(xiàn)。Perfetto的“Slices”軌道可能會顯示MonitorWait等鎖事件。檢查渲染流水線展開SurfaceFlinger進(jìn)程和你的應(yīng)用RenderThread。查看VSYNC信號vsync_*是否規(guī)律。如果VSYNC間隔不穩(wěn)定可能是底層顯示問題。查看應(yīng)用RenderThread的DrawFrame切片。如果兩個DrawFrame之間的間隔遠(yuǎn)大于16.6ms60Hz說明渲染一幀的時間過長。查看SurfaceFlinger的Composition切片。如果合成耗時過長可能是圖層太多或過于復(fù)雜。6.3 使用SQL查詢進(jìn)行深度挖掘Perfetto UI內(nèi)置了一個強(qiáng)大的SQL查詢引擎。點擊左側(cè)邊欄的“Query (SQL)”即可打開。一些實用的查詢示例查找耗時最長的Binder調(diào)用SELECT slice.name, dur / 1e6 as dur_ms, thread.name as thread_name FROM slice JOIN thread_track ON slice.track_id thread_track.id JOIN thread USING (utid) WHERE slice.name LIKE ‘binder%‘ AND dur 1e6 -- 查找耗時超過1ms的binder事務(wù) ORDER BY dur DESC LIMIT 10;統(tǒng)計所有線程在Runnable狀態(tài)的總時間SELECT thread.name, sum(dur) / 1e6 as total_runnable_ms FROM thread_state JOIN thread USING (utid) WHERE state ‘R‘ -- ‘R‘ 代表 Runnable GROUP BY thread.name ORDER BY total_runnable_ms DESC;查找因鎖等待導(dǎo)致的調(diào)度延遲這需要抓取時啟用了sched和lock相關(guān)的事件。查詢可能比較復(fù)雜但思路是關(guān)聯(lián)sched_wakeup事件和線程實際開始運行的時間差。 實操心得對于復(fù)雜的性能問題不要只盯著UI線程。一個后臺網(wǎng)絡(luò)線程持有了UI線程需要的鎖或者一個Bitmap解碼任務(wù)在異步線程占滿了CPU都可能導(dǎo)致UI卡頓。學(xué)會在Perfetto中全局地、關(guān)聯(lián)地看問題是進(jìn)階的關(guān)鍵。7. 常見問題與排查技巧實錄在實際使用中你肯定會遇到各種問題。這里記錄了一些典型場景和解決方法。7.1 抓取失敗或數(shù)據(jù)為空現(xiàn)象執(zhí)行命令后生成的HTML文件打開是空白或只有零星信息。排查檢查類別首先用python systrace.py -l確認(rèn)你選擇的類別在設(shè)備上是否支持。有些定制ROM可能移除了某些跟蹤點。檢查權(quán)限確保設(shè)備已開啟USB調(diào)試并且電腦已被授權(quán)。嘗試adb root需要工程機(jī)或userdebug版本系統(tǒng)后再抓取權(quán)限最高。檢查atrace狀態(tài)在設(shè)備shell中執(zhí)行adb shell atrace --list_categories看是否能列出類別。執(zhí)行adb shell atrace -c -t 1 gfx看是否有輸出。嘗試基礎(chǔ)類別先只用sched和gfx這兩個最核心、支持最廣的類別抓取看是否有數(shù)據(jù)。對于perfetto確保persist.traced.enable已設(shè)置為1并重啟。7.2 Trace文件巨大瀏覽器卡死現(xiàn)象抓取時間長或類別過多生成幾百MB的HTML文件Chrome無法加載。解決控制抓取時長和類別只抓取問題發(fā)生的核心時段如3-5秒只選擇必要的類別。使用Perfetto UIPerfetto UIui.perfetto.dev對大型trace文件的處理能力遠(yuǎn)強(qiáng)于Chrome Tracing。將.html文件轉(zhuǎn)換為.pftrace格式Perfetto UI支持導(dǎo)入或用Perfetto直接抓取。使用命令行過濾對于perfetto可以在配置文件中使用filter字段或者在抓取后使用perfetto命令行工具進(jìn)行過濾和裁剪。7.3 看不到應(yīng)用層函數(shù)調(diào)用棧Stack Trace現(xiàn)象在trace中點擊線程的Running切片詳情面板中沒有“Stack Trace”或顯示為[unknown]。解決需要帶符號的Debug包要看到Java/Kotlin函數(shù)名必須使用未混淆的Debug版本應(yīng)用。Release包通常被ProGuard/R8混淆函數(shù)名無意義。對于systrace在命令中添加-a package_name選項。例如python systrace.py -t 5 -a com.example.myapp -o trace.html gfx view sched。這會將應(yīng)用進(jìn)程的跟蹤標(biāo)記關(guān)聯(lián)起來。對于Perfetto在Web UI配置的“Android apps svcs”下勾選你的應(yīng)用包名?;蛘咴谂渲梦募腶ndroid.systrace數(shù)據(jù)源中設(shè)置target_pid或target_cmdline。Native符號要看到C/C的函數(shù)名需要將設(shè)備的/system/lib等庫的符號表或你的so文件的調(diào)試符號加載到Perfetto UI中。這通常需要從編譯設(shè)備的系統(tǒng)鏡像中獲取。7.4 如何分析應(yīng)用啟動性能應(yīng)用啟動是典型的性能分析場景。抓取配置抓取類別必須包含amActivity Manager和wmWindow Manager。命令示例python systrace.py -t 10 -a com.example.myapp -o startup.html am wm gfx view sched.抓取時機(jī)在命令開始倒計時后立即點擊應(yīng)用圖標(biāo)。確保trace覆蓋從點擊到首頁完全加載的完整過程。分析關(guān)鍵路徑在Perfetto UI中搜索“l(fā)aunching”或“startActivity”事件找到你的應(yīng)用啟動的起點。順著時間線向右看關(guān)注am軌道ActivityThread的performLaunchActivity、handleResumeActivity等事件。你的應(yīng)用進(jìn)程和主線程查看main線程在Activity.onCreate、onStart、onResume期間做了什么。是否有長時間的RunningCPU計算或Sleeping等待IO/鎖gfx軌道查看第一幀的DrawFrame和SurfaceFlinger合成何時完成。從點擊圖標(biāo)到第一幀顯示在屏幕上的時間就是用戶感知的啟動時間。7.5 自動化集成與進(jìn)階技巧對于需要持續(xù)集成CI的性能測試手動抓取是不現(xiàn)實的。腳本化抓取使用atrace# 開始抓取 adb shell “atrace -c -b 32768 -t 15 gfx view sched wm am -o /data/local/tmp/auto_trace ” # 執(zhí)行自動化操作例如啟動應(yīng)用 adb shell am start -W -n com.example.myapp/.MainActivity # 等待抓取結(jié)束簡單方法sleep 比跟蹤時間長一點 sleep 16 # 拉取文件并轉(zhuǎn)換 adb pull /data/local/tmp/auto_trace . python systrace.py --from-fileauto_trace -o auto_trace.html腳本化抓取使用perfetto編寫一個trace_config.textproto文件然后使用adb shell perfetto -c ...命令在自動化腳本中調(diào)用。這更加強(qiáng)大和穩(wěn)定。使用Android Studio Profiler對于應(yīng)用開發(fā)Android Studio內(nèi)置的Profiler提供了更友好的systrace集成。你可以在CPU Profiler中直接點擊“Record System Trace”按鈕它底層也是調(diào)用perfetto/systrace但提供了與應(yīng)用代碼更好的關(guān)聯(lián)。掌握systrace和perfetto就像是獲得了Android系統(tǒng)的“時光機(jī)”和“顯微鏡”。它讓你能從紛繁復(fù)雜的現(xiàn)象背后直指性能問題的本質(zhì)——是計算太慢是等待太久還是調(diào)度不公。最初的學(xué)習(xí)曲線可能有些陡峭但一旦你成功用它定位并解決了一個棘手的線上卡頓問題那種成就感會讓你覺得所有投入都是值得的。從今天開始不要再靠猜來優(yōu)化性能讓數(shù)據(jù)說話。