Android卡頓優化

卡頓的定義

如果在一個Vsync週期內(60HZ的屏幕上就是16.6ms),按照整個上幀顯示的執行的順序來看,應用UI線程的繪製、RenderThread線程的渲染、SurfaceFlinger/HWC的圖層合成以及最終屏幕上的顯示這些動作沒有全部都執行完成的話,屏幕上就會顯示上一幀畫面的內容,也就是掉幀,而人的肉眼就可能會感覺到畫面卡頓。

卡頓監控

線下監控工具
  • BlockCanary: 動態檢測消息執行耗時。

基於消息機制,向Looper中設置Printer,監控dispatcher到finish之間的操作,滿足耗時閥值dump堆棧、設備信息,以通知形式彈出卡頓信息以供分析。

其中最核心的兩步是在調用msg.target.dispatchMessage(msg),進行消息的分發前記錄時間T1,調用msg.target.dispatchMessage(msg)進行消息分發後記錄時間T2,如果T2-T1大於設置的卡頓閾值就會打印當前方法調用堆棧以及顯示其他相關提示或打印日誌;
blockcanary充分的利用了Loop的機制,在MainLooper的loop方法中執行dispatchMessage前後都會執行printer的println進行輸出,並且提供了方法設置printer。通過分析前後打印的時差與閾值進行比對,從而判定是否卡頓。

創建AppBlockCanaryContext:

class AppBlockCanaryContext : BlockCanaryContext() {
}

在application中初始化blockCanary:

BlockCanary.install(this, AppBlockCanaryContext()).start()

BlockCanary會在發生卡頓(通過MonitorEnv的getConfigBlockThreshold設置)的時候記錄各種信息,輸出到配置目錄下的文件,並彈出消息欄通知(可關閉)。

dump的信息包括:

基本信息:安裝包標示、機型、api等級、uid、CPU內核數、進程名、內存、版本號等
耗時信息:實際耗時、主線程時鐘耗時、卡頓開始時間和結束時間
CPU信息:時間段內CPU是否忙,時間段內的系統CPU/應用CPU佔比,I/O佔CPU使用率
堆棧信息:發生卡慢前的最近堆棧,可以用來定位卡慢發生的地方和重現路徑

  • 滴滴Dokit接入

接入文檔

幀率檢測:幀率信息提供波形圖查看功能,讓幀率監控的趨勢更加明顯。


CPU檢測:CPU 使用率信息提供波形圖查看功能,讓 CPU 監控的趨勢更加形象。


卡頓檢測:我們做App開發時,可能會遇到卡頓的情況,往往會忽略,而且復現時出現卡頓的概率也挺挺小的。而卡頓功能幫助我們把App出現的卡頓記錄下來,鎖定 App 出現卡頓的時刻,打印出對應的代碼調用堆棧。


線上監控工具

基調聽雲APM(應用性能管理)產品能夠提供代碼級性能監控並對故障快速定位,能夠兼容OpenTelemetry框架實現全量採集,支持微服務架構下的應用性能監控和治理。

大致工作流程:
1、首先在客戶端(Android、iOS、Web等)採集數據;
2、接着將採集到的數據整理上報到服務器;
3、服務器接收到數據後建模、存儲、挖掘分析,讓後將數據可視化,供用戶使用。

Android APM 的原理其實非常簡單,用一句話總結就是:

依據打包原理,在 class 轉換爲 dex 的過程中,調用 gradle transform api 遍歷 class 文件,藉助 Javassist、ASM 等框架修改字節碼,插入我們自己的代碼實現性能數據的統計。以上所有過程都是在編譯期完成的。

參考:

https://mp.weixin.qq.com/s/ff1l-80htFoU3xoH8O49zg
https://www.jianshu.com/p/03dd61816051
https://mp.weixin.qq.com/s/v618ky870WWr5RqoE5_U3Q

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