聯繫人列表滑動卡頓(性能問題)

我是一名Android開發菜鳥
最近新機型適配的時候,測試發現一個問題,就是電話滑動通話記錄和切換tab的時候頁面會掉幀,導致卡頓,遇事不要慌,先打開谷歌和百度,恩,通過谷歌和百度可知,
導致界面卡頓一般有下面幾種情況導致:
1.內存不足 (通過抓trace,我的內存有好多G,排除內存不足)
2.CPU佔用(通過命令查看CPU資源佔用不高,CPU佔用排除)
3.列表佈局複雜(我的列表item是一個自定義的view,佈局只有一層,排除佈局問題)
4.view的onMeasure,onLayout,onDraw做耗時操作(我的自定義view只有簡單的參數計算,也排除)
5.binder調用(未知)
等等等…







不管他是哪種情況導致的,一個字,遇到界面卡頓問題,先抓個trace文件.
抓trace文件不建議用SDK裏面的systrace.py工具,因爲生成的html文件用谷歌瀏覽器打開可能會報Unable to select a master clock domain because no path can be found from “SYSTRACE” to "LINUX_FTRACE_GLOBAL"異常
所以推薦使用
git clone https://github.com/catapult-project/catapult.git
./catapult/systrace/bin/systrace在這裏插入圖片描述
獲取到trace html文件後,使用谷歌瀏覽器打開,打開後如下圖:在這裏插入圖片描述




新手看到這基本上會一臉懵逼,不要着急,看不懂的話,可以看看大牛的博客,鏈接如下:
https://androidperformance.com/2019/07/23/Android-Systrace-Pre/

查看trace文件有幾個快捷鍵
W:放大
S:縮小
A:左移動
D:右移動
跟打遊戲差不多,就是多用W




文件裏面找到自己項目包名的地方,查看UI Thread,綠色的表示正常的,黃色表示微微卡,紅色表示肥腸卡,我現在遇到的就是微微卡,但是爲了用戶有更好的體驗,和自己的前程,微微卡也是不能接受的,將trace文件放大,點擊黃色的地方在這裏插入圖片描述
一眼看過去,一臉懵逼,不懂,只知道有點卡,不知道爲啥卡,不着急,接着往下看
其中UI Thread負責繪製,RenderThread負責數據加載,看上面圖片,繪製這一幀的數據是準備好了的,所以排除數據加載問題
接着點擊黃色F後,下面會有提示如下:在這裏插入圖片描述


主要看這個sleeping,這個表示該繪製咋們界面的時候,CPU處於sleeping狀態,導致咋們的界面沒有回執
sleeping:8.476ms,到了這就騷味有點眉目了,就是CPU當前沒有在處理咋們的應用,這個時候咋們就要分析爲啥CPU沒有處理咱們的界面繪製.還是來看trace文件在這裏插入圖片描述

從上圖看出,執行doFrame—>traversal方法後,調用binder,我們都知道,在view繪製的時候是不能有binder調用的,頻繁的binder調用就有可能導致界面卡頓,特別是在列表中.這一塊就涉及到binder只是了,我對這塊不熟悉,不做過多的介紹,想深入瞭解的可以做下面的電梯進入學習:

https://www.kancloud.cn/alex_wsc/android-deep3/416256

到了這,我們知道了是因爲binder調用導致的卡頓,但是充trace文件中,看不出到底是哪個地方觸發了binder調用,這時候就有請下一個神器出場,就是Android studio自帶的性能分析神器Profiler,不瞭解這一塊的可以坐下面電梯學習

https://developer.android.com/studio/profile/cpu-profiler?hl=zh-cn

在這裏插入圖片描述

點擊record
在這裏插入圖片描述

然後操作應用卡頓的地方,復現後點擊stop,就會生成trace文件,如下在這裏插入圖片描述

這個文件裏面有應用運行時所有的方法調用棧,可以找到binder具體在哪觸發的
首先,咱們先選中main線程,然後再右邊的搜索binder,我這是知道那個東東導致卡頓,可以直接搜索,不知道的話,還得一個一個方法的看.搜索後把調用棧都點開,發現是popupWindows這個東西觸發的,具體調用如下圖:

在這裏插入圖片描述

就是在列表onScollChange的時候觸發的,到了這,就可以去看自己代碼是怎麼實現popupWindows的,我這邊popupWindows的顯示比較簡單,就是在onCreate方法裏面創建和顯示.日了狗了,到了這一步又不知道怎麼弄了,按道理來說,popupWindows不都是這樣顯示的嗎?

最後祭出狗血解決方法:既然是popupWindows導致的,那就幹掉他,popupWindows在應用第一次啓動的時候顯示,只要對應用操作了就dismiss,之前的交互是一直顯示的(其實這樣的沒什麼卵用,popupWindows就是一個簡單的tip,用戶看到了就應該dismiss),卡頓問題完美解決
解決完這個問題後,我深有感觸,以後再遇到卡頓問題,
砍需求
砍需求
砍需求


重要的是說三遍


看到大大,如果有哪些錯誤的,可以知道下,我也是剛入門,班門弄斧,見笑見笑

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章