Android應用性能優化實踐

jopen 8年前發布 | 20K 次閱讀 Android開發 移動開發

何杰:UC優視Android技術負責人,專注Android平臺應用開發方向;主導過UC瀏覽器的性能、內存、穩定性、網絡優化,增量升級技術攻關,插件平臺搭建;目前負責Android UC瀏覽器的架構優化。

Android應用的卡頓問題非常突出,所有用戶都能感覺得到卻又很難做量化卡頓的嚴重程度,過去的做法只是零星地發現和解決一些小點。DAU超億級的 UC瀏覽器在卡頓優化的過程中建立了一套衡量卡頓嚴重性的數據指標與監控分析機制,并藉此有針對性地落實了200+個性能優化點。下面會介紹卡頓監控與分析的方法、常見的卡頓案例與原因。以下分享精彩內容。

背景 -- Android應用卡頓產生原因

安卓系統低效—安卓沒有自己獨立的渲染線程、同步接口、廣播機制;

運行環境惡劣—后臺進程可能幾十甚至上百個同時跑、安全軟件給性能帶來一些挑戰;

低端機占比高—低內存、弱GPU、IO瓶頸;

產品考慮不足—功能定義簡陋,不一定會把整個閉環想的很清楚,功能堆積嚴重;

技術考慮不足。

問題—用戶反饋應用卡頓,怎么辦?

 復現難—用戶描述模糊、不穩定出現,復現問題難。

定位難—不同機型、固件、系統狀態表現不一,不確定性非常大,程序細節多、可疑面廣。

衡量難—卡頓嚴重程度難以量化,無法掌握優化度,卡頓問題不便分類。

思路

卡 vs 頓,卡為主,頓為輔。卡和頓沒有一個明顯的界限,大部分頓的問題當環境足夠惡劣時就會表現為卡。所以抓住卡,就能解決很多問題。

打點統計 vs 全局監控:對于上百萬的代碼來說,做全局監控是很難的,所以我們定了一個短期目標:主路徑性能保障,打點統計;一個長期目標:整體的卡頓優化,全局監控。

線下分析 vs 線上監控:線下分析:實驗室調試去復現一個問題,精確定位、粒度細;線上監控:指標衡量、粒度粗。

方案

工具應用:TraceView,StrictMode,Systrace,Overdraw。只能做調試用,無法去做一個更全面的分析和監控。

打點統計:

  耗時(針對我們的主路徑,啟動速度,退出速度,轉頁時間,多窗口的滑屏時間,啟動時間、響應速度)。

  多窗口的滑屏幀率。

全局監控:做卡頓優化新的思路。

  用戶反饋分析

  Anr日志分析

  Strict Anr

  Looper Hook

全局監控 -- 用戶反饋

用戶反饋分析,用戶反饋是一個非常好的渠道。

  預警機制

  用戶分類

  功能分類

  縱向對比

 圖1

針對用戶反饋進行很多方面的篩選,資訊類的,網頁類的,性能相關的等所有信息進行一個整合,會有對應的負責人專門負責,比如像性能方面的用戶反饋如圖1,全部集于一個郵件發過來,我們會去關注,發現規律,通過用戶的分類對手機的各個參數作聚合,也對業務各個模塊反饋卡頓的占比是什么樣的,指標高的對我們就是一個預警。

全局監控—anr日志分析

Anr信息很全,有所有線程的調用站,我們肯定能夠知道當前主線程式卡在哪里,會有精確的定位,數據量化,把實驗室的研究方式拿到線上來。

 圖2 anr日志分析

全局監控 -- Strict Anr

 方案說明

  vs Anr (主線程超時,5s -> 1s)

  暴露更多問題

  精確定位問題

  方便用戶聯調

 圖3 Strict Anr日志分析

所有的調用棧去寫一個腳本,全部用圖形化的方式展現出來,顯示各個幀的占比,再去做一個分析,針對性的解決問題。

全局監控 -- Looper Hook

方案說明

  監控系統消息循環

  計算消息耗時

  定位耗時點(msg.what or msg.callback)

 

圖4Andriod的消息循環

 圖5耗時點分析

從圖5看,發現卡頓點就能知道handler是誰,如果是一個message,可以知道message的ID是多少,這樣我們就能準確的精確度我們自己代碼的一個代碼段。

 

 圖6

從圖6數據上看,紅色和藍色一個是2s的卡頓率,一個是1s的卡頓率,我們在灰度的版本上去搜所有的消息循環里耗時超過2s和1s的數據,把數據整理下,每天的卡頓的用戶數除以UC每天的日活數,得到每天有多少用戶是在卡頓這樣一個卡頓率的指標,進行優化。

 

技術成果 -- 問題回顧

200+項技術優化

舉例說明

  下載界面展開卡頓(分段加載)

  二維碼界面展現慢(延遲加載,先出界面,再初始化相機)

  文件管理轉屏卡頓(緩存復用,緩存View,轉屏只重布局)

  啟動完成后操作卡(線程搶占,低優先級后臺線程+隊列)

  視頻播放控制卡頓(API兼容,異步化)

  獲取網絡代理卡頓(IPC異常,異步DNS+緩存)

  從第三方返回卡死(固件問題,Shield Activity)

  網頁滑屏操作卡頓(GPU加速)

  So加載/Jni注冊卡(異步加載+時序控制)

  SharedPreference(主線程IO,commit -> apply)

  安全軟件事件攔截(溝通反饋。。。)

  ...

 

經驗推廣

    禁止:

  主線程文件IO(標記文件讀除外)

  主線程耗CPU操作

  主線程同步IPC調用

推薦:

  異步化:產品及程序設計,預加載 + 閑時加載 + 按需加載

  線程管理:線程數限制 + 任務隊列,非主線程優先級調低

  壓力測試

  防御式編程

  主路徑自動化數據監控

  全局性能監控

延伸:

精確化 & 自動化:用戶反饋,卡頓日志

新監控方案:Api Hook

新優化方向:卡頓率 -> 幀率,低端機優化

 

                                                                                                                      PPT下載地址:http://club.alibabatech.org/resource_detail.htm?topicId=181

來自: http://yq.aliyun.com/articles/123

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!