0755-26913476
您的當前位置:主頁 > 經驗交流 > 技術文檔 >

如何從app優化的角度解釋淘寶支付寶的安卓版卡頓?

時間:2017-07-10

先普及一點Android知識,Android系統每隔16ms(60fps)對屏幕進行一次選人,如果app的繪制、計算等操作耗時超過16ms,則此次渲染無法進行,要等到下一個16ms才會進行渲染,即此時Android出現了丟幀,也就是題目提到的不流暢的最終原因。
對于APP來說,造成丟幀的原因很多,可能是布局過于復雜,過度繪制,內存抖動,性能瓶頸等等,下面我就卡頓嚴重的淘寶和常年絲滑的知乎做一個對比。
 
  1. 布局復雜
通過uiautomatorviever工具進行界面復雜度的分析,上圖是淘寶主界面的頁面布局以及控件,下圖是知乎:


基本上可以很容易的通過肉眼分辨出淘寶的布局深度,復雜度和空間數量均要大幅度超過知乎,也就是說同意不手機渲染淘寶界面的難度要遠大于知乎界面,這就更容易產生丟幀的情況,我認為這也是淘寶APP容易卡頓的最主要原因。
 
  1. 內存抖動
我們直達多圖會造成頻繁的GC,在Android中的GC操作必須暫停所有其余操作,過多的GC會產生內存抖動,對系統性能造成非常大的影響。下面兩張圖分別是淘寶APP與知乎APP的運行過程中內存的使用情況,可以看到淘寶app因為大量的圖片造成內存變化是非常頻繁的,這大量消耗了系統資源,也是卡頓的原因之一


 
  1. 過渡繪制
過渡繪制是指在一幀內同一點被重復繪制多次,這造成了系統不必要的損耗,極大浪費了系統資源,下面兩張圖分別是淘寶和知乎app的重復繪制率,其實兩者差別不大(3.60x vs 3.99x),雖然都存在過渡繪制的情況,但其不是造成卡頓的主要原因。




 
如果下方的柱狀圖高度超過了綠色的橫線則會產生丟幀,可以看到淘寶的丟幀率確實(15.62%)遠大于知乎(4.69%)
我的主要工作并不在優化方面,以上只是個人的一點拋磚引玉。如果對丟幀情況進行優化,目前看最有效的方式就是降低布局層級,減少復雜程度,也就是在界面上少放點東西,我相信淘寶的團隊在優化上必然是做了非常多的工作,但目前來看,對于這類體量龐大的app,優化工作都是任重而道遠的事情。