天天看點

Android應用性能優化實踐

<b></b>

何傑:UC優視Android技術負責人,專注Android平台應用開發方向;主導過UC浏覽器的性能、記憶體、穩定性、網絡優化,增量更新技術攻關,插件平台搭建;目前負責Android UC浏覽器的架構優化。

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

<b>背景</b><b> -- Android</b><b>應用卡頓産生原因</b>

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

運作環境惡劣—背景程序可能幾十甚至上百個同時跑、安全軟體給性能帶來一些挑戰;

低端機占比高—低記憶體、弱GPU、IO瓶頸;

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

技術考慮不足。

<b>問題—使用者回報應用卡頓,怎麼辦?</b>

 複現難—使用者描述模糊、不穩定出現,複現問題難。

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

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

<b>思路</b>

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

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

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

<b>方案</b>

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

打點統計:

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

–  多視窗的滑屏幀率。

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

–  使用者回報分析

–  Anr日志分析

–  Strict

Anr

–  Looper

Hook

全局監控 -- 使用者回報

使用者回報分析,使用者回報是一個非常好的管道。

–  預警機制

–  使用者分類

–  功能分類

–  縱向對比

 圖1

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

全局監控—anr日志分析

Anr資訊很全,有所有線程的調用站,我們肯定能夠知道目前主線程式卡在哪裡,會有精确的定位,資料量化,把實驗室的研究方式拿到線上來。

 圖2 anr日志分析

<b> </b>方案說明

–  vs Anr (主線程逾時,5s -&gt; 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每天的日活數,得到每天有多少使用者是在卡頓這樣一個卡頓率的名額,進行優化。

<b>技術成果</b><b> -- </b><b>問題回顧</b>

200+項技術優化

舉例說明

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

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

–  檔案管理轉屏卡頓(緩存複用,緩存View,轉屏隻重布局)

–  啟動完成後操作卡(線程搶占,低優先級背景線程+隊列)

–  視訊播放控制卡頓(API相容,異步化)

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

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

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

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

–  SharedPreference(主線程IO,commit -&gt; apply)

–  安全軟體事件攔截(溝通回報。。。)

–  ...

經驗推廣

    禁止:

–  主線程檔案IO(标記檔案讀除外)

–  主線程耗CPU操作

–  主線程同步IPC調用

推薦:

–  異步化:産品及程式設計,預加載 + 閑時加載 + 按需加載

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

–  壓力測試

–  防禦式程式設計

–  主路徑自動化資料監控

–  全局性能監控

延伸:

精确化 &amp; 自動化:使用者回報,卡頓日志

新監控方案:Api Hook

新優化方向:卡頓率 -&gt; 幀率,低端機優化

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

繼續閱讀