1、Systrace 簡介
2、Systrace 使用方法
3、使用命令行抓取 Systrace
4、使用Systrace 檢測UI 性能
5、使用Systrace 檢測警告以及掉幀問題
6、查看trace 文件的快捷鍵
7、代碼中添加trace 標記具體分析問題所在
8、使用TraceView 分析trace Loghtml
Systrace 容許你收集和檢查設備上運行的全部進程的計時信息。 它包括Androidkernel的一些數據(例如CPU調度
程序,IO和APP Thread),而且會生成HTML報告,方便用戶查看分析trace內容。python
若是想分析Android
系統或者某個app
的卡頓性能或者渲染問題,這時候Systrace 就很是有用。
首先咱們須要抓取Systrace
文件,而後分析並找出引發系統卡頓,或者app反應慢
的緣由,最好在源碼上解決引發卡頓、響應慢的問題。android
抓取Systrace的方法以下:程序員
首先連接手機,打開Android Device Monitor
,選擇要分析的進程(好比com.google.process.gapps
),點擊Capture system wide trace using Android systrace
(下圖右上角箭頭所指的地方)面試
此時根據不一樣的卡頓問題需求,咱們配置抓取不一樣的trace
。 抓取的Systrace時間請勿過長,不然會致使抓取內容部分丟失,而後點擊OK
,操做要分析系統卡頓或app
運行緩慢的部分,系統會自動收集運行時的信息,而後用Chrome 瀏覽器打
開生成的trace
文件 。瀏覽器
假如抓取過屢次trace,爲避免數據丟失,請及時清除緩存中的內容,清理地方在 Android Device Monitor
的右下角,以下圖所示緩存
用Chrome 瀏覽器
打開生成的trace 文件
,以下圖所示,裏面會包含每一個CPU,
以及圖形渲染,輸入事件等等內容。網絡
抓取的Trace
報告提供了Android
系統進程在特定時間段內的總體狀況。 例如在顯示Activity或動畫時卡頓,Systrace會提供關於如何解決這些問題的建議。
可是,systrace
不會在應用程序進程中收集有關代碼執行的信息。 有關您的應用程序執行哪些方法以及使用多少CPU資源
的更多詳細信息,請使用Android Studio
的內置CPUProfiler
,或生成跟蹤日誌並使用Traceview
查看它們。架構
抓取systrace
以前,請完成如下步驟:app
Android SDK Tools
Python ,
並將其包含在系統環境變量的path中。USB Debug
選項 。Systrace
腳本,存儲路徑以下:android-sdk/platform-tools/systrace/
Systrace
的語法使用命令行抓取 Systrace
的語法以下:python systrace.py [options] [categories]
Systrace
舉例例如,如下命令調用systrace
在10
秒鐘內記錄設備進程,包括圖形進程,並生成一個名爲mynewtrace
的HTML
報告:
python systrace.py --time=10 -o mynewtrace.html gfx
若是不指定任何類別或選項,systrace
將生成包含全部可用類別的報告,並使用默認設置。 可用的類別取決於您使用的鏈接設備。
systrace
對於檢查應用程序的UI性能
特別有用,由於它能夠分析您的代碼和幀速率,進而識別問題區域,同時提供可工參考的解決方案。
首先,按照如下步驟進行操做:
app
。python systrace.py view --time = 10
systrace
生成一個HTML報告。使用Chrome 打開生成的trace 文件,檢測記錄期間設備CPU
使用狀況,丟幀狀況,卡頓耗時狀況等等。
以下Systrace報告列出了每一個進程呈現UI frame,並顯示沿着時間線的每一個渲染幀。 在綠色框架
圓圈中,是指在16.6ms內呈現每秒穩定60幀。 花費16.6ms以上渲染的幀用黃色
或紅色
圓圈表示。
在運行Android 5.0(API級別21)
或更高版本的設備上, UI 渲染的工做主要由UI Thread
和RenderThread
兩個線程完成。 在以前的版本中,建立渲染框架的全部工做都是在UI Thread
上完成的。
點擊一個F圓圈
,它能夠提供系統爲渲染該frame 完成所包含的工做信息,包括警報,丟幀,建議等。
同時它還向您展現了在渲染該frame時系統正在執行的方法,所以您能夠調查這些方法是否致使UI jank
。
選擇黃色的frame後,您可能會在報告的底部窗格中看到如上提示信息。
上圖中顯示的Alert
, 主要問題是在ListView
回收和從新bind中花費了太多的時間。 trace中有相關事件的連接,點擊能夠獲取更多關於系統在這段時間內正在作什麼的事情。
要查看Systrace中發現的每一個Alert
以及設備觸發Alert
的次數,請單擊窗口最右側的Alerts
選項卡,以下圖所示。Alerts
面板可幫助您查看發生了哪些問題,以及發生的頻率。 將Alert
面板看做是要修復的錯誤列表, 一般狀況下,一個區域的微小變化或改進就能夠消除應用程序中的所有Alert。
若是你的代碼在UI Thread
上作太多的工做,你須要找出哪些方法消耗了太多的CPU時間
。
一種方法是添加systrace(請參閱檢測應用代碼)到您認爲會致使這些卡頓或者致使慢的方法地方,而後查看這些函數調用是否顯示在systrace
中。 若是您不肯定哪些方法可能會在UI線程上形成卡頓,請使用Android Studio
的內置CPU Profiler,
或者生成跟蹤日誌並使用Traceview
查看它們。
因爲systrace
是在系統級顯示有關進程的信息,所以很難在HTML
報告中查看某個特定時間內,您的應用程序正在執行什麼方法。 在Android 4.3(API級別18)
及更高版本中,您可使用代碼中的Trace
類在HTML
報告中標記執行事件。 您不須要用代碼來記錄systrace
的跟蹤記錄,這樣作能夠幫助您查看app代碼的哪些部分可能致使線程hung或UI丟幀。 可是這種方法與使用Debug
類不一樣,Trace
類簡單地將標誌添加到systrace
報告中,而Debug
類可幫助您生成.trace
文件,而且檢查app CPU
使用狀況。
要生成包含已檢測的跟蹤事件的systrace HTML
報告,須要使用-a
或--app
命令行選項運行systrace
,並指定應用程序的包名稱。
一般咱們在懷疑引發jank代碼地方,添加以下內容:Trace.beginSection("MyAdapter.onCreateViewHolder");
和 Trace.endSection();
能夠查看自定義的從開始到結束期間的Systrace信息。這兩個是成對出現的,須要注意一下。
屢次調用beginSection(String)
時,調用endSection()
只會結束最近調用的beginSection(String)
方法。 所以,對於嵌套的調用,例如上面示例中的調用,您須要確保經過調用endSection()
將每一個調用正確匹配到beginSection()
。
此外,您不能在一個線程上調用beginSection()
並從另外一個線程結束 - 您必須從同一線程調用endSection()
。
Traceview
是提供Systrace的圖形顯示工具。 您能夠經過使用Debug
類來設置代碼來生成log。 這種跟蹤方法很是精確,由於您能夠準確指定要啓動的代碼中的哪一個位置,並中止記錄Systrace數據。 使用Traceview
檢查這些log可幫助您調試您的應用程序並剖析其性能。
另外,可使用命令行中的dmtracedump
來生成跟蹤日誌文件的圖形調用堆棧圖。
若是您不須要查看經過使用Debug
類檢測應用程序來記錄的Systrace日誌,則可使用Android Studio 3.0
及更高版本中包含的CPU Profiler
來查看應用程序的線程和記錄方法跟蹤。
使用Android Device Monitor
能夠查看trace Log內容,步驟以下,打開Android Device Monitor
,選擇File
,而後打開*.trace log分析。
固然,你也可使用Android Device Monitor
的圖形按鍵進行trace
的抓取與查看。
打開Trace log後,Traceview
使用如下兩個窗格顯示log數據:
每一個線程的執行都顯示在本身的進程中,而且時間向右增長。 每種方法都以不一樣的顏色顯示。 第一行下方的細線顯示所選方法的子項(從入口到出口),以下圖所示。
以下圖所示,配置文件窗格提供了系統在Systrace期間每種方法的執行的列表以及耗時。
另外,調用另外一個方法的方法稱爲父級方法,父級調用的方法稱爲其子級。 當您經過單擊方法選擇一種方法時,它會在兩個單獨的節點下顯示其父項和子項。
對於配置文件窗格中的每一個頂級節點,表中的Calls + Rec
,Calls / Total
列(圖2中未顯示)將顯示該方法調用次數和遞歸調用次數。或者,對於父級和子級方法,此列顯示方法在頂級節點中是方法的子級或父級的調用次數。
最後對於程序員來講,要學習的知識內容、技術有太多太多,要想不被環境淘汰就只有不斷提高本身,歷來都是咱們去適應環境,而不是環境來適應咱們!
這裏附上上述的技術體系圖相關的幾十套騰訊、頭條、阿里、美團等公司19年的面試題,把技術點整理成了視頻和PDF(實際上比預期多花了很多精力),包含知識脈絡 + 諸多細節,因爲篇幅有限,這裏以圖片的形式給你們展現一部分。
相信它會給你們帶來不少收穫:
上述【高清技術腦圖】以及【配套的架構技術PDF】能夠 加我wx:X1524478394 免費獲取!
當程序員容易,當一個優秀的程序員是須要不斷學習的,從初級程序員到高級程序員,從初級架構師到資深架構師,或者走向管理,從技術經理到技術總監,每一個階段都須要掌握不一樣的能力。早早肯定本身的職業方向,才能在工做和能力提高中甩開同齡人。