深入解析:Android卡頓檢測及優化項目實戰經驗總結,大廠面試必備

spring全家桶開發 2021-09-18 06:16:09 阅读数:567

深入 解析 android

1. SurfaceFlinger 主線程耗時

SurfaceFlinger 負責 Surface 的合成 , 一旦 SurfaceFlinger 主線程調用超時 , 就會產生掉幀 . SurfaceFlinger 主線程耗時會也會導致 hwc service 和 crtc 不能及時完成, 也會阻塞應用的 binder 調用, 如 dequeueBuffer \ queueBuffer 等.

2. 後臺活動進程太多導致系統繁忙

後臺進程活動太多,會導致系統非常繁忙, cpu \ io \ memory 等資源都會被占用, 這時候很容易出現卡頓問題 , 這也是系統這邊經常會碰到的問題。 dumpsys cpuinfo 可以查看一段時間內 cpu 的使用情况:

深入解析:Android卡頓檢測及優化項目實戰經驗總結,大廠面試必備_Android

3.主線程調度不到 , 處於 Runnable 狀態

當線程為 Runnable 狀態的時候 , 調度器如果遲遲不能對齊進行調度 , 那麼就會產生長時間的 Runnable 線程狀態 , 導致錯過 Vsync 而產生流暢性問題。

4、System 鎖

system_server 的 AMS 鎖和 WMS 鎖 , 在系統异常的情况下 , 會變得非常嚴重 , 如下圖所示 , 許多系統的關鍵任務都被阻塞 , 等待鎖的釋放 , 這時候如果有 App 發來的 Binder 請求帶鎖 , 那麼也會進入等待狀態 , 這時候 App 就會產生性能問題 ; 如果此時做 Window 動畫 , 那麼 system_server 的這些鎖也會導致窗口動畫卡頓

深入解析:Android卡頓檢測及優化項目實戰經驗總結,大廠面試必備_移動開發_02

5、Layer過多導致 SurfaceFlinger Layer Compute 耗時

Android P 修改了 Layer 的計算方法 , 把這部分放到了 SurfaceFlinger 主線程去執行, 如果後臺 Layer 過多, 就會導致 SurfaceFlinger 在執行 rebuildLayerStacks 的時候耗時 , 導致 SurfaceFlinger 主線程執行時間過長。

深入解析:Android卡頓檢測及優化項目實戰經驗總結,大廠面試必備_移動開發_03

從應用層來看以下會導致卡頓:

1、主線程執行時間長 主線程執行 Input \ Animation \ Measure \ Layout \ Draw \ decodeBitmap 等操作超時都會導致卡頓 。

  • 1、Measure \ Layout 耗時\超時

深入解析:Android卡頓檢測及優化項目實戰經驗總結,大廠面試必備_移動開發_04

  • 2、draw耗時

深入解析:Android卡頓檢測及優化項目實戰經驗總結,大廠面試必備_移動開發_05

  • 3、Animation回調耗時

深入解析:Android卡頓檢測及優化項目實戰經驗總結,大廠面試必備_移動開發_06

  • 4、View 初始化耗時

深入解析:Android卡頓檢測及優化項目實戰經驗總結,大廠面試必備_Android_07

  • 5、List Item 初始化耗時

深入解析:Android卡頓檢測及優化項目實戰經驗總結,大廠面試必備_程序員_08

  • 6、主線程操作數據庫

2、主線程 Binder 耗時

Activity resume 的時候, 與 AMS 通信要持有 AMS 鎖, 這時候如果碰到後臺比較繁忙的時候, 等鎖操作就會比較耗時, 導致部分場景因為這個卡頓, 比如多任務手勢操作。

深入解析:Android卡頓檢測及優化項目實戰經驗總結,大廠面試必備_Android_09

3、WebView 性能不足

應用裏面涉及到 WebView 的時候, 如果頁面比較複雜, WebView 的性能就會比較差, 從而造成卡頓

深入解析:Android卡頓檢測及優化項目實戰經驗總結,大廠面試必備_Android_10

4、幀率與刷新率不匹配

如果屏幕幀率和系統的 fps 不相符 , 那麼有可能會導致畫面不是那麼順暢. 比如使用 90 Hz 的屏幕搭配 60 fps 的動畫。

深入解析:Android卡頓檢測及優化項目實戰經驗總結,大廠面試必備_程序員_11

卡頓檢測

卡頓檢測可以使用以下多種方法同時進行:
1、使用dumpsys gfxinfo
2、使用Systrace獲取相關信息
3、使用LayoutInspect 檢測布局層次
4、使用BlockCanary
5、利用Choreographer。
6、使用嚴格模式(StrictMode )。

1、使用dumpsys gfxinfo

在開發過程中發現有卡頓發生時可以使用下面的命令來獲取卡頓相關的信息:

adb shell dumpsys gfxinfo [PACKAGE_NAME]

  • 1.

輸入這個命令後可能會打印下面的信息:

Applications Graphics Acceleration Info:
Uptime: 102809662 Realtime: 196891968
** Graphics info for pid 31148 [com.android.settings] **
Stats since: 524615985046231ns
Total frames rendered: 8325
Janky frames: 729 (8.76%)
90th percentile: 13ms
95th percentile: 20ms
99th percentile: 73ms
Number Missed Vsync: 294
Number High input latency: 47
Number Slow UI thread: 502
Number Slow bitmap uploads: 44
Number Slow issue draw commands: 135

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.

上面參數說明:

Graphics info for pid 31148 [com.android.settings]: 錶明當前dump的為設置界面的幀信息,pid為31148 Total frames rendered: 8325 本次dump搜集了8325幀的信息

Janky frames :729 (8.76%)出現卡頓的幀數有729幀,占8.76%

Number Missed Vsync: 294 垂直同步失敗的幀

Number Slow UI thread: 502 因UI線程上的工作導致超時的幀數

Number Slow bitmap uploads: 44 因bitmap的加載耗時的幀數

Number Slow issue draw commands: 135 因繪制導致耗時的幀數

2、使用systrace

上面使用的dumpsys是能發現問題或者判斷問題的嚴重性,但無法定比特真正的原因。如果要定比特原因,應當配合systrace工具使用。

systrace使用

Systrace可以幫助分析應用是如何設備上運行起來的,它將系統和應用程序線程集中在一個共同的時間軸上,分析systrace的第一步需要在程序運行的時間段中抓取trace log,在抓取到的trace文件中,包含了這段時間中想要的關鍵信息,交互情况。

深入解析:Android卡頓檢測及優化項目實戰經驗總結,大廠面試必備_程序員_12

圖1顯示的是當一個app在滑動時出現了卡頓的現象,默認的界面下,橫軸是時間,縱向為trace event,trace event 先按進程分組,然後再按線程分組.從上到下的信息分別為Kernel,SurfaceFlinger,應用包名。通過配置trace的分類,可以根據配置情况記錄每個應用程序的所有線程信息以及trace event的層次結構信息。

Android studio中使用systrace

1、在android設備的 設置 – 開發者選項 – 監控 – 開啟traces。 2、選擇要追中的類別,並且點擊確定。

完成以上配置後,開始抓trace文件

$ python systrace.py --cpu-freq --cpu-load --time=10 -o mytracefile.html

  • 1.

分析trace文件 抓到trace.html文件後,通過web瀏覽器打開

檢查Frames 每個應用程序都有一排代錶渲染幀的圓圈,通常為綠色,如果繪制的時間超過16.6毫秒則顯示黃色或紅色。通過“W”鍵查看幀。

深入解析:Android卡頓檢測及優化項目實戰經驗總結,大廠面試必備_移動開發_13

trace應用程序代碼 在framework中的trace marker並沒有覆蓋到所有代碼,因此有些時候需要自己去定義trace marker。在Android4.3之後,可以通過Trace類在代碼中添加標記,這樣將能够看到在指定時間內應用的線程在做哪些工作,當然,trace 的begin和end操作也會增加一些額外的開銷,但都只有幾微秒左右。 通過下面的例子來說明Trace類的 用法。

public class MyAdapter extends RecyclerView.Adapter<MyViewHolder> {
...
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
Trace.beginSection("MyAdapter.onCreateViewHolder");
MyViewHolder myViewHolder;
try {
myViewHolder = MyViewHolder.newInstance(parent);
} finally {
Trace.endSection();
}
return myViewHolder;
}
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
Trace.beginSection("MyAdapter.onBindViewHolder");
try {
try {
Trace.beginSection("MyAdapter.queryDatabase");
RowItem rowItem = queryDatabase(position);
#### 題外話
**不管怎麼樣,不論是什麼樣的大小面試,要想不被面試官虐的不要不要的,只有刷爆面試題題做好全面的准備,當然除了這個還需要在平時把自己的基礎打紮實,這樣不論面試官怎麼樣一個知識點裏往死裏鑿,你也能應付如流啊**
**[CodeChina開源項目:《Android學習筆記總結+移動架構視頻+大廠面試真題+項目實戰源碼》](https://ali1024.coding.net/public/P7/Android/git)**
> 這裏我為大家准備了一些我工作以來以及參與過的大大小小的面試收集總結出來的一套**進階學習的視頻及面試專題資料包**,主要還是希望大家在如今大環境不好的情况下面試能够順利一點,希望可以幫助到大家~
![深入解析:Android卡頓檢測及優化項目實戰經驗總結,大廠面試必備_Android_14](https://s7.51cto.com/images/20210918/1631916336678154.jpg)
**歡迎評論區討論。**

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
版权声明:本文为[spring全家桶開發]所创,转载请带上原文链接,感谢。 https://gsmany.com/2021/09/20210918061608563s.html