Android性能優化總結

2021-02-23 stormzhang

這是來自一位粉絲「MeloDev」的投稿,講真,我這裡投稿的不少,但是只有我自己覺得很不錯的才會通過,這篇文章我覺得對大家有用,而且性能優化也算是我面試必問的一個話題了,所以這裡推薦給大家。微信不支持連結,可點擊「閱讀原文」查看原文。

寫在前面

公司給了我一周的時間去學習Android性能的優化,參考了張明雲老師的一片文章,並且用公司的實際項目進行測試(附有截圖),還進行了一些知識點,注意事項以及很多網址連結的補充,希望這篇博文能讓做性能測試的朋友們少走一些彎路。

文中沒有貼出大段代碼,但是幾乎所有的知識點都有連結,點進去就能看你想看的。轉載註明出處。

性能指標

1. 布局複雜度:布局複雜會導致布局需要更長的時間,從而導致進入應用慢、頁面切換慢;

2. 耗電量:耗電量大會導致機器發熱、縮短機器的有效使用時長;

3. 內存:內存消耗大會導致頻繁GC,GC時會暫停其它工作,導致頁面卡頓;內存洩露會導致剩餘可用內存越來越小;內存不足會導致應用異常;

4. 網絡:頻繁的網絡訪問會導致耗電和影響應用的性能;網絡交互數據大小會影響網絡傳輸的效率;

5. 程序執行效率:糟糕的代碼會嚴重影響程序的運行效率,UI線程過多的任務會阻塞應用的正常運行,長時間持有某個對象會導致潛在的內存洩露,頻繁的IO操作、網絡操作而不用緩存會嚴重影響程序的運行效率。

一、布局複雜度的優化

關於布局的優化,主要分兩個大方向

1. 實現相同界面效果並且層級結構相同時,選用何種Layout最好

在Android中單獨的布局性能:

FrameLayout>LinearLayout>RelativeLayout

可供參考的網址:「LinearLayout與RelativeLayout的性能比較」 


總結:


2. 減少布局的層級結構

「HierarchyViewer的使用」

「無線UIViewer下載」

測試圖片如下: 


當前界面的UI布局層級如上圖所示

總結:

布局優化相關網址: 

「三種優化標籤的使用情景和優勢—張業興 」

「布局優化標籤的源碼分析」

有關布局優化的一些基礎知識準備(郭霖老師的兩篇博客): 

「Android LayoutInflater原理分析,帶你一步步深入了解View(一) 」

「Android視圖繪製流程完全解析,帶你一步步深入了解View(二)」

二、Android開發者模式—GPU過渡繪製

GPU過度繪製定義:

如果你粉刷過一個房間或一所房子,就會知道給牆壁塗上顏色需要做大量的工作。假如你還要重新粉刷一次的話,第二次粉刷的顏色會覆蓋住第一次的顏色,第一次的顏色就永遠不可見了,等於你第一次粉刷做的大量工作就完全被浪費掉。這太可怕了。

同樣的道理,如果在你的應用程式中浪費精力去繪製一些東西同樣會產生性能問題。過度繪製這個名詞就是用來描述屏幕上一個像素在單個幀中被重繪了多少次。

GPU過度繪製就指的是在屏幕一個像素上繪製多次(超過一次),GPU過度繪製或多或少對性能有些影響。

GPU過度繪製分析:

過度繪製其實是一個性能和設計的交叉點。我們在設計上追求很華麗的視覺效果,但一般來說這種視覺效果會採用非常多的層疊組件來實現,這時候就會帶來過度繪製的問題。我們再來看看具體顯示在Android界面層級關係:

當我們來繪製一個界面時,會有一個windows,然後是建立Activity,在Activity裡可以建立多個view,或view group,view也可以嵌套view。這些組件從上到下分布,上面的組件是可以被用戶看見的,而在下面的組件是不可見的,但是我們依然要花很多時間去繪製那些不可見的組件,因為在某些時候,它也可能會顯示出來。

檢測過度繪製:

設置-開發者選項-調試GPU過度繪製-顯示過度繪製區域(過度渲染等,不同機器可能不同)


測試的顏色標識含義:


項目測試截圖:




可以看到項目中並不存在太大問題,有關減少過度繪製的一些建議:

1. 太多重疊的背景

這個問題其實最容易解決,建議前期在設計時儘量保持整體背景統一,另外開發可以檢查你在布局和代碼中設置的背景,有些背景是被隱藏在底下的,它永遠不可能顯示出來,這種沒必要的背景一定要移除,因為它很可能會嚴重影響到app的性能。

2. 太多重疊的view

第一個建議是:使用ViewStub來加載一些不常用的布局,它是一個輕量級且默認不可見的視圖,可以動態的加載一個布局,只有你用到這個重疊著的view的時候才加載,推遲加載的時間。第二個建議是:如果使用了類似viewpager+Fragment這樣的組合或者有多個Fragment在一個界面上,需要控制Fragment的顯示和隱藏,儘量使用動態地Inflation view,它的性能要比SetVisiblity好。

3. 複雜的Layout層級

這裡的建議比較多一些,首先推薦用Android提供的布局工具Hierarchy

三、Android中耗電量的測試

「深入淺出Android App耗電量統計」

測試截圖:


本人認為這一點沒有過多補充的,大多數App都不會消耗過多的電量。

四、內存、CPU、GPU

應用運行時內存使用情況查看:Android Studio—Memory/CPU/GPU

通常這種測試應該使用一個自動化工具(monkey)去不停的點擊App,或者切換界面,來觀察內存、cpu的情況。

1. 內存

測試截圖:


在地圖界面不斷地刷新,正常的內存成鋸齒狀分布。

需要注意的情況:


出現了針狀分布,說明內存發生了突變,如果內存峰值不能降下來,就說明出現了內存溢出,就值得引起我們的關注了。

2. CPU

測試圖片:


3. GPU

Android Studio 1.4增加一項新功能:分析GPU渲染功能。作者詳細講解這一新功能的分析方法。

在GPU選項卡下,可以在屏幕上看到圖形化顯示的渲染每幀所花費的時間。圖形中每條都表示被渲染的一幀。顏色表示進程的不同周期:

繪畫(藍色) 

表示View#onDraw()方法。那部分建立/更改DisplayList對象,然後轉換成GPU能夠理解的OpenGL命令。高的條形可能是視圖複雜,而要求更多的時間繪製它們的顯示列表,而許多視圖在短時間內就失效了。

準備(紫色) 

在Lollipop中,加入另一個線程,以幫助UI線程渲染更快。這個線程叫:RenderThread。它的責任是轉換顯示列表為OpenGL命令,再發送給GPU。這樣在渲染過程中,UI線程可以開始處理下一個幀。這時UI線程將所有資源傳送給RenderThread。如果有許多資源要傳遞(如許多/繁重顯示列表),這一步可能需要較長時間。

處理(紅色) 

執行顯示列表產生OpenGL命令。由於需要視圖重繪,如果有許多/複雜顯示列表要執行轉換,這一步可能需要較長時間。當視圖無效或是移動時,都要要重繪視圖。

執行(黃色) 

發送OpenGL命令到GPU。由於CPU發送這些緩存的命令到GPU,並期待收回乾淨緩存,這就阻塞調用了。緩存數量有限,並且GPU也很忙 

—— 

CPU會發現自己必須先等待緩存釋放。因此,如果在這一步我們見高的條形,就可能意味著GPU在繪製UI時非常忙,這個繪製在短時間內太複雜了。

測試截圖: 


結論:

可以通過切換界面,看圖形的峰值和顏色去判斷繪製View每個階段所花費的時間,然後根據你的需求進行優化。

五、程序的執行效率

六、知名的三方性能優化工具

1. LeakCanary 

LeakCanary是一個檢測內存洩露的開源類庫。你可以在 debug 

包種輕鬆檢測內存洩露。強烈推薦LeakCanary,大多數公司都在使用它進行內存洩漏的測試。

以下是我找到的學習資料,寫的非常棒:

「LeakCanary: 讓內存洩露無所遁形」

「LeakCanary 中文使用說明」

具體使用請參考以上兩個連結,下面給出一個測試截圖,供大家直觀感受其便捷和強大的功能。



結論: LeakCanary非常直觀的展現了MainActivity出現了內存洩漏,並且指出引用路徑中的哪個引用是不該有的,然後修復問題。總而言之非常好用,處理內存洩漏首選的工具。

2. GT 

GT是騰訊開發的一款APP的隨身調測平臺,利用GT,可以對CPU、內存、流量、點亮、幀率/流暢度進行測試,還可以查看開發日誌、crash日誌、抓取網絡數據包、APP內部參數調試、真機代碼耗時統計等等,需要說明的是,應用需要集成GT的sdk後,GT這個apk才能在應用運行時對各個性能進行檢測。

「GT官方網址」

下面是使用GT測試項目的截圖:




具體圖片是什麼含義,大家去點擊官網去了解學習就可以,GT還是很全面好用的,慢慢發掘吧。

相關焦點

  • Android性能優化:手把手帶你全面實現內存優化
    最近有想換工作的同學們,可參考《5月技術崗位內推|RN開發招聘啦》,再往下看,一篇關於性能優化的好文章,很值得去學習。前言在 Android開發中,性能優化策略十分重要本文主要講解性能優化中的內存優化,希望你們會喜歡目錄
  • Android性能優化--內存優化
    本文來自Dotry投稿,連結:https://www.jianshu.com/p/38b627adaecd上一篇文章關於Android性能優化--啟動優化探討了啟動優化相關的知識點,在本篇將介紹內存優化的相關優化。
  • Android性能優化:帶你全面實現內存優化
    本文主要講解性能優化中的內存優化,希望你們會喜歡目錄1.還有1個內存優化的終極方案:調大 虛擬機Dalvik的堆內存大小即 在AndroidManifest.xml的application標籤中增加一個android:largeHeap屬性(值 = true
  • 幾乎是史上最全最實用的Android性能全面分析與優化方案研究
    藉助性能優化工具分析解決問題性能優化指標性能問題分類1、渲染問題: 過度繪製、布局冗雜2、內存問題: 內存浪費(內存管理)、內存洩漏3、功耗問題: 耗電性能優化原則和方法1、性能優化原則堅持性能測試(開發和測試同學的測試方法略有不同):不要憑感覺去檢測性能問題、評估性能優化的效果,應該保持足夠多的測量,用數據說話(主要針對測試同學)。
  • Android性能優化典範
    摘要:Google在Udacity上的《Android性能優化》在線課程詳細介紹了該如何優化性能,這些課程是Google之前在Youtube上發布的Android性能優化典範專題課程的細化與補充。本文是對渲染、運算、內存、電量四個篇章的學習筆記。
  • android內存優化總結
    ※1、追查內存的方法使用lintlint會提醒你很多使用不得當的地方,主要會集中再這麼幾個地方:(1)handler等長周期匿名內部類的使用,具體原因下文表(2)數據結構的優化,hashmap向稀疏數組的優化(3)未使用的圖片資源當然lint
  • 最全的Android內存優化技巧
    本文主要介紹性能優化的一些手段,但是為了便於理解以及融會貫通,建議先了解Android內存管理機制,本文將從四個角度來介紹內存優化技巧減小對象的內存佔用儘量減少新分配出來的對象佔用內存的大小,使用更加輕量的對象1.
  • android 復用 布局優化專題及常見問題 - CSDN
    在布局優化中,Androi的官方提到了這三種布局<include />、<merge />、<ViewStub />,並介紹了這三種布局各有的優勢,下面也是簡單說一下怎麼使用.
  • Google《Android性能優化》學習筆記
    Google近期在Udacity上發布了Android性能優化的在線課程,分別從渲染,運算與內存,電量幾個方面介紹了如何去優化性能,這些課程是Google之前在Youtube上發布的Android性能優化典範專題課程的細化與補充。
  • Android一些你需要知道的布局優化技巧
    那麼我們優化一下:android:divider="@drawable/divider"android:showDividers="middle"其中divider.xml是分隔線樣式。當然也很簡單,比如添加一個高10dp的View,或者使用android:layout_marginTop="10dp"等方法。但是增加View違背了我們的初衷,並且影響性能。使用過多的margin其實會影響代碼的可讀性。這時你就可以使用Space,他是一個輕量級的。實現代碼與效果:
  • Android開發必備的「80」個開源庫
    你所不知道的Android Studio調試技巧https://www.jianshu.com/p/011eb88f4e0d一份系統、全面的安卓進階學習指南https://github.com/iwannabetop/Awesome-Android-Learning-GuideTrinea - 性能優化系列總篇
  • Google 發布 Android 性能優化典範 - OSCHINA - 中文開源技術交流...
    2015年伊始,Google發布了關於Android性能優化典範的專題,一共16個短視頻,每個3-5分鐘,幫助開發者創建更快更優秀的
  • 三年經驗 Android 開發面經總結
    有沒有實際的ANR定位問題的經歷5.性能優化你做過哪些?泛型的pecs原則7.同步屏障8.性能優化做過什麼工作?9.RecyclerView的緩存結構是怎樣的?緩存的是什麼?cachedView會執行onBindView嗎?
  • ​吹爆系列:深入探索 Android 包體積優化
    在 Android 性能優化的知識體系當中,包體積優化一直被排在優先級比較低的位置,從而導致很多開發同學對自身應用的大小並不重視。但是,這樣 別的平臺使用時性能上就會有所損耗,失去了對特定平臺的優化。此外,在做性能優化過程中,為了提升研發效率,降低研發成本,我漸漸發現 AOP 編譯插樁、Gradle 自動化構建 的知識越來越重要;並且,一旦涉及 Native 層甚至 Android 內核層的深度優化時,就越發感覺到功力不足。因此,為了 補充深度優化所需的養分,從下篇開始,筆者將暫停更新 深入探索 Android 性能優化系列文章。
  • 一次Android面試心得及面試題總結
    總結下經驗,也是對過去的一個回顧和總結吧。一、簡歷網上有很多對程式設計師簡歷的一些指導,這裡就不重述,大家可以搜下網上其他大神的總結,結合自身情況修改下。我有幾點建議:儘量不要花哨,程式設計師和設計師或者產品運營還不一樣,我們的簡歷成功與否決定權還是在技術面試官那,而他們看重的是你的項目經驗內容和技術等描述。
  • QQ音樂Android客戶端Web頁面通用性能優化實踐
    QQ音樂 Android 客戶端的 Web 頁面日均 PV 達到千萬量級,然而頁面的打開耗時與 Native 頁面相距甚遠,需要系統性優化。本文將介紹 QQ 音樂 Android 客戶端在進行 Web 頁面通用性能優化過程中的問題、思路、方案和效果,並嘗試對跨端場景的常見瓶頸和對策進行歸納。文章作者:關嶽,QQ音樂客戶端開發工程師。
  • Android應用耗電量分析與優化建議
    www.jianshu.com/p/ebac88cdf9d6文章源自網絡,如果涉及侵權等問題,請第一時間聯繫我們予以下架Battery Historian工具使用Battery Historian 一款由Google提供的Android系統電量分析工具,從手機中導出bugreport文件上傳至頁面,在網頁中生成詳細的圖表數據來展示手機上各模塊電量消耗過程,最後通過App數據的分析制定出相關的電量優化的方法
  • 開發總結:Android反編譯方法的總結
    總結反編譯主要的目的在於學習。利用反編譯進行相關的漢化或修改,還是儘量不要吧,畢竟人家寫個程序不容易啊!>   <LinearLayout       xmlns:android="http://schemas.android.com/apk/res/android"
  • Android性能優化典範(一)
    11) Performance Cost of Memory Leaks雖然Java有自動回收的機制,可是這不意味著Java中不存在內存洩漏的問題,而內存洩漏會很容易導致嚴重的性能問題。內存洩漏指的是那些程序不再使用的對象無法被GC識別,這樣就導致這個對象一直留在內存當中,佔用了寶貴的內存空間。
  • Android 性能優化之內存洩漏,使用MAT&LeakCanary解決問題
    本文較長,閱讀大約5分鐘App進行到最終的測試的時候,往往會出現一些性能上,以及內存上的問題,需要優化,這也是一個Android高級工程師所需要了解並且掌握的知識點