CPU Profiler 可幫助您實(shí)時(shí)檢查應(yīng)用的 CPU 使用率和線程 Activity古话,并記錄函數(shù)跟蹤,以便您可以優(yōu)化和調(diào)試您的應(yīng)用代碼。
一偶洋、 為什么要分析 CPU 使用率
最大限度減少應(yīng)用的 CPU 使用率具有許多優(yōu)勢(shì)晾嘶,如提供更快更順暢的用戶體驗(yàn)妓雾,以及延長(zhǎng)設(shè)備電池續(xù)航時(shí)間。 它還可幫助應(yīng)用在各種新舊設(shè)備上保持良好性能垒迂。 與應(yīng)用交互時(shí)械姻,您可以使用 CPU Profiler 監(jiān)控 CPU 使用率和線程 Activity。 不過(guò)机断,如需了解應(yīng)用如何執(zhí)行其代碼的詳細(xì)信息楷拳,您應(yīng)記錄和檢查函數(shù)跟蹤。
對(duì)于應(yīng)用進(jìn)程中的每個(gè)線程吏奸,您可以查看一段時(shí)間內(nèi)執(zhí)行了哪些函數(shù)欢揖,以及在其執(zhí)行期間每個(gè)函數(shù)消耗的 CPU 資源。 您還可以使用函數(shù)跟蹤來(lái)識(shí)別調(diào)用方和被調(diào)用方苦丁。 調(diào)用方指調(diào)用其他函數(shù)的函數(shù)浸颓,而被調(diào)用方是指被其他函數(shù)調(diào)用的函數(shù)。 您可以使用此信息確定哪些函數(shù)負(fù)責(zé)調(diào)用常常會(huì)消耗大量特定資源的任務(wù),并嘗試優(yōu)化應(yīng)用代碼以避免不必要的工作产上。
如果您想收集可幫助您檢查原生系統(tǒng)進(jìn)程的詳細(xì)系統(tǒng)級(jí)數(shù)據(jù)棵磷,并解決掉幀引起的界面卡頓,您應(yīng)使用 systrace
晋涣。
或者仪媒,如果您想導(dǎo)出您使用 Debug
類捕獲的 .trace
文件,您應(yīng)使用 Traceview谢鹊。
二算吩、 CPU Profiler 概覽
當(dāng)您打開 CPU Profiler 時(shí),它將立即開始顯示應(yīng)用的 CPU 使用率和線程 Activity佃扼。 您應(yīng)該會(huì)看到類似圖 1 的一些內(nèi)容:
如圖 1 所示偎巢,CPU Profiler 的默認(rèn)視圖包括以下內(nèi)容:
- Event 時(shí)間線: 顯示應(yīng)用中在其生命周期不同狀態(tài)間轉(zhuǎn)換的 Activity,并表明用戶與設(shè)備的交互兼耀,包括屏幕旋轉(zhuǎn) Event压昼。 如需了解有關(guān) Event 時(shí)間線的更多信息,包括如何啟用它瘤运,請(qǐng)閱讀 啟用高級(jí)分析窍霞。
- CPU 時(shí)間線: 顯示應(yīng)用的實(shí)時(shí) CPU 使用率(以占總可用 CPU 時(shí)間的百分比表示)以及應(yīng)用使用的總線程數(shù)。 此時(shí)間線還顯示其他進(jìn)程的 CPU 使用率(如系統(tǒng)進(jìn)程或其他應(yīng)用)拯坟,以便您可以將其與您的應(yīng)用使用率進(jìn)行對(duì)比但金。 通過(guò)沿時(shí)間線的水平軸移動(dòng)鼠標(biāo),您還可以檢查歷史 CPU 使用率數(shù)據(jù)郁季。
-
線程 Activity 時(shí)間線: 列出屬于應(yīng)用進(jìn)程的每個(gè)線程并使用下面列出的顏色沿時(shí)間線標(biāo)示它們的 Activity冷溃。 在您記錄一個(gè)函數(shù)跟蹤后,您可以從此時(shí)間線中選擇一個(gè)線程以在跟蹤窗格中檢查其數(shù)據(jù)梦裂。
- 綠色: 表示線程處于活動(dòng)狀態(tài)或準(zhǔn)備使用 CPU秃诵。 即,它正在“運(yùn)行中”或處于“可運(yùn)行”狀態(tài)塞琼。
- 黃色: 表示線程處于活動(dòng)狀態(tài)菠净,但它正在等待一個(gè) I/O 操作(如磁盤或網(wǎng)絡(luò) I/O),然后才能完成它的工作彪杉。
- 灰色: 表示線程正在休眠且沒有消耗任何 CPU 時(shí)間毅往。 當(dāng)線程需要訪問(wèn)尚不可用的資源時(shí)偶爾會(huì)發(fā)生這種情況。 線程進(jìn)入自主休眠或內(nèi)核將此線程置于休眠狀態(tài)派近,直到所需的資源可用攀唯。
-
記錄配置: 允許您選擇以下選項(xiàng)之一以確定分析器記錄函數(shù)跟蹤的方式。
- Sampled: 一個(gè)默認(rèn)配置渴丸,在應(yīng)用執(zhí)行期間頻繁捕獲應(yīng)用的調(diào)用堆棧侯嘀。 分析器比較捕獲的數(shù)據(jù)集以推導(dǎo)與應(yīng)用代碼執(zhí)行有關(guān)的時(shí)間和資源使用信息另凌。 基于“Sampled”的跟蹤的固有問(wèn)題是,如果應(yīng)用在捕獲調(diào)用堆棧后進(jìn)入一個(gè)函數(shù)并在下一次捕獲前退出該函數(shù)戒幔,則分析器不會(huì)記錄該函數(shù)調(diào)用吠谢。 如果您對(duì)此類生命周期很短的跟蹤函數(shù)感興趣,您應(yīng)使用“Instrumented”跟蹤诗茎。
- Instrumented: 一個(gè)默認(rèn)配置工坊,在運(yùn)行時(shí)設(shè)置應(yīng)用以在每個(gè)函數(shù)調(diào)用的開始和結(jié)束時(shí)記錄時(shí)間戳。 它收集時(shí)間戳并進(jìn)行比較敢订,以生成函數(shù)跟蹤數(shù)據(jù)王污,包括時(shí)間信息和 CPU 使用率。 請(qǐng)注意楚午,與設(shè)置每個(gè)函數(shù)關(guān)聯(lián)的開銷會(huì)影響運(yùn)行時(shí)性能昭齐,并可能會(huì)影響分析數(shù)據(jù),對(duì)于生命周期相對(duì)較短的函數(shù)矾柜,這一點(diǎn)更為明顯司浪。 此外,如果應(yīng)用短時(shí)間內(nèi)執(zhí)行大量函數(shù)把沼,則分析器可能會(huì)迅速超出它的文件大小限制,且不能再記錄更多跟蹤數(shù)據(jù)吁伺。
- Edit configurations: 允許您更改上述“Sampled”和“Instrumented”記錄配置的某些默認(rèn)值饮睬,并將它們另存為自定義配置。 如需了解更多信息篮奄,請(qǐng)轉(zhuǎn)到創(chuàng)建記錄配置部分捆愁。
- 記錄按鈕: 用于開始和停止記錄函數(shù)跟蹤。 如需了解更多信息窟却,請(qǐng)轉(zhuǎn)到記錄和檢查函數(shù)跟蹤部分 昼丑。
注: 分析器還會(huì)報(bào)告 Android Studio 和 Android 平臺(tái)添加到您的應(yīng)用進(jìn)程(如 JDWP
、Profile Saver
夸赫、Studio:VMStats
菩帝、Studio:Perfa
以及 Studio:Heartbeat
,盡管它們?cè)诰€程 Activity 時(shí)間線中顯示的確切名稱可能有所不同)的線程 CPU 使用率茬腿。 這表示 CPU 時(shí)間線中應(yīng)用的 CPU 使用率還可反映這些線程使用的 CPU 時(shí)間呼奢。 您可以在線程 Activity 時(shí)間線中查看其中的一些線程并監(jiān)控其 Activity。 (不過(guò)切平,由于分析器線程執(zhí)行原生代碼握础,因此,您無(wú)法為它們記錄函數(shù)跟蹤數(shù)據(jù)悴品。)Android Studio 將報(bào)告此數(shù)據(jù)禀综,以便當(dāng)線程 Activity 及 CPU 使用率實(shí)際上是由應(yīng)用代碼引發(fā)時(shí)简烘,您可以輕松識(shí)別。
三定枷、 記錄和檢查函數(shù)跟蹤
要開始記錄函數(shù)跟蹤孤澎,從下拉菜單中選擇 Sampled 或 Instrumented 記錄配置,或選擇您創(chuàng)建的自定義記錄配置依鸥,然后點(diǎn)擊 Record
亥至。 與應(yīng)用交互并在完成后點(diǎn)擊 Stop recording
。 分析器將自動(dòng)選擇記錄的時(shí)間范圍贱迟,并在函數(shù)跟蹤窗格中顯示其跟蹤信息姐扮,如圖 2 所示。如果您想檢查另一個(gè)線程的函數(shù)跟蹤衣吠,只需從線程 Activity 時(shí)間線中選中它茶敏。
- 選擇時(shí)間范圍: 用于確定您要在跟蹤窗格中檢查所記錄時(shí)間范圍的哪一部分。 當(dāng)您首次記錄函數(shù)跟蹤時(shí)缚俏,CPU Profiler 將在 CPU 時(shí)間線中自動(dòng)選擇您的記錄的完整長(zhǎng)度惊搏。 如果您想僅檢查所記錄時(shí)間范圍一小部分的函數(shù)跟蹤數(shù)據(jù),您可以點(diǎn)擊并拖動(dòng)突出顯示的區(qū)域邊緣以修改其長(zhǎng)度忧换。
- 時(shí)間戳: 用于表示所記錄函數(shù)跟蹤的開始和結(jié)束時(shí)間(相對(duì)于分析器從設(shè)備開始收集 CPU 使用率信息的時(shí)間)恬惯。 在選擇時(shí)間范圍時(shí),您可以點(diǎn)擊時(shí)間戳以自動(dòng)選擇完整記錄亚茬,如果您有多個(gè)要進(jìn)行切換的記錄酪耳,則此做法尤其有用。
- 跟蹤窗格: 用于顯示您所選的時(shí)間范圍和線程的函數(shù)跟蹤數(shù)據(jù)刹缝。 僅在您至少記錄一個(gè)函數(shù)跟蹤后此窗格才會(huì)顯示碗暗。 在此窗格中,您可以選擇想如何查看每個(gè)堆疊追蹤(使用跟蹤標(biāo)簽)梢夯,以及如何測(cè)量執(zhí)行時(shí)間(使用時(shí)間引用下拉菜單)言疗。
- 選擇后,可通過(guò) Top Down 樹颂砸、Bottom Up 樹噪奄、調(diào)用圖表或火焰圖的形式顯示您的函數(shù)跟蹤。 您可以在下文中了解每個(gè)跟蹤窗格標(biāo)簽的更多信息人乓。
- 從下拉菜單中選擇以下選項(xiàng)之一梗醇,以確定如何測(cè)量每個(gè)函數(shù)調(diào)用的時(shí)間信息:
- Wall clock time:壁鐘時(shí)間信息表示實(shí)際經(jīng)過(guò)的時(shí)間。
- Thread time:線程時(shí)間信息表示實(shí)際經(jīng)過(guò)的時(shí)間減去線程沒有消耗 CPU 資源的任意時(shí)間部分撒蟀。 對(duì)于任何給定函數(shù)叙谨,其線程時(shí)間始終少于或等于其壁鐘時(shí)間。 使用線程時(shí)間可以讓您更好地了解線程的實(shí)際 CPU 使用率中有多少是給定函數(shù)消耗的保屯。
四手负、 使用 Call Chart 標(biāo)簽檢查跟蹤
Call Chart 標(biāo)簽提供函數(shù)跟蹤的圖形表示形式涤垫,其中,水平軸表示函數(shù)調(diào)用(或調(diào)用方)的時(shí)間段和時(shí)間竟终,并沿垂直軸顯示其被調(diào)用者蝠猬。 對(duì)系統(tǒng) API 的函數(shù)調(diào)用顯示為橙色,對(duì)應(yīng)用自有函數(shù)的調(diào)用顯示為綠色统捶,對(duì)第三方 API(包括 Java 語(yǔ)言 API)的函數(shù)調(diào)用顯示為藍(lán)色榆芦。 下面的圖 3 展示了一個(gè)調(diào)用圖表示例,并描繪了給定函數(shù)的 self time喘鸟、children time 以及總時(shí)間的概念匆绣。 您可以在如何使用 Top Down 和 Bottom Up 檢查跟蹤部分詳細(xì)了解這些概念。
提示: 若要跳轉(zhuǎn)到某個(gè)函數(shù)的源代碼,請(qǐng)右鍵點(diǎn)擊該函數(shù)并選擇 Jump to Source愕把。 這適用于任一跟蹤窗格標(biāo)簽拣凹。
五、 使用 Flame Chart 標(biāo)簽檢查跟蹤
Flame Chart 標(biāo)簽提供一個(gè)倒置的調(diào)用圖表恨豁,其匯總相同的調(diào)用堆棧嚣镜。 即,收集共享相同調(diào)用方順序的完全相同的函數(shù)橘蜜,并在火焰圖中用一個(gè)較長(zhǎng)的橫條表示它們(而不是將它們顯示為多個(gè)較短的橫條菊匿,如調(diào)用圖表中所示)。 這樣更方便您查看哪些函數(shù)消耗最多時(shí)間扮匠。 不過(guò),這也意味著水平軸不再代表時(shí)間線凡涩,相反棒搜,它表示每個(gè)函數(shù)相對(duì)的執(zhí)行時(shí)間。
為幫助說(shuō)明此概念活箕,請(qǐng)考慮以下圖 4 中的調(diào)用圖表力麸。 請(qǐng)注意,函數(shù) D 多次調(diào)用 B(B1育韩、B2 和 B3)克蚂,其中一些對(duì) B 的調(diào)用也調(diào)用了 C(C1 和 C3)。
由于 B1筋讨、B2 和 B3 共享相同的調(diào)用方順序 (A → D → B)埃叭,因此,可將它們匯總在一起悉罕,如下所示赤屋。 同樣立镶,將 C1 和 C3 匯總在一起,因?yàn)樗鼈円补蚕硐嗤恼{(diào)用方順序 (A → D → B → C)—請(qǐng)注意类早,未包含 C2媚媒,因?yàn)樗哂胁煌恼{(diào)用方順序 (A → D → C)。
匯總的函數(shù)調(diào)用用于創(chuàng)建火焰圖涩僻,如圖 6 所示缭召。請(qǐng)注意,對(duì)于火焰圖中任何給定的函數(shù)調(diào)用逆日,消耗最多 CPU 時(shí)間的被調(diào)用方首先顯示嵌巷。
六、 使用 Top Down 和 Bottom Up 檢查跟蹤
Top Down 標(biāo)簽顯示一個(gè)函數(shù)調(diào)用列表屏富,在該列表中展開函數(shù)節(jié)點(diǎn)會(huì)顯示函數(shù)的被調(diào)用方晴竞。 圖 7 顯示圖 3 中調(diào)用圖表的“Top Down”圖表。圖表中的每個(gè)箭頭都從調(diào)用方指向被調(diào)用方狠半。
如圖 7 所示噩死,在“Top Down”標(biāo)簽中展開函數(shù) A 的節(jié)點(diǎn)可顯示它的被調(diào)用方,即函數(shù) B 和 D神年。 然后已维,展開函數(shù) D 的節(jié)點(diǎn)可顯示它的被調(diào)用方,即函數(shù) B 和 C 等等已日。 與 Flame chart 標(biāo)簽相似垛耳,“Top Down”樹匯總共享相同調(diào)用堆棧的相同函數(shù)的跟蹤信息。 也就是說(shuō)飘千,Flame chart 標(biāo)簽可提供Top down 標(biāo)簽的圖形化表示形式堂鲜。
Top Down 標(biāo)簽提供以下信息以幫助說(shuō)明在每個(gè)函數(shù)調(diào)用上所花費(fèi)的 CPU 時(shí)間(時(shí)間也可以用線程總時(shí)間占所選時(shí)間范圍的持續(xù)時(shí)間的百分比表示):
- Self: 表示函數(shù)調(diào)用在執(zhí)行自己的代碼(而非被調(diào)用方的代碼)上所花的時(shí)間,如圖 3 中的函數(shù) D 所示护奈。
- Children: 表示函數(shù)調(diào)用在執(zhí)行自己的被調(diào)用方(而非自己的代碼)上所花的時(shí)間缔莲,如圖 3 中的函數(shù) D 所示。
- 總和: 函數(shù)的 Self 和 Children 時(shí)間的總和霉旗。 這表示應(yīng)用在執(zhí)行函數(shù)調(diào)用上所花的總時(shí)間痴奏,如圖 3 中函數(shù) D 所示。
Bottom Up 標(biāo)簽顯示一個(gè)函數(shù)調(diào)用列表厌秒,在該列表中展開函數(shù)節(jié)點(diǎn)將顯示函數(shù)的調(diào)用方读拆。 通過(guò)使用圖 7 中展示的跟蹤示例,圖 8 為函數(shù) C 提供了一個(gè)“Bottom Up”樹鸵闪。 在“Bottom Up”樹中打開函數(shù) C 的節(jié)點(diǎn)可顯示它獨(dú)有的調(diào)用方檐晕,即函數(shù) B 和 D。 請(qǐng)注意蚌讼,盡管 B 調(diào)用 C 兩次棉姐,但在“Bottom Up”樹中展開函數(shù) C 的節(jié)點(diǎn)時(shí)屠列,B 僅顯示一次。 然后伞矩,展開 B 的節(jié)點(diǎn)顯示其調(diào)用方笛洛,即函數(shù) A 和 D。
Bottom Up 標(biāo)簽用于按照消耗最多(最少)CPU 時(shí)間排序函數(shù)乃坤。 您可以檢查每個(gè)節(jié)點(diǎn)以確定在調(diào)用函數(shù)上哪些調(diào)用方花了最多 CPU 時(shí)間苛让。 與“Top Down”樹相比,“Bottom Up”樹中的每個(gè)函數(shù)的時(shí)間信息引用每個(gè)樹頂部的函數(shù)(頂部模式)湿诊。 CPU 時(shí)間也可表示為在該記錄期間占線程總時(shí)間的百分比狱杰。 下表有助于闡述如何解釋頂部節(jié)點(diǎn)的時(shí)間信息及其調(diào)用方函數(shù)(子節(jié)點(diǎn))。
Self | Children | 合計(jì) | |
---|---|---|---|
“Bottom Up”樹頂部的函數(shù)(頂部模式) | 表示函數(shù)在執(zhí)行自己的代碼(而非其被調(diào)用方的代碼)上所花的時(shí)間厅须。 與“Top Down”樹相比仿畸,此時(shí)間信息表示在記錄的持續(xù)時(shí)間內(nèi)對(duì)此函數(shù)所有調(diào)用的總和。 | 表示函數(shù)執(zhí)行它的被調(diào)用方(而非它自己的代碼)上所花的總時(shí)間朗和。 與“Top Down”樹相比错沽,此時(shí)間信息表示在記錄的持續(xù)期間內(nèi)所有對(duì)此函數(shù)被調(diào)用方的調(diào)用總和。 | self time 和 children time 的總和眶拉。 |
調(diào)用方函數(shù)(子節(jié)點(diǎn)) | 表示在由調(diào)用方調(diào)用時(shí)被調(diào)用方的總 self time千埃。 以圖 8 中的“Bottom Up”樹為例,被 B 調(diào)用時(shí)忆植,函數(shù) B 的 self time 將等于函數(shù) C 每個(gè)執(zhí)行的 self time 的總和放可。 | 表示在由調(diào)用方調(diào)用時(shí)被調(diào)用方的總 children time。 以圖 8 中的“Bottom Up”樹為例朝刊,被 B 調(diào)用時(shí)耀里,函數(shù) B 的 children time 將等于函數(shù) C 每個(gè)執(zhí)行的 children time 的總和。 | self time 和 children time 的總和拾氓。 |
注:對(duì)于給定錄制冯挎,當(dāng)分析器到達(dá)文件大小限制時(shí),Android Studio 將停止收集新數(shù)據(jù)(不過(guò)痪枫,這不會(huì)停止記錄)织堂。 在執(zhí)行“Instrumented”跟蹤時(shí)叠艳,這種情況通常會(huì)更快發(fā)生奶陈,因?yàn)榕c“Sampled”跟蹤相比,此類跟蹤在較短時(shí)間里會(huì)收集更多數(shù)據(jù)附较。 如果您將檢查時(shí)間范圍延長(zhǎng)至達(dá)到限制后發(fā)生的記錄時(shí)間吃粒,則跟蹤窗格中的時(shí)間數(shù)據(jù)不會(huì)發(fā)生變化(因?yàn)闆]有新數(shù)據(jù)可用)。 此外拒课,當(dāng)您僅選擇沒有數(shù)據(jù)可用的記錄部分時(shí)徐勃,對(duì)于時(shí)間信息事示,跟蹤窗格將顯示 NaN。
七僻肖、 創(chuàng)建記錄配置
您可以從 Android Studio 為您提供的記錄配置中選擇一個(gè)配置肖爵,如 Sampled 或 Instrumented,也可以創(chuàng)建自己的記錄配置臀脏。 要?jiǎng)?chuàng)建或編輯自定義配置劝堪,或檢查現(xiàn)有默認(rèn)配置,可通過(guò)從記錄配置下拉菜單中選擇 Edit configurations 來(lái)打開 CPU Recording Configurations 對(duì)話框揉稚。
您可以通過(guò)從左側(cè)窗格中選擇現(xiàn)有配置來(lái)檢查其設(shè)置,也可按如下方式創(chuàng)建一個(gè)新的記錄配置:
- 點(diǎn)擊對(duì)話框左上角的 Add搀玖, 這將創(chuàng)建一個(gè)包含一些默認(rèn)設(shè)置的新配置余境。
為您的配置命名。
在 Trace Technology 部分選擇 Sampled 或 Instrumented灌诅。 其中每一個(gè)選項(xiàng)都按 CPU Profiler 概覽 中所述運(yùn)行芳来。
對(duì)于“Sampled”記錄配置,以微秒 (μs) 為單位指定 Sampling interval延塑。 此值表示應(yīng)用調(diào)用堆棧的每個(gè)抽樣之間的持續(xù)時(shí)間绣张。 請(qǐng)記住,您指定的持續(xù)時(shí)間越短关带,您就會(huì)越快到達(dá)所記錄數(shù)據(jù)的文件大小限制侥涵。
-
對(duì)于寫入連接設(shè)備的記錄數(shù)據(jù),以兆字節(jié) (MB) 為單位指定 File size limit宋雏。 當(dāng)您停止記錄時(shí)芜飘,Android Studio 將解析此數(shù)據(jù)并將其顯示在分析器窗口中。 因此磨总,如果您增加此限制并記錄大量數(shù)據(jù)嗦明,Android Studio 將花更長(zhǎng)時(shí)間解析文件,并可能會(huì)無(wú)響應(yīng)蚪燕。
注: 如果您使用運(yùn)行 API 級(jí)別 26 或更高版本的連接設(shè)備娶牌,則對(duì)于跟蹤數(shù)據(jù)的文件大小沒有限制,此值可忽略馆纳。不過(guò)诗良,您仍需留意每次記錄后設(shè)備收集了多少數(shù)據(jù)——Android Studio 可能難以解析大型跟蹤文件。例如鲁驶,當(dāng)應(yīng)用短時(shí)間內(nèi)調(diào)用許多函數(shù)時(shí)鉴裹,如果您記錄抽樣間隔較短的“Sampled”跟蹤或“Instrumented”跟蹤,您很快就會(huì)生成大型跟蹤文件。
點(diǎn)擊 Apply 或 OK径荔。 如果您更改了其他記錄配置督禽,則也將應(yīng)用這些更改。
創(chuàng)建新配置后总处,系統(tǒng)將自動(dòng)從記錄配置下拉菜單中選中它狈惫,并且您可以將它用于您的下一次記錄