「深入理解Android布局優化 2」-常見工具的使用

前言

本篇文章是《深入理解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過度繪制

理論上來說深紅色的區域是需要重點優化的對象,我們需要盡可能減少過度繪制,不過在實際項目中需要根據開發的具體情況來靈活判斷。

qq中存在的過度繪制現象

三、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 中)構建并且布局沒有按預期顯示,這種檢查將非常有用。

按以下步驟操作,打開布局檢查器:

  1. 在連接的設備或模擬器上運行您的應用

  2. 點擊Tools > Android > Layout Inspector

  3. 在出現的Choose Process對話框中,選擇您想要檢查的應用進程,然后點擊OK

    Choose Process 對話框

    默認情況下,Choose Process對話框僅會為 Android Studio 中當前打開的項目列出進程,并且該項目必須在設備上運行。 如果您想要檢查設備上的其他應用,請點擊Show all processes。 如果您正在使用已取得 root 權限的設備或者沒有安裝 Google Play 商店的模擬器,那么您會看到所有正在運行的應用。 否則,您只能看到可以調試的運行中應用。

布局檢查器會捕獲快照,將它保存為.li文件并打開。 如圖 2 中所示,布局檢查器將顯示以下內容:

  1. View Tree:視圖在布局中的層次結構。
  2. Screenshot:帶每個視圖可視邊界的設備屏幕截圖。
  3. Properties Table:選定視圖的布局屬性。
    布局檢查器

可以在View Tree中點擊視圖以在屏幕截圖中選擇相同視圖,反之亦然。 視圖的所有布局屬性都將顯示在Properties Table中。

如果布局包括重疊視圖,則默認情況下,只有前面的視圖可以在屏幕截圖中點擊。 要讓后面的視圖可以在屏幕截圖中點擊,請執行以下操作: 在View Tree中右鍵點擊前面的視圖,然后取消選中Show in preview。 此操作不會讓視圖內容消失;僅會讓屏幕截圖中的可點擊邊界消失,以便您可以點擊在它后面的視圖。

如果設備上的布局發生變化,布局檢查器不會更新。 必須再次點擊Tools > Android > Layout Inspector,創建一個新的快照。每一個快照都將保存到project-name/captures/內一個單獨的.li文件中。

Project 窗口中的布局檢查器快照(.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生成的報告如圖所示:

Systrace HTML報告示例

此報告提供了Android設備在給定時間段內的系統進程的總體情況。該報告還檢查捕獲的跟蹤信息,以突出顯示它所觀察到的問題,例如UI jank或高功耗。

注意:Systrace工具不會收集有關應用程序進程中代碼執行的信息。有關應用程序正在執行的方法以及它使用的CPU資源的更多詳細信息,請使用Android Studio中的CPU分析器。您還可以 使用CPU Profiler 生成跟蹤日志并導入和檢查它們。

Systrace指南

要了解有關Systrace工具的更多信息,請參閱以下官方指南,或者閱讀這篇官方文檔的譯文:https://www.cnblogs.com/andy-songwei/p/10659564.html

七、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》的源碼為例,通過運用這三種工具來發現、解決項目中性能問題。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,431評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,637評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,555評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,900評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,629評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,976評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,976評論 3 448
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,139評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,686評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,411評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,641評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,129評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,820評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,233評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,567評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,362評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,604評論 2 380

推薦閱讀更多精彩內容