1. 程式人生 > >度量UI效能耗時的標準制定調研

度量UI效能耗時的標準制定調研

假設LinearLayout裡有個RecyclerView,以下描述都是微秒計,1000微妙(us)=1毫秒:
A. 當RecyclerView的layout_width和layout_height都設定為300dp時,LinearLayout的onMeasure耗時是700us。
B. 當RecyclerView的layout_width=match_parent,而layout_height=wrap_content時,LinearLayout的onMeasure耗時是40000us。
所以我們應該使勁壓榨設計出圖時,必須給出一個確定尺寸的RecyclerView?

但是事實上,B方案的onLayout花了700us,而A方案的onLayout花了40000us,(這兩個不是精確數值),然後你怎麼想?
當太監看到此處,遂練會了乾坤大挪移,使勁逃逸轉嫁耗時。江湖人見 別人花40毫秒測量,他只用了不到1毫秒。

另一個大神過來,將RecyclerView硬是替換成了可滾動的LinearLayout,然後耗時從40000us變成了3000us,因為此處佈局帶來的記憶體不同無法體現啊,兩位大哥終將狹路相逢。

承然,有RecyclerView的佈局相對來說要耗時一些,但是拿它們的直接onMeasure資料(一個50毫秒,一個3毫秒)進行對比是不公平的。
首先,RecyclerView的item是需要即時從layout.xml中解析穿針引線的,可以看到onCreateViewHolder有明顯的耗時。
其次,RecyclerView除了支援viewholder的複用(減少資源浪費),而且支援眾item的聯動動畫,dispatchLayoutStep1,dispatchLayoutStep2,dispatchLayoutStep3有大部分都是為此服務的,動畫中佈局不穩定,width,height不穩定,所以耗時也是可以理解的,擴充套件性越好,功能越複雜,越耗時,合理公平。
上面的A, B的總耗時基本一致(B確實會更耗時一點)。但是最重要的不公平來了,我們以B方案為例,它的onMeasure耗時40毫秒,但是它的onMeasure裡包括了所有子item的onMeasure,onLayout階段耗時並且包括view系統在此穿針引線的程式碼耗時,你說這對它公平?

另一個不公平的點是,Activity啟動會測量兩次,如果你的佈局在第一次測量時需要進行(因為此時Window的size可能還未定?),那麼比第二次才開始的測量要耗時。另一個層面上講,一個自定義MyTextView,在第一次從佈局載入時,此類才會被載入(就是有類載入的耗時)。而且第一次一定沒有測量的快取。所以誰跑在第一個位置誰吃虧。(建議只進行水平對比測試)

綜上。
檢視效能的指標不能孤立的對比onMeasure,onLayout,onDraw。

個人愚見,目前還只是初步設想,指標應從兩個方面反映,並體現公平性。

  1. 從使用者等待的角度,分成佈局時間指標(onMeasure的開始處計時到onLayout的結尾處結束計時)和繪製時間指標(draw方法的前後,和過去一樣);
  2. 從開發者的角度,

A: recyclerview的佈局指標,測量item的onMeasure,和onLayout,而不是包含recyclerview本身的檢視,外檢視本身比較簡單,佈局功力體現在item上。

B: 繪製指標關注此方法中是否頻繁建立物件這樣的記憶體指標,以及systrace中vsync的影響。

  1. 橫劃類不與普通類的模板進行對比,分成兩類。
  2. 只度量模板在RecyclerView中首次出現的情況,最好是將其置頂進行鞭打。

另外:

我印象中draw方法裡用Path的方法本身不會導致耗時,但是Path好像無法硬體加速,後面真正渲染在surface或bitmap時的耗時沒有考慮在內。所以單純的測量draw的耗時,有時起不到作用。
我之前另一個測試結論。RelativeLayout會測量其子view們兩次,假設onMeasure分別耗時是700us,200us,(再次說明以某一次的onMeasure,比如200us進行衡量沒有意義),ConstraintLayout在此種情況下只測量了一次其子view, 但是onMeasure的耗時是4000us。所以onMeasure的次數不應該左右你做出佈局的決定,除非你知道會測量兩次,但是其子view數眾多。不過這種積少成多一般會反映在自己的onMeasure耗時上。
假設:

MyLinearLayout裡有RecyclerView。

RecyclerView裡的item佈局頂層是MyFrameLayout,MyFrameLayout裡有MyTextView。

測試資料:

RecyclerView的layout_width=“match_parent”, layout_height=“200dp”:

2018-11-29 12:43:09.391 1196-1196/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyLinearLayout{817769a V.E… …I. 0,0-0,0}: onMeasure start
2018-11-29 12:43:09.407 1196-1196/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyFrameLayout{ee40da1 V.E… …I. 0,0-0,0}: onMeasure start
2018-11-29 12:43:09.407 1196-1196/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyTextView{ec70bc6 V.ED… …ID 0,0-0,0 #7f070027 app:id/bssi}: onMeasure start
2018-11-29 12:43:09.408 1196-1196/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyTextView{ec70bc6 V.ED… …ID 0,0-0,0 #7f070027 app:id/bssi}: onMeasure end 733
2018-11-29 12:43:09.408 1196-1196/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyFrameLayout{ee40da1 V.E… …I. 0,0-0,0}: onMeasure end 1477
2018-11-29 12:43:09.408 1196-1196/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyFrameLayout{ee40da1 V.E… …ID 0,0-1080,126}: onLayout start
2018-11-29 12:43:09.409 1196-1196/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyTextView{ec70bc6 V.ED… …ID 0,0-788,51 #7f070027 app:id/bssi}: onLayout start
2018-11-29 12:43:09.409 1196-1196/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyTextView{ec70bc6 V.ED… …ID 0,0-788,51 #7f070027 app:id/bssi}: onLayout end
2018-11-29 12:43:09.409 1196-1196/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyFrameLayout{ee40da1 V.E… …ID 0,0-1080,126}: onLayout end
2018-11-29 12:43:09.416 1196-1196/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyFrameLayout{86d25aa V.E… …I. 0,0-0,0}: onMeasure start
2018-11-29 12:43:09.416 1196-1196/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyTextView{36f059b V.ED… …ID 0,0-0,0 #7f070027 app:id/bssi}: onMeasure start
2018-11-29 12:43:09.416 1196-1196/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyTextView{36f059b V.ED… …ID 0,0-0,0 #7f070027 app:id/bssi}: onMeasure end 290
2018-11-29 12:43:09.417 1196-1196/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyFrameLayout{86d25aa V.E… …I. 0,0-0,0}: onMeasure end 784
2018-11-29 12:43:09.417 1196-1196/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyFrameLayout{86d25aa V.E… …ID 0,126-1080,252}: onLayout start
2018-11-29 12:43:09.417 1196-1196/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyTextView{36f059b V.ED… …ID 0,0-788,51 #7f070027 app:id/bssi}: onLayout start
2018-11-29 12:43:09.417 1196-1196/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyTextView{36f059b V.ED… …ID 0,0-788,51 #7f070027 app:id/bssi}: onLayout end
2018-11-29 12:43:09.417 1196-1196/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyFrameLayout{86d25aa V.E… …ID 0,126-1080,252}: onLayout end
2018-11-29 12:43:09.424 1196-1196/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyFrameLayout{e7eda4e V.E… …I. 0,0-0,0}: onMeasure start
2018-11-29 12:43:09.425 1196-1196/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyTextView{8dae76f V.ED… …ID 0,0-0,0 #7f070027 app:id/bssi}: onMeasure start
2018-11-29 12:43:09.425 1196-1196/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyTextView{8dae76f V.ED… …ID 0,0-0,0 #7f070027 app:id/bssi}: onMeasure end 325
2018-11-29 12:43:09.425 1196-1196/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyFrameLayout{e7eda4e V.E… …I. 0,0-0,0}: onMeasure end 864
2018-11-29 12:43:09.425 1196-1196/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyFrameLayout{e7eda4e V.E… …ID 0,252-1080,378}: onLayout start
2018-11-29 12:43:09.426 1196-1196/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyTextView{8dae76f V.ED… …ID 0,0-788,51 #7f070027 app:id/bssi}: onLayout start
2018-11-29 12:43:09.426 1196-1196/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyTextView{8dae76f V.ED… …ID 0,0-788,51 #7f070027 app:id/bssi}: onLayout end
2018-11-29 12:43:09.426 1196-1196/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyFrameLayout{e7eda4e V.E… …ID 0,252-1080,378}: onLayout end
2018-11-29 12:43:09.432 1196-1196/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyFrameLayout{66d2db2 V.E… …I. 0,0-0,0}: onMeasure start
2018-11-29 12:43:09.433 1196-1196/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyTextView{a14e103 V.ED… …ID 0,0-0,0 #7f070027 app:id/bssi}: onMeasure start
2018-11-29 12:43:09.433 1196-1196/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyTextView{a14e103 V.ED… …ID 0,0-0,0 #7f070027 app:id/bssi}: onMeasure end 284
2018-11-29 12:43:09.433 1196-1196/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyFrameLayout{66d2db2 V.E… …I. 0,0-0,0}: onMeasure end 763
2018-11-29 12:43:09.434 1196-1196/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyFrameLayout{66d2db2 V.E… …ID 0,378-1080,504}: onLayout start
2018-11-29 12:43:09.434 1196-1196/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyTextView{a14e103 V.ED… …ID 0,0-788,51 #7f070027 app:id/bssi}: onLayout start
2018-11-29 12:43:09.434 1196-1196/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyTextView{a14e103 V.ED… …ID 0,0-788,51 #7f070027 app:id/bssi}: onLayout end
2018-11-29 12:43:09.434 1196-1196/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyFrameLayout{66d2db2 V.E… …ID 0,378-1080,504}: onLayout end
2018-11-29 12:43:09.441 1196-1196/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyFrameLayout{799e3d6 V.E… …I. 0,0-0,0}: onMeasure start
2018-11-29 12:43:09.441 1196-1196/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyTextView{d756657 V.ED… …ID 0,0-0,0 #7f070027 app:id/bssi}: onMeasure start
2018-11-29 12:43:09.441 1196-1196/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyTextView{d756657 V.ED… …ID 0,0-0,0 #7f070027 app:id/bssi}: onMeasure end 306
2018-11-29 12:43:09.441 1196-1196/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyFrameLayout{799e3d6 V.E… …I. 0,0-0,0}: onMeasure end 820
2018-11-29 12:43:09.442 1196-1196/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyFrameLayout{799e3d6 V.E… …ID 0,504-1080,630}: onLayout start
2018-11-29 12:43:09.442 1196-1196/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyTextView{d756657 V.ED… …ID 0,0-788,51 #7f070027 app:id/bssi}: onLayout start
2018-11-29 12:43:09.442 1196-1196/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyTextView{d756657 V.ED… …ID 0,0-788,51 #7f070027 app:id/bssi}: onLayout end
2018-11-29 12:43:09.442 1196-1196/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyFrameLayout{799e3d6 V.E… …ID 0,504-1080,630}: onLayout end
2018-11-29 12:43:09.443 1196-1196/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyLinearLayout{817769a V.E… …ID 0,0-0,0}: onMeasure end 51177
2018-11-29 12:43:09.443 1196-1196/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyLinearLayout{817769a V.E… …ID 0,0-1080,525}: onLayout start
2018-11-29 12:43:09.443 1196-1196/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyLinearLayout{817769a V.E… …ID 0,0-1080,525}: onLayout end

RecyclerView的layout_width=“match_parent”, layout_height=“wrap_content”:
2018-11-29 12:43:53.634 1403-1403/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyLinearLayout{817769a V.E… …I. 0,0-0,0}: onMeasure start
2018-11-29 12:43:53.634 1403-1403/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyLinearLayout{817769a V.E… …I. 0,0-0,0}: onMeasure end 120
2018-11-29 12:43:53.634 1403-1403/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyLinearLayout{817769a V.E… …ID 0,0-1080,525}: onLayout start
2018-11-29 12:43:53.649 1403-1403/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyFrameLayout{ee40da1 V.E… …I. 0,0-0,0}: onMeasure start
2018-11-29 12:43:53.650 1403-1403/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyTextView{ec70bc6 V.ED… …ID 0,0-0,0 #7f070027 app:id/bssi}: onMeasure start
2018-11-29 12:43:53.650 1403-1403/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyTextView{ec70bc6 V.ED… …ID 0,0-0,0 #7f070027 app:id/bssi}: onMeasure end 685
2018-11-29 12:43:53.651 1403-1403/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyFrameLayout{ee40da1 V.E… …I. 0,0-0,0}: onMeasure end 1443
2018-11-29 12:43:53.651 1403-1403/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyFrameLayout{ee40da1 V.E… …ID 0,0-1080,126}: onLayout start
2018-11-29 12:43:53.651 1403-1403/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyTextView{ec70bc6 V.ED… …ID 0,0-788,51 #7f070027 app:id/bssi}: onLayout start
2018-11-29 12:43:53.651 1403-1403/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyTextView{ec70bc6 V.ED… …ID 0,0-788,51 #7f070027 app:id/bssi}: onLayout end
2018-11-29 12:43:53.652 1403-1403/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyFrameLayout{ee40da1 V.E… …ID 0,0-1080,126}: onLayout end
2018-11-29 12:43:53.658 1403-1403/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyFrameLayout{86d25aa V.E… …I. 0,0-0,0}: onMeasure start
2018-11-29 12:43:53.659 1403-1403/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyTextView{36f059b V.ED… …ID 0,0-0,0 #7f070027 app:id/bssi}: onMeasure start
2018-11-29 12:43:53.659 1403-1403/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyTextView{36f059b V.ED… …ID 0,0-0,0 #7f070027 app:id/bssi}: onMeasure end 361
2018-11-29 12:43:53.659 1403-1403/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyFrameLayout{86d25aa V.E… …I. 0,0-0,0}: onMeasure end 971
2018-11-29 12:43:53.660 1403-1403/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyFrameLayout{86d25aa V.E… …ID 0,126-1080,252}: onLayout start
2018-11-29 12:43:53.660 1403-1403/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyTextView{36f059b V.ED… …ID 0,0-788,51 #7f070027 app:id/bssi}: onLayout start
2018-11-29 12:43:53.660 1403-1403/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyTextView{36f059b V.ED… …ID 0,0-788,51 #7f070027 app:id/bssi}: onLayout end
2018-11-29 12:43:53.660 1403-1403/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyFrameLayout{86d25aa V.E… …ID 0,126-1080,252}: onLayout end
2018-11-29 12:43:53.666 1403-1403/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyFrameLayout{e7eda4e V.E… …I. 0,0-0,0}: onMeasure start
2018-11-29 12:43:53.667 1403-1403/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyTextView{8dae76f V.ED… …ID 0,0-0,0 #7f070027 app:id/bssi}: onMeasure start
2018-11-29 12:43:53.667 1403-1403/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyTextView{8dae76f V.ED… …ID 0,0-0,0 #7f070027 app:id/bssi}: onMeasure end 250
2018-11-29 12:43:53.667 1403-1403/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyFrameLayout{e7eda4e V.E… …I. 0,0-0,0}: onMeasure end 711
2018-11-29 12:43:53.667 1403-1403/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyFrameLayout{e7eda4e V.E… …ID 0,252-1080,378}: onLayout start
2018-11-29 12:43:53.668 1403-1403/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyTextView{8dae76f V.ED… …ID 0,0-788,51 #7f070027 app:id/bssi}: onLayout start
2018-11-29 12:43:53.668 1403-1403/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyTextView{8dae76f V.ED… …ID 0,0-788,51 #7f070027 app:id/bssi}: onLayout end
2018-11-29 12:43:53.668 1403-1403/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyFrameLayout{e7eda4e V.E… …ID 0,252-1080,378}: onLayout end
2018-11-29 12:43:53.674 1403-1403/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyFrameLayout{66d2db2 V.E… …I. 0,0-0,0}: onMeasure start
2018-11-29 12:43:53.674 1403-1403/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyTextView{a14e103 V.ED… …ID 0,0-0,0 #7f070027 app:id/bssi}: onMeasure start
2018-11-29 12:43:53.674 1403-1403/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyTextView{a14e103 V.ED… …ID 0,0-0,0 #7f070027 app:id/bssi}: onMeasure end 296
2018-11-29 12:43:53.675 1403-1403/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyFrameLayout{66d2db2 V.E… …I. 0,0-0,0}: onMeasure end 780
2018-11-29 12:43:53.675 1403-1403/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyFrameLayout{66d2db2 V.E… …ID 0,378-1080,504}: onLayout start
2018-11-29 12:43:53.675 1403-1403/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyTextView{a14e103 V.ED… …ID 0,0-788,51 #7f070027 app:id/bssi}: onLayout start
2018-11-29 12:43:53.675 1403-1403/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyTextView{a14e103 V.ED… …ID 0,0-788,51 #7f070027 app:id/bssi}: onLayout end
2018-11-29 12:43:53.675 1403-1403/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyFrameLayout{66d2db2 V.E… …ID 0,378-1080,504}: onLayout end
2018-11-29 12:43:53.682 1403-1403/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyFrameLayout{799e3d6 V.E… …I. 0,0-0,0}: onMeasure start
2018-11-29 12:43:53.682 1403-1403/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyTextView{d756657 V.ED… …ID 0,0-0,0 #7f070027 app:id/bssi}: onMeasure start
2018-11-29 12:43:53.682 1403-1403/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyTextView{d756657 V.ED… …ID 0,0-0,0 #7f070027 app:id/bssi}: onMeasure end 282
2018-11-29 12:43:53.683 1403-1403/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyFrameLayout{799e3d6 V.E… …I. 0,0-0,0}: onMeasure end 804
2018-11-29 12:43:53.683 1403-1403/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyFrameLayout{799e3d6 V.E… …ID 0,504-1080,630}: onLayout start
2018-11-29 12:43:53.683 1403-1403/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyTextView{d756657 V.ED… …ID 0,0-788,51 #7f070027 app:id/bssi}: onLayout start
2018-11-29 12:43:53.683 1403-1403/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyTextView{d756657 V.ED… …ID 0,0-788,51 #7f070027 app:id/bssi}: onLayout end
2018-11-29 12:43:53.683 1403-1403/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyFrameLayout{799e3d6 V.E… …ID 0,504-1080,630}: onLayout end
2018-11-29 12:43:53.684 1403-1403/com.example.lizhehao.temps W/System.err: >>>>>>> com.example.lizhehao.temps.MyLinearLayout{817769a V.E… …ID 0,0-1080,525}: onLayout end