Android布局耗時(shí)監(jiān)測(cè)的三種實(shí)現(xiàn)方式
在Android應(yīng)用開發(fā)中,性能優(yōu)化是一個(gè)至關(guān)重要的方面。其中,布局渲染的性能直接影響用戶體驗(yàn),特別是在一些復(fù)雜頁(yè)面中,布局渲染的耗時(shí)可能會(huì)導(dǎo)致界面卡頓,影響用戶體驗(yàn)。因此,為了更好地監(jiān)測(cè)布局渲染的耗時(shí),我們需要一種可靠的實(shí)現(xiàn)方案。本文將介紹三種針對(duì)Android布局耗時(shí)監(jiān)測(cè)的實(shí)現(xiàn)方案,幫助開發(fā)者及時(shí)發(fā)現(xiàn)并解決布局性能問(wèn)題。
介紹
布局渲染的耗時(shí)是指從布局文件加載到界面顯示完成所花費(fèi)的時(shí)間。通常,我們使用開發(fā)者選項(xiàng)中的布局邊界線來(lái)查看布局渲染的性能情況,但是這種方法并不能準(zhǔn)確地反映布局渲染的耗時(shí)。因此,我們需要一種更精確的監(jiān)測(cè)方案來(lái)定位布局性能問(wèn)題。
原理
布局耗時(shí)監(jiān)測(cè)的原理就是在布局過(guò)程中的關(guān)鍵節(jié)點(diǎn)插入計(jì)時(shí)代碼,記錄每個(gè)階段的耗時(shí),從而分析出布局耗時(shí)的瓶頸所在。
手動(dòng)埋點(diǎn)
最簡(jiǎn)單的布局耗時(shí)監(jiān)測(cè)方案就是在布局過(guò)程中的關(guān)鍵節(jié)點(diǎn)手動(dòng)插入計(jì)時(shí)代碼,例如:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
long startTime = System.currentTimeMillis();
// 解析 XML 布局文件
setContentView(R.layout.activity_main);
long endTime = System.currentTimeMillis();
long cost = endTime - startTime;
Log.d("TAG", "布局耗時(shí):" + cost + "ms");
}
這種方案的缺點(diǎn)是需要手動(dòng)插入代碼,比較繁瑣,而且不夠靈活。
AOP切面編程
使用AOP切面編程可以更加優(yōu)雅地實(shí)現(xiàn)布局耗時(shí)監(jiān)測(cè)。例如,使用AspectJ框架可以定義一個(gè)切面,在setContentView()方法執(zhí)行前后分別插入計(jì)時(shí)代碼:
@Aspect
public class LayoutTimeAspect {
@Around("call(* android.app.Activity.setContentView(..))")
public void aroundSetContentView(ProceedingJoinPoint joinPoint) throws Throwable {
long startTime = System.currentTimeMillis();
joinPoint.proceed();
long endTime = System.currentTimeMillis();
long cost = endTime - startTime;
Log.d("TAG", "布局耗時(shí):" + cost + "ms");
}
}
這種方案的優(yōu)點(diǎn)是代碼更加簡(jiǎn)潔優(yōu)雅,而且可以擴(kuò)展到其他需要監(jiān)測(cè)耗時(shí)的操作。
類似的還有通過(guò)ASM的方法進(jìn)行插樁,本質(zhì)都是一樣,在特定的方法時(shí)機(jī)中插入對(duì)應(yīng)的監(jiān)測(cè)代碼。
Factory
如果我們要知道特定的某個(gè)view的耗時(shí),這個(gè)時(shí)候就可以使用LayoutInflaterCompat.Factory2
該方法用于設(shè)置一個(gè)LayoutInflater.Factory2對(duì)象,用于替換LayoutInflater在解析XML布局文件時(shí)創(chuàng)建View的行為。通過(guò)自定義 LayoutInflater.Factory2,我們可以攔截和修改布局的加載過(guò)程,包括創(chuàng)建View和設(shè)置屬性等。
簡(jiǎn)單的理解,就是它能攔截view的創(chuàng)建過(guò)程,所以我們可以通過(guò)這個(gè)特性來(lái)監(jiān)聽布局中每一個(gè)view的具體耗時(shí)。
下面是一個(gè)簡(jiǎn)單的示例:
class MyFactory2 : LayoutInflater.Factory2 {
override fun onCreateView(parent: View?, name: String, context: Context, attrs: AttributeSet): View? {
val startTime = System.nanoTime()
val view = LayoutInflater.from(context).createView(name, attrs)
val endTime = System.nanoTime()
val costTime = endTime - startTime
Log.d("TAG", "View $name layout cost time: $costTime")
return view
}
...
}
這種方案的有點(diǎn)是能夠更加具體化,可以幫助監(jiān)測(cè)到具體的view。
開發(fā)工具
除了線上的監(jiān)測(cè)功能,線下的分析也至關(guān)重要。Android提供了一些相關(guān)分析工具,能夠很好的幫助開發(fā)者分析各種性能。
例如,Systrace是Android開發(fā)者工具中的一部分,它可以用來(lái)分析應(yīng)用程序在Android系統(tǒng)上的性能問(wèn)題,包括布局、繪制、CPU、內(nèi)存等方面的性能問(wèn)題。
所以針對(duì)布局耗時(shí),我們也可以使用Systrace來(lái)進(jìn)行線下分析。
TraceCompat.beginSection("start");
TraceCompat.endSection();
這條命令會(huì)在10秒內(nèi)收集與調(diào)度、圖形渲染、視圖布局相關(guān)的性能數(shù)據(jù),并將數(shù)據(jù)保存到名為 my_trace.html 的文件中。
生成完之后,我們只需要打開得到的html,可以直接在瀏覽器中打開。報(bào)告文件中包含了各種性能指標(biāo)的圖表和分析,可以通過(guò)查看相關(guān)的部分來(lái)了解布局的耗時(shí)情況。

除此之外還有,TraceView、LayoutInspector等工具都能有效的輔助分析布局的耗時(shí)。
優(yōu)化技巧
在監(jiān)測(cè)并發(fā)現(xiàn)到布局問(wèn)題的時(shí)候,剩下的就是解決布局耗時(shí)問(wèn)題。下面提供一些優(yōu)化布局耗時(shí)的方案。
- 注意避免在布局渲染過(guò)程中進(jìn)行耗時(shí)操作,以免影響性能。
- 使用合適的布局管理器和布局優(yōu)化技巧,減少布局層次和復(fù)雜度,提高布局渲染效率。
- 對(duì)于一些復(fù)雜布局,可以考慮使用異步加載布局來(lái)減少布局加載時(shí)間。
結(jié)語(yǔ)
通過(guò)以上實(shí)現(xiàn)方案,我們可以準(zhǔn)確監(jiān)測(cè)Android應(yīng)用中布局渲染的耗時(shí),及時(shí)發(fā)現(xiàn)并解決布局性能問(wèn)題,從而提升用戶體驗(yàn)。希望本文能幫助到Android開發(fā)者更好地優(yōu)化應(yīng)用性能。
到此這篇關(guān)于Android布局耗時(shí)監(jiān)測(cè)的三種實(shí)現(xiàn)方式的文章就介紹到這了,更多相關(guān)Android布局耗時(shí)監(jiān)測(cè)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
安卓(Android)開發(fā)之統(tǒng)計(jì)App啟動(dòng)時(shí)間
當(dāng)大家要改善APP啟動(dòng)速度優(yōu)化的時(shí)候,首先要知道App的啟動(dòng)時(shí)間,那么改如何統(tǒng)計(jì)時(shí)間呢,下面我們一起來(lái)看看。2016-08-08
Android開發(fā)中通過(guò)手機(jī)號(hào)+短信驗(yàn)證碼登錄的實(shí)例代碼
最近在開發(fā)一個(gè)android的項(xiàng)目,需要通過(guò)獲取手機(jī)驗(yàn)證碼來(lái)完成登錄功能,接下來(lái)通過(guò)實(shí)例代碼給大家分享手機(jī)號(hào)+短信驗(yàn)證碼登錄的實(shí)現(xiàn)方法,需要的的朋友參考下吧2017-05-05
Flutter實(shí)現(xiàn)軟鍵盤與其它區(qū)域絲滑切換效果
這篇文章主要為大家詳細(xì)介紹了如何使用Flutter實(shí)現(xiàn)軟鍵盤與其它區(qū)域絲滑切換效果,文中的示例代碼講解詳細(xì),需要的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-03-03
Android開發(fā)之如何自定義數(shù)字鍵盤詳解
這篇文章主要給大家介紹了關(guān)于Android開發(fā)之如何自定義數(shù)字鍵盤的相關(guān)資料,本文語(yǔ)言是基于kotlin實(shí)現(xiàn)的,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。2017-09-09
Android基于Toolbar實(shí)現(xiàn)頂部標(biāo)題欄及后退鍵
這篇文章主要介紹了Android基于Toolbar實(shí)現(xiàn)頂部標(biāo)題欄及后退鍵,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09
Android編程實(shí)現(xiàn)ViewPager多頁(yè)面滑動(dòng)切換及動(dòng)畫效果的方法
這篇文章主要介紹了Android編程實(shí)現(xiàn)ViewPager多頁(yè)面滑動(dòng)切換及動(dòng)畫效果的方法,以完整實(shí)例形式分析了ViewPager多頁(yè)面滑動(dòng)切換效果的布局及功能實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-11-11
Android 帶箭頭的指引tipLayout實(shí)現(xiàn)示例代碼
本篇文章主要介紹了Android 帶箭頭的指引tipLayout實(shí)現(xiàn)示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-01-01
Android中多行文本末尾添加圖片排版問(wèn)題的解決方法
這篇文章主要給大家介紹了關(guān)于Android中多行文本末尾添加圖片排版問(wèn)題的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-07-07

