這2種方式能夠根據場景,去選擇哪種方式。最終效果是同樣的java
步驟1: 好比咱們知道在點擊一個按鈕的時候,會有卡頓,那麼就能夠用web
//能夠用如下代碼測試你的代碼。
//開始埋點,「app」是最後生成的性能分析文件
Debug.startMethodTracing("App");
//埋點結束,期間start 到 stop 之間的代碼,就是你要測試的代碼範圍
Debug.stopMethodTracing();
複製代碼
步驟2: 運行完測試代碼後,咱們點開studio右下角的Device Explorer,在下圖的「第一步」,打開以後咱們要找到咱們生成的trace文件,路徑在sdcard/Android/data/項目包名/files,如圖:性能優化
步驟3: 直接左鍵雙擊能夠打開咱們的文件如圖:網絡
部分1:是時間選擇範圍,整段就是咱們剛剛用代碼埋點指定的。上面的時間標誌是時間戳。
部分2:表示當前埋點的代碼有5個線程。能夠點擊任何一個線程查看
部分3:這裏有4個按鈕app
接下來咱們具體看看這四個按鈕函數
點開咱們的Top Down,以下:佈局
紅色框1: 表示main裏的一些狀況。性能
紅色框2: 裏面有2個選項,能夠切換成Wall Clock Time或者Thread Time學習
爲何這兩個時間會不同?舉個不恰當的比喻,好比運行一個方法,由於鎖的緣由,線程等待。這個時候等待時間也算在了Wall Clock Time裏。 可是Thread Time是CPU的執行時間,線程閒置的時候並無消耗CPU,固然這個等待時間也就不算在Thread Time裏了。測試
紅色框3: 表示方法的依次調用。及每一個子方法調用所消耗的時間。這裏也能夠當作是Call Chart表的「代碼化」。
點開Call Chart以下:
這裏注意要注意幾點:點開Flame Chart後,以下:
這裏的意思是會把類似或相同的方法統計在一塊兒,好比A方法調用B方法調用C方法:A->B->C,那麼他會將全部按此順序的方法收集在一塊兒,或者將A->B->D也會收集在上,橫軸表示的是相對時間。
點開Bottom Up以下
這裏點開initX5web() -> 顯示了main();也就是說誰調用了我。main()方法裏調用initX5web();
點擊Profile運行項目
運行後以下圖:
鼠標移動到CPU那裏後,左鍵雙擊CPU後,如圖:
能夠看到,這裏和咱們上面用代碼埋點界面幾乎相同了,這裏有個按鈕,Record,點擊後,文案會變成stop;咱們就能夠在APP裏操做,來到咱們以爲卡頓或者有問題的功能裏。點擊stop就造成了咱們trace同樣的文件裏。裏面的操做都是同樣的
拿之前作的一個項目舉例,爲了避免被騷擾,這裏我隱藏了手機號。看看下面的gif,這裏我在輸入密碼後,點擊登陸,在網絡請求結束後,dialog已經消失了,尚未跳轉到咱們的首頁,如圖,此時有明顯的卡頓
在咱們logcat裏過濾關鍵字:Displayed 能夠看到咱們程序中每一個Activity的啓動時間,此時個人啓動時間是996,接近1s(fuck,這樣都有996,擦):
這個時候咱們用第二種方式去嘗試解決這個卡頓,根據咱們的Top Down分析,根絕Total的耗時時間,咱們一直往下點,首先來到以下(假設咱們還不知道是跳轉Activity卡頓):
這時候到了2個方法,dispatchMessage()和next();
咱們先將dispatchMessage點到底,看到了setContentView()裏的loadDrawable()。能夠看到這個是元兇
由上面的分析,最終問題定在了setContentView()裏的loadDrawable()。也就是說明咱們MainActivity的layout裏,不論是src仍是background,有一個很是耗時的bitmap。這裏我照下來以後,確實發現了根佈局的background裏背景大圖,我這裏直接取消這張圖後,運行程序,以下,能夠發現再也不卡頓了,並且跳轉速度大大提高了:
打印下時間,啓動時間由原來的996,變成了447:
這裏我只是舉了個小例子,但願對學習性能優化的朋友有幫助。若是以爲有用,就贊一個吧!!