手機淘寶性能優化全記錄

jopen 8年前發布 | 29K 次閱讀 性能優化 安卓開發 前端技術

該文章來自阿里巴巴技術協會( ATA )精選集 

手機淘寶作為一個航母級的應用,承載了100多個業務方,部分是H5的形式接入,還有超過50個Native的業務方。為了規避安卓DEX65535的方法數限制以及各業務獨立開發等需要,淘寶工程師門也是采用了多DEX(多Bundle)的開發形式,而且手淘作為一個以圖片顯示為重點的APP,在性能上不可避免的遇到了比較多的問題。

10月22日在北京新云南皇冠假日酒店召開的2015中國系統架構師大會上,手機淘寶技術專家王曜東(花名:雪鷺)為我們分享了《手機淘寶性能優化》,引起了2500名與會者的

極大關注。

手機淘寶遇到了那些性能問題?淘寶技術專家使用那些優化分析工具找出各種性能瓶頸的?在應用界面到中間件的優化過程中,淘寶又有那些經驗與我們分享?你不在現場?沒關系,王曜東演講的技術要點就在這里。

手機淘寶遭遇的5大性能問題

1、APP啟動慢

2、界面跳轉慢

3、事件相應慢

4、滑動和動畫卡頓

5、展現內容慢

手機淘寶的目前使用的主要優化工具

開發者選項中和Android提供了多個分析工具。

  • GPU Profile:查看每一幀的繪制情況。除了查看幀率,我還會用這個工具檢查各個界面在靜默狀態下的不必要的刷新問題。

  • Show GPU Overdraw:查看過渡繪制用的工具,因為手淘的很多界面效果也比較復雜,很容易出現過渡繪制。

  • Dump View Hierarchy:用于查看界面的布局、View和層級嵌套情況。特別是在沒有源代碼的情況下,查看非常方便。

  • TraceView:強大的性能跟蹤工具,也是我們在優化中用的最多的工具。

  • SysTrace:主要用于查看UI的繪制問題,跟蹤CPU執行情況等。

  • Trace OpenGL:可以錄制每一幀的繪制過程,逐個繪制命令查看。

  • AlloCation Tracker:內存分配跟蹤,也是個調試性能的強大工具。

  • Threads 工具可以顯示所有線程信息及查看線程正在執行的代碼。

  • Heap和Memory Monitor:查看內存的分配和變化情況。Memory Monitor還可以查看內存的抖動和GC情況。

TraceView作為最主要的工具,王曜東特別強調了手淘在優化過程中的一些經驗。比如找出高頻率調用函數有時候會比較特殊,要結合實際代碼,比如寫SharedPreferences的apply函數需要注意,因為Commit函數會阻塞IO,這個函數雖然執行很快,但是系統會有另外一個線程來負責寫操作,當apply頻率高的時候,該線程就會比較占用CPU資源。類似的還有統計埋點等,在主線程埋點但異步線程提交,頻率高的情況也會出現這樣的問題。

其次查看布局性能,一種是直接查看,如onMeasure,OnLayout函數占用的百分比和平均執行時間過高導致的性能問題,很直觀就可以看出來。還有就是例如getview中的布局性能,整體的查看inflate的個數和耗時問題的跟蹤。還有一種是通過View的draw函數或者buildeDisplayList函數的調用和遞歸調用次數來判斷布局的復雜度。

關于復用問題,比如在listview滑動過一遍后,在對這部分區域做跟蹤,如果getview中還有infalte布局,那就是復用還有可以優化的地方。

類的初始化耗時,像構造函數,靜態初始化等這些問題很容易忽視,但是在性能優化的后期,這些小的細節點,也是優化的方向,特別是在主線程中調用的時候。

手淘啟動過程優化詳解

啟動過程優化是所有大型APP都會遇到的問題,啟動慢,加載多。手淘也不例外,手淘的模塊非常多,各業務方都希望在啟動的時候都能把自己先初始化起來,加上手淘也是分了很多了dex文件的,這樣在首次啟動的時候不僅要dexpot這些模塊的dex,還有主dex中的不少模塊有初始化動作。

▲手機淘寶啟動過程優化

▲啟動變慢案例分析

1、分析各個模塊的線程數量,檢查線程池的合理性。通過去掉不必要的線程和線程池,再控制線程池的并發數。減少啟動階段的線程以及控制線程的啟動時機。

2、通過MAT等工具,找出那些分配過多的對象和數量特別多的對象,我們前面看到很多的容器,其實大部分都用不到,不需要在啟動時就創建。淘寶工程師也發現首頁緩存的布局太多,浪費較多的資源,所以需要減少緩存的數量。通過Systrace,可以發現在網絡線程,統計,主線程等GC很多,所以對頻繁創建的對象如網絡庫的Byte數組,Buffer等做復用。

3、當有較多的主線程耗時,需要將主線程中的耗時操作都異步處理或者移除。

4、IO:通過TraceView可以發現SharedPreference有2個線程經常占用很多的CPU時間,還有幾個下載文件的線程如update等以及數據庫操作這些都是IO操作。優化過程就是刪除不必要的io操作,有些做延后處理。例如統計數據,淘寶減少了采樣的頻率,并且增加緩存數量,以空間換時間,減少數據庫和SharedPreference的讀寫。在做較多數據庫操作的時候也會開啟事務功能來減少IO的次數。

5、以前在啟動階段會安裝主要模塊的bundle,首頁再啟動后過3秒也會發送通知來喚起更多的模塊,像淘寶的webview框架,在初始化的時候會把線上活動資源都緩存到本地,這個過程設計到json的解析,下載和解壓縮等,非常耗資源等等,這些模塊疊加在一起就導致了首頁就會直接卡主及白屏很長一段時間,所以對這一種模塊改為懶加載,并且要限制拉取活動的數量。還有像購物車,微淘,店鋪,旺信等以前是首次啟動會安裝,也是改為懶加載。因為首次Dexopt會比較費時,特別是安卓5.0以后,所以很多模塊都改為懶加載,這樣首次使用該模塊的時候變慢一點,但是整體啟動速度一下就提升了。

6、降級搖一搖功能的檢測頻率,減少地理信息的數量

7、首頁在歡迎頁的時候開始初始化布局等,加快展示。退出的時候以前都是銷毀Activity的,為了加快下次啟動,釋放到圖片等主要資源,Activity不做銷毀。

手機淘寶各界面的優化

GPU過渡繪制的優化

不需要顯示的布局及時隱藏

去掉層疊布局中多余的背景設置

圖片控件有前景內容的時候不顯示背景

界面背景定義到Activity的主題中

減少Drawable的復雜Shape使用

自定義控件onDraw函數減少繪制層次

自定義控件使用canvas.clipRect

優化布局性能

優化層級

靈活使用布局

減少View數量

異步infalte或者提前infalte

自己做控件的回收復用

加快界面顯示

主線程不做耗時操作

減少主線程GC停頓

利用本地緩存

減少數據傳輸和解析時間

注意線程優先級

利用局部刷新

總結:

1、發現性能問題的時候首先要分析原因,是卡住還是卡頓,是網絡慢的問題,還是是內存問題亦或是其他系統的問題。手淘遇到有時候手機廠商的一些特殊控件的bug也會導致問題。安卓系統本身的內存管理和一些監控軟件有時候也會導致性能問題。

2、通過多種工具額配合找出問題。

3、有些問題,一個地方存在很可能其他地方也有,可以到類似的模塊去查看,如圓形的圖案,輸入控件在輸入法退出時引發的自動刷新問題。

4、建立程序內的監控,以及代碼層面的掃描等,手淘自己的代碼平臺有一些性能的掃描,但還不夠完善,手淘APP內部也有性能監控的模塊可以實時監控和統計程序中的性能問題。

5、冰凍三尺非一日之寒。代碼掃描和監控等本身都有一定的局限性,而且監控本身就會導致一定的性能損耗。所以一個性能好的APP應該防患于未然,從源頭抓起,只有開發人員都對Java和android相關的性能相當熟悉,在開發的時候處處考慮到性能和內存問題,追求卓越,才能防微杜漸,這也是手機淘寶接下來努力的方向之一。

優化是沒有止境的,雖然通過這幾個月的優化,手淘在內存使用上下降了接近50%,平均幀率提高了近20%,首頁的GC減少了90%。但是在低內存,低性能的手機上,手淘還是面臨很多的挑戰,需要不斷的去優化,也需要從源頭上就把性能這塊提升。

MTT是手機淘寶技術團隊 (Mobile Taobao Tech team)的英文縮寫,歡迎關注手機淘寶技術團隊,一起交流分享無線技術,共創移動開發無限未來!掃描微信二維碼關注我們!我們將分享更多的獨家技術細節!

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

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