android 內存優化(四) 性能優化-Systrace分析UI性能-含demo

demo下載地址

https://download.csdn.net/download/u010672559/10566043

1.Systrace是什麼:
Systrace是Android4.1中新增的性能數據採樣和分析工具,它可幫助開發者收集Android關鍵子系統(如SurfaceFlinger、WindowManagerService等Framework部分關鍵模塊、服務、View系統等)的運行信息,從而幫助開發者更直觀的分析系統瓶頸,改進性能。
2.Systrace作用:
3.Systrace允許你監視和跟蹤Android系統的行爲,它會告訴你係統都在哪些工作上花費時間、CPU週期都用在哪裏,甚至你可以看到每個線程、進程在指定時間內都在幹嘛。它同時還會突出觀測到的問題,從垃圾回收到渲染內容都可能是問題對象,甚至提供給你建議的解決方案。
4.Systrace的使用:
4.1運行APP,手機準備好你要進行抓取的界面
說明:demo的app大概邏輯是點擊一個button,之後會添加5個數據,並通過listview的adapter更新數據,且此adapter的getview中沒有重convertView,也沒有使用viewhoder,屬於那種可以優化的adapter
4.2通過DDMS啓動Systrace,並配置好參數,抓取時間等,具體見下面的配置說明
打開DDMS裏面的 
 


Destination File :制定生成的trace.html文件的地址
Trace duration:抓取時間,通常設置5秒,並在5秒內重現問題,時間太短會導致問題重現時沒有被抓到,時間太長會導致JavaHeap不夠而無法保存。因此在能抓到問題點的情況下,時間越小越好。
Trace Buffer Size:存儲Systrace的size,同樣太小會導致信息丟失,太長會導致Java Heap不夠而無法保存,建議【20480】。如果檢測結果有異常,請調整Buffer Size的大小試試。
Enable Application Traces from:檢測的應用,默認選擇none,這裏需選擇自己需要檢測的應用
Commonly Used Tag:常用標籤,這部分TAG全部使能上。只關注顯示情況的話 ,只選取Graphics和View System就可以。
Advanced Options:高級選項。如果設備root了,可以看到更多的TAG,如eMMC commands/ Synchonization/Kernel Workqueues。
4.3配置完成之後點擊確定後,開始操作手機,在時間到了後會自動生成報表(這個文件至少也有好幾兆),及生成的trace.html文件
4.4使用Chrome(其他瀏覽器很可能打不開)將這個文件打開進行分析
trace.html分析時常用的快捷鍵
w:用於變大 
s:用於縮小 
d:左邊移動 
a:右邊移動 
5.trace.html文件分析

打開之後是這個界面
然後通過w放大,找F(即Frames)和F之間的間隔時間,如果間隔時間超過16ms的都是有問題的,16ms其實對應的就是60fps(1/60≈16ms),因爲人眼與大腦之間的協作無法感知超過60fps的畫面更新。Android系統每隔16ms發出VSYNC信號,觸發對UI進行渲染,那麼整個過程如果保證在16ms以內就能達到一個流暢的畫面。那麼如果操作超過了16ms就會發生下面的情況,如果系統發生的VSYNC信號,而此時無法進行渲染,還在做別的操作,那麼就會導致丟幀的現象,(大家在察覺到APP卡頓的時候,可以看看logcat控制太,會有drop frames類似的警告)。這樣的話,繪製就會在下一個16ms的時候才進行繪製,即使只丟一幀,用戶也會發現卡頓的。
放大之後會發現
 
看時間1115~1160ms,大概此F到下一個F之間是需要40多ms的,明顯是超過16ms的,然後你會在圖中看到measure-obtainView-inflate-Textview等等字樣,你如果再放大邊會發現其實就是對應demo中的item的佈局,可以理解爲getview的時候時間太長了,原因就是getview沒有用重用的convertView優化,導致每次都需要去重新obtainView-inflate加載view,所以花費的時間比較多,與此同時你如果點擊那個F圖標,然後看界面最下面欄會有相關的提示如下
 
提示也是listview在recycling循環的時候Inflation()通貨膨脹
與此同時也可以點擊右側的Alerts
 
也會有相關的提示,點擊各項會相應的展開,再底部會有相應的提示,如點擊Long View#draw()時提示
Alert    Long View#draw()
Time spent    
3.400 ms
Record View#draw()    took 3.40ms
Frame    
Description    
Recording the drawing commands of invalidated Views took a long time. Avoid significant work in View or Drawable custom drawing, especially allocations or drawing to Bitmaps.
Video Link    Android Performance Patterns: Invalidations, Layouts, and Performance
Video Link    Android Performance Patterns: Avoiding Allocations in onDraw()
----------------
Alert    Inflation during ListView recycling
Time spent    
28.138 ms
ListView items inflated    
5
obtainView    took 9.24ms
setupListItem    took 3.58ms
obtainView    took 2.98ms
setupListItem    took 1.52ms
obtainView    took 2.17ms
setupListItem    took 1.49ms
obtainView    took 2.11ms
setupListItem    took 1.50ms
obtainView    took 2.11ms
setupListItem    took 1.44ms
Frame    
Description    
ListView item recycling involved inflating views. Ensure your Adapter#getView() recycles the incoming View, instead of constructing a new one.
Systrace無法幫你定位到代碼裏面的具體到某一行代碼,但是我們可以通過Alerts和Frames來能基本上優化了不足的地方,然後我們可以根據TraceView來分析具體函數花了多長時間來進一步優化代碼提高性能。

說明:後面demo裏面代碼加了convertview重用,以及viewholder機制,但是導出來的文件也是提示getview時間太長,以上僅僅提供systrace使用方法

 

https://blog.csdn.net/u010672559/article/details/103178632 android 內存優化(一) 防止內存泄漏注意事項

https://blog.csdn.net/u010672559/article/details/103178663 android 內存優化(二) 性能優化

https://blog.csdn.net/u010672559/article/details/81098534 android 內存優化(三) 內存優化工具-MAT的使用及實例分析

https://blog.csdn.net/u010672559/article/details/81223122 android 內存優化(四) 性能優化-Systrace分析UI性能-含demo

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章