紫搜做網站怎么樣在百度上免費推廣
作者:麥客奧德彪
當我們開發(fā)Android應用時,布局性能優(yōu)化是一個必不可少的過程。一個高效的布局能夠提高用戶體驗,使應用更加流暢、響應更加迅速,而低效的布局則會導致應用的運行變得緩慢,甚至出現(xiàn)卡頓、崩潰等問題,影響用戶體驗。在開發(fā)中,布局優(yōu)化不僅需要考慮到UI設計的美觀性和易用性,還需要關注布局的性能,避免出現(xiàn)因視圖過多、嵌套過深、圖片過大等問題導致的性能瓶頸。通過對布局進行優(yōu)化,可以顯著提高應用的性能和用戶體驗,減少應用的CPU和內存占用,加快應用的啟動和響應速度,降低應用的耗電量,從而提高應用的穩(wěn)定性和可靠性。
布局性能優(yōu)化對于提高Android應用的質量和競爭力是至關重要的。在實際開發(fā)中,我們需要根據具體的業(yè)務場景和設計要求,結合布局優(yōu)化的最佳實踐,逐步提升應用的布局性能,為用戶帶來更好的體驗。
布局為什么會有性能問題呢
那需要了解一下Android View的渲染機制,Android渲染機制是指Android系統(tǒng)中用于顯示界面的工作流程。它包括視圖樹的構建、測量、布局和繪制四個過程。
他們的大致流程是
- 構建視圖樹(View Hierarchy):在應用啟動時,Android系統(tǒng)會根據布局文件中定義的View、ViewGroup和其他組件創(chuàng)建一個視圖樹。視圖樹是根據xml進行解析的。
- 測量(Measure):在測量過程中,系統(tǒng)會遍歷視圖樹,并計算每個視圖的大小和位置
- 布局(Layout):在布局過程中,系統(tǒng)會根據視圖樹中每個視圖的測量結果,確定每個視圖的大小和位置,并將其放置在正確的位置上
- 繪制(Draw):在繪制過程中,系統(tǒng)會遍歷視圖樹,并將每個視圖繪制到屏幕上
在這幾個過程中,布局過程是比較耗費時間的,并且耗時與視圖樹的復雜程度成正比。
復雜的布局指的是樹關系的復雜,而不是元素的復雜。
不一樣的角度
從系統(tǒng)角度分析,Android系統(tǒng)的UI界面是基于視圖層次結構(View Hierarchy)構建的,每個UI元素都是View或ViewGroup對象的實例,這些對象按照它們在界面中出現(xiàn)的順序排列,構成了一個視圖層次結構。在這個結構中,每個UI元素都有自己的父元素和子元素,因此構成了一個樹形結構。這個樹形結構的根節(jié)點是一個ViewGroup對象,它是整個視圖層次結構的根。
當用戶進行交互操作時,Android系統(tǒng)需要對視圖層次結構進行更新,例如重新布局、重繪等操作,這些操作會消耗大量的CPU和內存資源。因此,視圖層次結構的構建對應用程序的性能和響應速度至關重要。
常見布局解析,用對了,你的性能問題會減少很多
我們從開始學習Android就知道五大布局是Android的布局基礎,大家還記得他們的優(yōu)缺點嗎?之所以有五大布局,就是因為他們使用場景各不相同,然而有時候寫法就是上來就相對,別的不考慮,這正確嗎?
這是一個對比表格,加顏色的,年齡小的程序員可能都不知道。
通過這個對比,你會發(fā)現(xiàn),每一個布局都有它的用途,要是用對了,在性能方面都有提升。也不是說用約束布局一擼到底,在有些專場的場景中,對應的布局更加優(yōu)于約束布局。
回顧完之后,我們看看開發(fā)中還有哪些影響性能的寫法。
常見的開發(fā)中有損布局性能的操作方式
嵌套層數過多
當一個布局容器包含多個子布局容器時,會導致視圖層次結構的深度增加,從而增加了CPU和內存資源的消耗
<LinearLayout><RelativeLayout></RelativeLayout><LinearLayout></LinearLayout>
</LinearLayout>
內存使用過高
當一個布局容器包含大量的子視圖時,會導致內存占用過高,從而影響應用程序的性能
<RelativeLayout><ImageView/><ImageView/><ImageView/></RelativeLayout>
不合適的布局容器
在布局中選擇合適的布局容器可以避免不必要的布局操作和內存消耗(當需要顯示大量的數據列表時,使用ListView或RecyclerView等容器可以避免不必要的視圖更新和內存消耗)
過多的重繪操作
當一個布局容器中包含多個視圖時,每次修改其中一個視圖的屬性,都會導致整個布局容器的重繪操作
可以使用ViewStub元素來延遲加載復雜的視圖。
不合理的布局屬性
在布局中選擇合適的布局屬性可以避免不必要的視圖更新和內存消耗
在使用RelativeLayout布局容器時,它的測量和布局都需要參考父、兄等原則,所以需要考慮到視圖的相對位置和大小,以避免不必要的布局操作和內存消耗。
使用無效的布局容器
在布局中使用無效的布局容器會增加不必要的布局操作和內存消耗,影響應用程序的性能和響應速度
<TableLayout><TableRow><TextView/><TextView/></TableRow><TableRow><TextView/><TextView/></TableRow>
</TableLayout>
這種操作在開發(fā)中還是比較常見的,有時候為了給Text View或者ImageView 添加點擊區(qū)域,外邊搞一個FragmeLayout。這種操作會導致內存消耗過高的。
常見的檢測布局性能工具
- Hierarchy Viewer工具:Hierarchy Viewer工具可以幫助開發(fā)者分析應用程序的視圖層次結構,找出可能存在的性能問題。在Hierarchy Viewer中,可以查看應用程序的視圖層次結構,以及每個視圖的繪制時間、測量時間和布局時間等性能指標。
- TraceView工具:TraceView工具可以幫助開發(fā)者分析應用程序的性能問題,包括布局性能問題。在TraceView中,可以查看應用程序的方法調用鏈和執(zhí)行時間等信息,以及每個方法的CPU使用率、內存消耗等性能指標。
- UI性能分析器:Android Studio中內置了UI性能分析器,可以幫助開發(fā)者分析應用程序的UI性能問題,包括布局性能問題。在UI性能分析器中,可以查看應用程序的渲染時間、FPS、布局時間等性能指標,并根據性能指標分析應用程序的性能問題。
- Monkey測試工具:Monkey測試工具可以幫助開發(fā)者測試應用程序的穩(wěn)定性和性能問題,包括布局性能問題。在Monkey測試中,可以模擬用戶隨機點擊和滑動操作,以測試應用程序的穩(wěn)定性和響應速度,同時可以通過TraceView等工具分析應用程序的性能問題。(提前做好監(jiān)測的買點,trace收集,然后用monkey測試,最后分析trace)
總結
1.減少布局層次
布局層次越深,繪制所需的時間就越長,因此應該盡可能減少布局層次??梢酝ㄟ^使用 ConstraintLayout 或者自定義 View 來減少布局層次。
2.使用合適的布局容器
應該選擇最適合當前布局需求的布局容器,避免使用過于復雜的布局容器,比如 LinearLayout 嵌套多層、RelativeLayout 的多重嵌套等。
3.使用 ViewStub 來延遲加載視圖
如果布局中包含復雜的視圖,可以考慮使用 ViewStub 來延遲加載這些視圖,以減少布局的加載時間。
4.避免使用過多的嵌套布局
嵌套布局會增加布局的復雜度,導致渲染時間變長。因此應該盡量避免過多的嵌套布局。
5.使用合適的布局屬性
合理使用布局屬性可以讓布局更加簡潔、高效,比如使用 match_parent 和 wrap_content 來替代具體的像素值。
6.避免在布局文件中使用過多的 include 標簽
include 標簽可以重復使用布局,但是過多的使用會增加布局層次和渲染時間,因此應該盡量避免在布局文件中使用過多的 include 標簽
主要是要弄明白布局的使用場景,從這幾個坑出發(fā),寫代碼的時候上點心。
為了幫助到大家更好的全面清晰的掌握好性能優(yōu)化,準備了相關的核心筆記(還該底層邏輯):https://qr18.cn/FVlo89
性能優(yōu)化核心筆記:https://qr18.cn/FVlo89
啟動優(yōu)化
內存優(yōu)化
UI優(yōu)化
網絡優(yōu)化
Bitmap優(yōu)化與圖片壓縮優(yōu)化:https://qr18.cn/FVlo89
多線程并發(fā)優(yōu)化與數據傳輸效率優(yōu)化
體積包優(yōu)化
《Android 性能監(jiān)控框架》:https://qr18.cn/FVlo89
《Android Framework學習手冊》:https://qr18.cn/AQpN4J
- 開機Init 進程
- 開機啟動 Zygote 進程
- 開機啟動 SystemServer 進程
- Binder 驅動
- AMS 的啟動過程
- PMS 的啟動過程
- Launcher 的啟動過程
- Android 四大組件
- Android 系統(tǒng)服務 - Input 事件的分發(fā)過程
- Android 底層渲染 - 屏幕刷新機制源碼分析
- Android 源碼分析實戰(zhàn)