前言
本篇文章是《深入理解Android布局優化》系列文章的第二篇。系列的主要目的是希望將Android開發中涉及布局優化的部分做一次系統的歸納、總結和學習。本系列文章包含理論基礎、常見工具、項目實踐三個部分。
理論基礎:「深入理解Android布局優化 1」-布局的加載流程與繪制原理,主要講解布局的加載流程與繪制原理,從源碼上發現布局的性能瓶頸。
常見工具:「深入理解Android布局優化 2」-常見工具的使用,主要講解Android布局優化時各種常見工具的使用。
項目實踐:以一個實際的APP為例,將學習到的理論和工具,實際運用到Android開發中。
本文中實踐時使用的項目地址:https://github.com/linux-link/Fan,可以先閱讀這篇文章了解這個項目一次組件化與Android Jetpack的實踐
本篇屬于三個部分中的常見工具部分。
目錄
- 工具集
- GPU過度繪制
- 渲染耗時
- Layout Inspector
- Choreographer
- Systrace
- Matrix
- 總結
正文
一、工具集
在Android的布局優化中也有大量的工具可供選擇,這里整理了一些常用且易于上手的工具,如下所示
工具 | 能力 | 上手難度 |
---|---|---|
GPU過度繪制 | 發現布局過度嵌套 | 低 |
GPU呈現模式分析 | 統計布局繪制耗時 | 低 |
Layout Inspector | 列出布局樹 | 中 |
Choreographer | 統計界面的FPS | 中 |
Systrace | 統計進程的內核信息 | 高 |
Matrix | 全方位發現Android中的性能問題 | 高 |
二、GPU過度繪制
過度繪制(Overdraw)描述的是屏幕上的某個像素在同一幀的時間內被繪制了多次。在多層次的UI結構里面, 如果不可見的UI也在做繪制的操作,這就會導致某些像素區域被繪制了多次。這就浪費大量的CPU以及GPU資源。
- 藍色: 代表1層覆蓋。像素繪制了兩次。大片的藍色還是可以接受的,若整個窗口是藍色的,可以擺脫一層。
- 綠色: 代表2層覆蓋。像素繪制了三次。中等大小的綠色區域是可以接受的但你應該嘗試優化、減少它們。
- 淡紅: 代表3層覆蓋倍。像素繪制了四次,小范圍可以接受。
- 深紅: 代表4層覆蓋。像素繪制了五次或者更多。
以MIUI系統為例,展示如何打開GPU過度繪制,更多設置 -> 開發者選項 -> 調試GPU過度繪制 -> 顯示過度繪制區域。
理論上來說深紅色的區域是需要重點優化的對象,我們需要盡可能減少過度繪制,不過在實際項目中需要根據開發的具體情況來靈活判斷。
三、GPU呈現模式分析
渲染耗時顧名思義就是APP的界面在渲染過程中消耗的時間,在Android中每一楨的渲染耗時控制在16ms以內,則不會產生卡頓的感覺。
以MIUI系統為例,展示如何查看渲染耗時。選擇更多設置->開發者選項->GPU呈現模式分析->在屏幕上顯示為條形圖
開啟之后,在手機中查看任意界面,界面上都會滾動顯示垂直的柱狀圖來表示每幀畫面所需要渲染的時間,柱狀圖越高表示花費的渲染時間越長。如圖所示
從Android 6.0之后每一楨的繪制大致有個8個步驟:
-
Swap Buffers
表示處理任務的時間,也可以說是CPU等待GPU完成任務的時間,線條越高,表示GPU做的事情越多;
-
Command Issue
表示執行任務的時間,這部分主要是Android進行2D渲染顯示列表的時間,為了將內容繪制到屏幕上,Android需要使用Open GL ES的API接口來繪制顯示列表,紅色線條越高表示需要繪制的視圖更多;
-
Sync & Upload
表示的是準備當前界面上有待繪制的圖片所耗費的時間,為了減少該段區域的執行時間,我們可以減少屏幕上的圖片數量或者是縮小圖片的大小;
-
Draw
表示測量和繪制視圖列表所需要的時間,藍色線條越高表示每一幀需要更新很多視圖,或者View的onDraw方法中做了耗時操作;
-
Measure/Layout
表示布局的onMeasure與onLayout所花費的時間,一旦時間過長,就需要仔細檢查自己的布局是不是存在嚴重的性能問題;
-
Animation
表示計算執行動畫所需要花費的時間,包含的動畫有ObjectAnimator,ViewPropertyAnimator,Transition等等。一旦這里的執行時間過長,就需要檢查是不是使用了非官方的動畫工具或者是檢查動畫執行的過程中是不是觸發了讀寫操作等等;
-
Input Handling
表示系統處理輸入事件所耗費的時間,粗略等于對事件處理方法所執行的時間。一旦執行時間過長,意味著在處理用戶的輸入事件的地方執行了復雜的操作;
-
Misc Time/Vsync Delay
表示在主線程執行了太多的任務,導致UI渲染跟不上vSync的信號而出現掉幀的情況;
四、Layout Inspector
關于Layout Inspector的使用,google的官方中文文檔說的非常詳細,強烈推薦仔細閱讀,以下內容節選自官方文檔,更多更詳細的內容,請仔細閱讀官方文檔使用 Layout Inspector 調試布局。
利用 Android Studio 中的布局檢查器,可以在運行時從 Android Studio IDE 內檢查自己應用的視圖層次結構。 如果布局在運行時(而不是完全在 XML 中)構建并且布局沒有按預期顯示,這種檢查將非常有用。
按以下步驟操作,打開布局檢查器:
在連接的設備或模擬器上運行您的應用。
點擊Tools > Android > Layout Inspector。
-
在出現的Choose Process對話框中,選擇您想要檢查的應用進程,然后點擊OK。
Choose Process 對話框默認情況下,Choose Process對話框僅會為 Android Studio 中當前打開的項目列出進程,并且該項目必須在設備上運行。 如果您想要檢查設備上的其他應用,請點擊Show all processes。 如果您正在使用已取得 root 權限的設備或者沒有安裝 Google Play 商店的模擬器,那么您會看到所有正在運行的應用。 否則,您只能看到可以調試的運行中應用。
布局檢查器會捕獲快照,將它保存為.li
文件并打開。 如圖 2 中所示,布局檢查器將顯示以下內容:
- View Tree:視圖在布局中的層次結構。
- Screenshot:帶每個視圖可視邊界的設備屏幕截圖。
-
Properties Table:選定視圖的布局屬性。
布局檢查器
可以在View Tree中點擊視圖以在屏幕截圖中選擇相同視圖,反之亦然。 視圖的所有布局屬性都將顯示在Properties Table中。
如果布局包括重疊視圖,則默認情況下,只有前面的視圖可以在屏幕截圖中點擊。 要讓后面的視圖可以在屏幕截圖中點擊,請執行以下操作: 在View Tree中右鍵點擊前面的視圖,然后取消選中Show in preview。 此操作不會讓視圖內容消失;僅會讓屏幕截圖中的可點擊邊界消失,以便您可以點擊在它后面的視圖。
如果設備上的布局發生變化,布局檢查器不會更新。 必須再次點擊Tools > Android > Layout Inspector,創建一個新的快照。每一個快照都將保存到project-name/captures/
內一個單獨的.li
文件中。
五、Choreographer
上面介紹的幾種檢測方式只適合線下使用,如果我們需要在線上獲取已經發布APP的卡頓情況,則適合使用Choreographer。
通過 Choreographer.getInstance().postFrameCallback(),可以獲得當前的界面的FPS,通過檢查一段時間內的FPS值,我們就可以得知當前界面是否發生了卡頓。
private static final long MONITOR_INTERVAL = 1600L; //單次計算FPS使用1600毫秒
private static final long MONITOR_INTERVAL_NANOS = MONITOR_INTERVAL * 1000L * 1000L;//顯示fps的間隔時間,1.6秒
private static final long MAX_INTERVAL = 1000L; //設置計算fps的單位時間間隔1000ms,即fps/s;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(flipView);
Choreographer.getInstance().postFrameCallback(new Choreographer.FrameCallback() {
@Override
public void doFrame(long frameTimeNanos) {
if (lastFrameTime == 0) {
lastFrameTime = frameTimeNanos;
}
long interval = frameTimeNanos - lastFrameTime;
if (interval > MONITOR_INTERVAL_NANOS) {
double fps = (((double) (frameCount * 1000L * 1000L)) / interval) * MAX_INTERVAL;
Log.e("fps:", fps + "");
frameCount = 0;
lastFrameTime = 0;
} else {
++frameCount;
}
Choreographer.getInstance().postFrameCallback(this);
}
});
}
2019-06-28 22:10:18.918 24460-24460/com.link.flipview E/fps:: 61.04245124020559
2019-06-28 22:10:19.098 24460-24460/com.link.flipview E/fps:: 61.04702584262233
2019-06-28 22:10:19.278 24460-24460/com.link.flipview E/fps:: 61.047967231502405
2019-06-28 22:10:19.459 24460-24460/com.link.flipview E/fps:: 61.04632000634784
2019-06-28 22:10:19.639 24460-24460/com.link.flipview E/fps:: 61.04324641755805
2019-06-28 22:10:19.819 24460-24460/com.link.flipview E/fps:: 61.046939755064415
2019-06-28 22:10:19.999 24460-24460/com.link.flipview E/fps:: 61.050491907012486
2019-06-28 22:10:20.179 24460-24460/com.link.flipview E/fps:: 61.042186309896735
2019-06-28 22:10:20.360 24460-24460/com.link.flipview E/fps:: 61.04657118380607
2019-06-28 22:10:20.541 24460-24460/com.link.flipview E/fps:: 61.048108852294455
六、Systrace
Systrace是Android性能優化時非常常用的工具,它可以記錄短時間內的設備活動情況,并生成一份Android內核中的數據報告,例如CPU調度程序,磁盤活動和應用程序線程等等。
Systrace生成的報告如圖所示:
此報告提供了Android設備在給定時間段內的系統進程的總體情況。該報告還檢查捕獲的跟蹤信息,以突出顯示它所觀察到的問題,例如UI jank或高功耗。
注意:Systrace工具不會收集有關應用程序進程中代碼執行的信息。有關應用程序正在執行的方法以及它使用的CPU資源的更多詳細信息,請使用Android Studio中的CPU分析器。您還可以 使用CPU Profiler 生成跟蹤日志并導入和檢查它們。
Systrace指南
要了解有關Systrace工具的更多信息,請參閱以下官方指南,或者閱讀這篇官方文檔的譯文:https://www.cnblogs.com/andy-songwei/p/10659564.html
-
定義可以傳遞到Systrace命令行界面的不同選項和標志。
-
說明如何在Android9或更高版本的設備上直接捕獲systrace。
-
解釋systrace的報告,以及瀏覽報告時常用快捷鍵,并描述如何識別性能問題。
-
描述如何在代碼中使用自定標簽,讓systrace更簡單易用。
-
提高游戲性能(Improve your game's performance)
描述如何使用Systrace工具改進游戲中的特定性能區域,包括幀速率一致性,功耗和渲染平滑度。
七、Matrix
Matrix 是一款微信研發并日常使用的應用性能接入框架,支持iOS, macOS和Android。 Matrix 通過接入各種性能監控方案,對性能監控項的異常數據進行采集和分析,輸出相應的問題分析、定位與優化建議,從而幫助開發者開發出更高質量的應用。
Matrix-android 當前監控范圍包括:應用安裝包大小,幀率變化,啟動耗時,卡頓,慢方法,SQLite 操作優化,文件讀寫,內存泄漏等等。
APK Checker: 針對 APK 安裝包的分析檢測工具,根據一系列設定好的規則,檢測 APK 是否存在特定的問題,并輸出較為詳細的檢測結果報告,用于分析排查問題以及版本追蹤
Resource Canary: 基于 WeakReference 的特性和 Square Haha 庫開發的 Activity 泄漏和 Bitmap 重復創建檢測工具
Trace Canary: 監控界面流暢性、啟動耗時、頁面切換耗時、慢函數及卡頓等問題
SQLite Lint: 按官方最佳實踐自動化檢測 SQLite 語句的使用質量IO Canary: 檢測文件 IO 問題,包括:文件 IO 監控和 Closeable Leak 監控
關于Matrix就簡單介紹到這里,更多更詳細的資料以及使用幫助請查閱官方文檔:
https://github.com/Tencent/matrix#matrix_cn
八、總結
本篇文章梳理了6種不同的UI優化工具,這些工具中大多都比較常用,其中比較重要的有Layout Inspector和Systrace,Matrix因為需要引入第三方框架,在實際項目可以根據需要決定是否使用。下一篇將以一個《飯fan》的源碼為例,通過運用這三種工具來發現、解決項目中性能問題。