我們學(xué)校地址:合肥市火車站浙江商貿(mào)城C座1911和明珠廣場(chǎng)上海城市2培訓(xùn)學(xué)點(diǎn)
手 機(jī):15209870589
Q Q :275913236
座 機(jī):0551-68998880
聯(lián) 系 人:小沈老師
http://
http://
http://./
http:///article/58808488.html
http:///school/vmio.shtml
http:///html/2013/74/201374214737589859.shtml
http:///course/2012/06/20120628093050628689.shtml
手機(jī)淘寶作為一個(gè)航母級(jí)的應(yīng)用,承載了100多個(gè)業(yè)務(wù)方,部分是H5的形式接入,還有超過50個(gè)Native的業(yè)務(wù)方。為了規(guī)避安卓DEX65535的方法數(shù)限制以及各業(yè)務(wù)獨(dú)立開發(fā)等需要,淘寶工程師門也是采用了多DEX(多Bundle)的開發(fā)形式,而且手淘作為一個(gè)以圖片顯示為重點(diǎn)的APP,在性能上不可避免的遇到了比較多的問題。
10月22日在北京新云南hg假日酒店召開的2015中國(guó)系統(tǒng)架構(gòu)師大會(huì)上,手機(jī)淘寶技術(shù)專家王曜東(花名:雪鷺)為我們分享了《手機(jī)淘寶性能優(yōu)化》,引起了2500名與會(huì)者的極大關(guān)注。
手機(jī)淘寶遇到了那些性能問題?淘寶技術(shù)專家使用那些優(yōu)化分析工具找出各種性能瓶頸的?在應(yīng)用界面到中間件的優(yōu)化過程中,淘寶又有那些經(jīng)驗(yàn)與我們分享?你不在現(xiàn)場(chǎng)?沒關(guān)系,王曜東演講的技術(shù)要點(diǎn)就在這里。
手機(jī)淘寶遭遇的5大性能問題
1、APP啟動(dòng)慢
2、界面跳轉(zhuǎn)慢
3、事件相應(yīng)慢
4、滑動(dòng)和動(dòng)畫卡頓
5、展現(xiàn)內(nèi)容慢
手機(jī)淘寶的目前使用的主要優(yōu)化工具
開發(fā)者選項(xiàng)中和Android提供了多個(gè)分析工具。
GPU Profile:查看每一幀的繪制情況。除了查看幀率,我還會(huì)用這個(gè)工具檢查各個(gè)界面在靜默狀態(tài)下的不必要的刷新問題。
Show GPU Overdraw:查看過渡繪制用的工具,因?yàn)槭痔缘暮芏嘟缑嫘Ч脖容^復(fù)雜,很容易出現(xiàn)過渡繪制。
Dump View Hierarchy:用于查看界面的布局、View和層級(jí)嵌套情況。特別是在沒有源代碼的情況下,查看非常方便。
TraceView:強(qiáng)大的性能跟蹤工具,也是我們?cè)趦?yōu)化中用的最多的工具。
SysTrace:主要用于查看UI的繪制問題,跟蹤CPU執(zhí)行情況等。
Trace OpenGL:可以錄制每一幀的繪制過程,逐個(gè)繪制命令查看。
AlloCation Tracker:內(nèi)存分配跟蹤,也是個(gè)調(diào)試性能的強(qiáng)大工具。
Threads 工具可以顯示所有線程信息及查看線程正在執(zhí)行的代碼。
Heap和Memory Monitor:查看內(nèi)存的分配和變化情況。Memory Monitor還可以查看內(nèi)存的抖動(dòng)和GC情況。
而TraceView作為最主要的工具,王曜東特別強(qiáng)調(diào)了手淘在優(yōu)化過程中的一些經(jīng)驗(yàn)。比如找出高頻率調(diào)用函數(shù)有時(shí)候會(huì)比較特殊,要結(jié)合實(shí)際代碼,比如寫SharedPreferences的apply函數(shù)需要注意,因?yàn)镃ommit函數(shù)會(huì)阻塞IO,這個(gè)函數(shù)雖然執(zhí)行很快,但是系統(tǒng)會(huì)有另外一個(gè)線程來負(fù)責(zé)寫操作,當(dāng)apply頻率高的時(shí)候,該線程就會(huì)比較占用CPU資源。類似的還有統(tǒng)計(jì)埋點(diǎn)等,在主線程埋點(diǎn)但異步線程提交,頻率高的情況也會(huì)出現(xiàn)這樣的問題。
其次查看布局性能,一種是直接查看,如onMeasure,OnLayout函數(shù)占用的百分比和平均執(zhí)行時(shí)間過高導(dǎo)致的性能問題,很直觀就可以看出來。還有就是例如getview中的布局性能,整體的查看inflate的個(gè)數(shù)和耗時(shí)問題的跟蹤。還有一種是通過View的draw函數(shù)或者buildeDisplayList函數(shù)的調(diào)用和遞歸調(diào)用次數(shù)來判斷布局的復(fù)雜度。
關(guān)于復(fù)用問題,比如在listview滑動(dòng)過一遍后,在對(duì)這部分區(qū)域做跟蹤,如果getview中還有infalte布局,那就是復(fù)用還有可以優(yōu)化的地方。
類的初始化耗時(shí),像構(gòu)造函數(shù),靜態(tài)初始化等這些問題很容易忽視,但是在性能優(yōu)化的后期,這些小的細(xì)節(jié)點(diǎn),也是優(yōu)化的方向,特別是在主線程中調(diào)用的時(shí)候。
手淘啟動(dòng)過程優(yōu)化詳解
啟動(dòng)過程優(yōu)化是所有大型APP都會(huì)遇到的問題,啟動(dòng)慢,加載多。手淘也不例外,手淘的模塊非常多,各業(yè)務(wù)方都希望在啟動(dòng)的時(shí)候都能把自己先初始化起來,加上手淘也是分了很多了dex文件的,這樣在首次啟動(dòng)的時(shí)候不僅要dexpot這些模塊的dex,還有主dex中的不少模塊有初始化動(dòng)作。
1、分析各個(gè)模塊的線程數(shù)量,檢查線程池的合理性。通過去掉不必要的線程和線程池,再控制線程池的并發(fā)數(shù)。減少啟動(dòng)階段的線程以及控制線程的啟動(dòng)時(shí)機(jī)。
2、通過MAT等工具,找出那些分配過多的對(duì)象和數(shù)量特別多的對(duì)象,我們前面看到很多的容器,其實(shí)大部分都用不到,不需要在啟動(dòng)時(shí)就創(chuàng)建。淘寶工程師也發(fā)現(xiàn)首頁(yè)緩存的布局太多,浪費(fèi)較多的資源,所以需要減少緩存的數(shù)量。通過Systrace,可以發(fā)現(xiàn)在網(wǎng)絡(luò)線程,統(tǒng)計(jì),主線程等GC很多,所以對(duì)頻繁創(chuàng)建的對(duì)象如網(wǎng)絡(luò)庫(kù)的Byte數(shù)組,Buffer等做復(fù)用。
3、當(dāng)有較多的主線程耗時(shí),需要將主線程中的耗時(shí)操作都異步處理或者移除。
4、IO:通過TraceView可以發(fā)現(xiàn)SharedPreference有2個(gè)線程經(jīng)常占用很多的CPU時(shí)間,還有幾個(gè)下載文件的線程如update等以及數(shù)據(jù)庫(kù)操作這些都是IO操作。優(yōu)化過程就是刪除不必要的io操作,有些做延后處理。例如統(tǒng)計(jì)數(shù)據(jù),淘寶減少了采樣的頻率,并且增加緩存數(shù)量,以空間換時(shí)間,減少數(shù)據(jù)庫(kù)和SharedPreference的讀寫。在做較多數(shù)據(jù)庫(kù)操作的時(shí)候也會(huì)開啟事務(wù)功能來減少IO的次數(shù)。
5、以前在啟動(dòng)階段會(huì)安裝主要模塊的bundle,首頁(yè)再啟動(dòng)后過3秒也會(huì)發(fā)送通知來喚起更多的模塊,像淘寶的webview框架,在初始化的時(shí)候會(huì)把線上活動(dòng)資源都緩存到本地,這個(gè)過程設(shè)計(jì)到j(luò)son的解析,下載和解壓縮等,非常耗資源等等,這些模塊疊加在一起就導(dǎo)致了首頁(yè)就會(huì)直接卡主及白屏很長(zhǎng)一段時(shí)間,所以對(duì)這一種模塊改為懶加載,并且要限制拉取活動(dòng)的數(shù)量。還有像購(gòu)物車,微淘,店鋪,旺信等以前是首次啟動(dòng)會(huì)安裝,也是改為懶加載。因?yàn)槭状蜠exopt會(huì)比較費(fèi)時(shí),特別是安卓5.0以后,所以很多模塊都改為懶加載,這樣首次使用該模塊的時(shí)候變慢一點(diǎn),但是整體啟動(dòng)速度一下就提升了。
6、降級(jí)搖一搖功能的檢測(cè)頻率,減少地理信息的數(shù)量
7、首頁(yè)在歡迎頁(yè)的時(shí)候開始初始化布局等,加快展示。退出的時(shí)候以前都是銷毀Activity的,為了加快下次啟動(dòng),釋放到圖片等主要資源,Activity不做銷毀。
手機(jī)淘寶各界面的優(yōu)化
GPU過渡繪制的優(yōu)化
不需要顯示的布局及時(shí)隱藏
去掉層疊布局中多余的背景設(shè)置
圖片控件有前景內(nèi)容的時(shí)候不顯示背景
界面背景定義到Activity的主題中
減少Drawable的復(fù)雜Shape使用
自定義控件onDraw函數(shù)減少繪制層次
自定義控件使用canvas.clipRect
優(yōu)化布局性能
優(yōu)化層級(jí)
靈活使用布局
減少View數(shù)量
異步infalte或者提前infalte
自己做控件的回收復(fù)用
加快界面顯示
主線程不做耗時(shí)操作
減少主線程GC停頓
利用本地緩存
減少數(shù)據(jù)傳輸和解析時(shí)間
注意線程優(yōu)先級(jí)
利用局部刷新
總結(jié):
1、發(fā)現(xiàn)性能問題的時(shí)候首先要分析原因,是卡住還是卡頓,是網(wǎng)絡(luò)慢的問題,還是是內(nèi)存問題亦或是其他系統(tǒng)的問題。手淘遇到有時(shí)候手機(jī)廠商的一些特殊控件的bug也會(huì)導(dǎo)致問題。安卓系統(tǒng)本身的內(nèi)存管理和一些監(jiān)控軟件有時(shí)候也會(huì)導(dǎo)致性能問題。
2、通過多種工具額配合找出問題。
3、有些問題,一個(gè)地方存在很可能其他地方也有,可以到類似的模塊去查看,如圓形的圖案,輸入控件在輸入法退出時(shí)引發(fā)的自動(dòng)刷新問題。
4、建立程序內(nèi)的監(jiān)控,以及代碼層面的掃描等,手淘自己的代碼平臺(tái)有一些性能的掃描,但還不夠完善,手淘APP內(nèi)部也有性能監(jiān)控的模塊可以實(shí)時(shí)監(jiān)控和統(tǒng)計(jì)程序中的性能問題。
5、冰凍三尺非一日之寒。代碼掃描和監(jiān)控等本身都有一定的局限性,而且監(jiān)控本身就會(huì)導(dǎo)致一定的性能損耗。所以一個(gè)性能好的APP應(yīng)該防患于未然,從源頭抓起,只有開發(fā)人員都對(duì)Java和Android相關(guān)的性能相當(dāng)熟悉,在開發(fā)的時(shí)候處處考慮到性能和內(nèi)存問題,追求{zy1},才能防微杜漸,這也是手機(jī)淘寶接下來努力的方向之一。
優(yōu)化是沒有止境的,雖然通過這幾個(gè)月的優(yōu)化,手淘在內(nèi)存使用上下降了接近50%,平均幀率提高了近20%,首頁(yè)的GC減少了90%。但是在低內(nèi)存,低性能的手機(jī)上,手淘還是面臨很多的挑戰(zhàn),需要不斷的去優(yōu)化,也需要從源頭上就把性能這塊提升。