《業(yè)務(wù)運(yùn)維實(shí)戰(zhàn):騰訊是怎么優(yōu)化APP用戶體驗(yàn)的?》要點(diǎn):
本文介紹了業(yè)務(wù)運(yùn)維實(shí)戰(zhàn):騰訊是怎么優(yōu)化APP用戶體驗(yàn)的?,希望對(duì)您有用。如果有疑問,可以聯(lián)系我們。
作者簡介:
黃偉俊(henry)
騰訊高級(jí)運(yùn)維工程師,多年研發(fā)與運(yùn)維工作經(jīng)驗(yàn).專注(移動(dòng)端+服務(wù)端)性能管理,大數(shù)據(jù)分析領(lǐng)域的探索與實(shí)踐.
當(dāng)前,用戶體驗(yàn)已成為一種新的產(chǎn)品價(jià)值.當(dāng)技術(shù)實(shí)現(xiàn)不再是產(chǎn)品核心競爭力時(shí),產(chǎn)品的競爭就是用戶體驗(yàn)的競爭.而用戶彈指間感知到的性能體驗(yàn)對(duì)于用戶體驗(yàn)尤為重要.
移動(dòng)互聯(lián)網(wǎng)產(chǎn)品因?yàn)橛脩舻氖謾C(jī)型號(hào)繁多、手機(jī)操作系統(tǒng)版本不一致、app版本難統(tǒng)一等問題,很難在開發(fā)或測(cè)試環(huán)節(jié)就完全解決掉移動(dòng)app的性能問題,這使得移動(dòng)app產(chǎn)品在運(yùn)維過程中,不得不面對(duì)用戶體驗(yàn)不優(yōu)、性能不佳的問題.
如何讓開發(fā)可以高效定位性能問題?
讓開發(fā),測(cè)試,運(yùn)維清晰的把控各個(gè)產(chǎn)品的性能狀況?
我們結(jié)合了當(dāng)前業(yè)界商用的APM技術(shù),實(shí)現(xiàn)了一套騰訊社交運(yùn)維的myAPM方案.
APM(Application Performance Management)應(yīng)用性能管理,它是一套集終端,網(wǎng)絡(luò),服務(wù)端性能管理于一體的監(jiān)控方案.在這里,就不展開介紹了.
myAPM,專注于移動(dòng)端的性能管理.既能監(jiān)控定位性能問題(卡慢),也能應(yīng)用于日常的app性能運(yùn)營分析,提升產(chǎn)品用戶體驗(yàn).
myAPM采用BCI注入方式,實(shí)現(xiàn)業(yè)務(wù)方法粒度監(jiān)聽.
在注入技術(shù)選型時(shí),myAPM采用了類ASM的注入技術(shù),其注入效率,校錯(cuò)能力,學(xué)習(xí)成本,都比ASM要好一些.
myAPM實(shí)現(xiàn)性能監(jiān)控與功能開發(fā)零耦合.在編譯階段注入監(jiān)控能力,對(duì)開發(fā)零感知.
當(dāng)前,我們利用myAPM的能力,主要從以下四個(gè)方面進(jìn)行探索與實(shí)踐:
一、Apk 包大小分析
二、App卡慢監(jiān)控分析
三、App啟動(dòng)性能分析
四、App 核心鏈路性能分析
一個(gè)app,隨著新功能的持續(xù)增加,其apk的大小也在不斷地膨脹.Apk size的問題,越來越困擾和限制著開發(fā)同學(xué),影響某些功能的上線,同時(shí),也降低了用戶體驗(yàn).
同時(shí),app運(yùn)營時(shí)間越長,功能迭代 / 代碼重構(gòu)次數(shù)越多,“垃圾”代碼(就是沒有被實(shí)際調(diào)用過的代碼)的數(shù)量就會(huì)越多.
由于代碼量大,代碼調(diào)用層次深,每個(gè)開發(fā)同學(xué)只負(fù)責(zé)部分功能開發(fā).如果讓開發(fā)同學(xué)人工去做全局“垃圾代碼”的分析,顯然,其難度很大,效率不高.
而myAPM的apk包大小分析,就是用來幫助開發(fā)同學(xué),快速暴露這些“垃圾代碼”,開發(fā)同學(xué)只須集中精力,針對(duì)梳理出來的問題代碼,做進(jìn)一步確認(rèn)和清理即可.
可能有同學(xué),會(huì)羅列出一系列開源的工具,也可以很方便地甄別出app這種無調(diào)用代碼.但對(duì)于有調(diào)用關(guān)系的一條鏈路(一組方法),僅僅通過線下分析,無法判斷其是否有被調(diào)用.我們只能利用線上大量用戶的真實(shí)行為分析,更好地去判斷和確認(rèn).
通過一個(gè)唯一ID(14236)來上報(bào),既避免了代碼中敏感信息的泄漏風(fēng)險(xiǎn),同時(shí),也大大節(jié)省上報(bào)量.
Qzone android app,針對(duì)業(yè)務(wù)代碼以及第三方包代碼,采用類無調(diào)用分析.(類中所有變量或方法,沒有被引用或調(diào)用.)
內(nèi)部測(cè)試階段:
在內(nèi)部測(cè)試中,由于機(jī)型,測(cè)試用例有限,分析結(jié)果是42%的類沒有調(diào)用或引用.
灰度外網(wǎng)階段:
在灰度外網(wǎng)用戶后發(fā)現(xiàn),所有類都被調(diào)用或引用.但40%類被調(diào)用次數(shù)少于10次.由于灰度用戶是50W,即40%的代碼只有萬分之二的用戶有調(diào)用.針對(duì)這些,后續(xù)我們可以分析,調(diào)整這些類的啟動(dòng)加載順序(如:延時(shí)加載).
在app用戶體驗(yàn)上,除了crash故障外,相信app主線程卡慢(負(fù)責(zé)與用戶交互的線程),是用戶最不能忍受的.
我們這里所說的卡慢分析,是指對(duì)app主線程代碼的卡慢監(jiān)控分析.
myAPM卡慢監(jiān)控,實(shí)現(xiàn)對(duì)目標(biāo)代碼的“方法粒度”的注入、卡慢監(jiān)聽.
其本質(zhì),是在目標(biāo)方法調(diào)用的前后,注入時(shí)間,進(jìn)行卡慢監(jiān)聽及分析.原理圖,如下:
注入時(shí),我們會(huì)根據(jù)當(dāng)前注入方法的“主調(diào)方法-被調(diào)方法”方法對(duì),生成ID.同樣,也是用于信息加密及節(jié)省上報(bào)量.
說明:
myAPM上報(bào)的卡慢鏈路,還原了業(yè)務(wù)方法運(yùn)行調(diào)用的過程.是一種輕量級(jí)的堆棧/快照.其好處是避免打印堆棧的性能消耗.因?yàn)?在卡慢監(jiān)控中,最消耗性能的就是打印堆棧.
在主線程卡慢監(jiān)控中,比較常見的案例是:主線程加載文件,底層DB讀寫,圖片處理這些比較耗時(shí)的操作.我們優(yōu)化的方案,通常是將這些耗時(shí)操作移到異步線程中進(jìn)行處理.
以下是四個(gè)案例片斷:
實(shí)例一:
主線程進(jìn)行DB查詢導(dǎo)致卡慢.
平均耗時(shí)視圖:
myAPM后臺(tái),會(huì)先統(tǒng)計(jì)卡慢鏈路的次數(shù),計(jì)算鏈路中每個(gè)節(jié)點(diǎn)的平均耗時(shí).
卡慢鏈路最后的兩組數(shù)值含義:(代碼調(diào)用行號(hào)), [方法平均耗時(shí)].耗時(shí)單位為ms.
明細(xì)視圖:
在明細(xì)視圖中,我們會(huì)列出所有卡慢實(shí)例,以及用戶基礎(chǔ)環(huán)境信息.
卡慢鏈路最后的兩組數(shù)值含義:(代碼調(diào)用行號(hào)), [方法耗時(shí)].耗時(shí)單位為ms.
實(shí)例二:
主線程中加載dex文件引起的卡慢實(shí)例.
實(shí)例三:
在主線程中,加載本地xml文件導(dǎo)致卡慢.
實(shí)例四:
在主線程中,圖片處理耗時(shí)比較大.
Process()方法消耗了1.3秒,setFacadeImage(),也另外消耗了1秒.
myAPM,也存在不足.由于采用注入方式,會(huì)使apk的包,稍微變大.
以qzone android apk注入進(jìn)行全量業(yè)務(wù)代碼時(shí),其apk大小增長0.5M,增長率為2.79%.
方案:
app卡慢只是用于問題方法的性能優(yōu)化.其實(shí),對(duì)于一個(gè)產(chǎn)品,我們不但要關(guān)注及處理卡慢的問題,還需要關(guān)注app應(yīng)用常規(guī)的性能狀況與監(jiān)控.
因?yàn)?這個(gè)性能波動(dòng),不會(huì)像卡慢那么明顯.但是在一次次新版本迭代中,可以會(huì)讓總體性能變慢.
app每個(gè)版本的啟動(dòng)性能及變化;
接入的各個(gè)產(chǎn)品在啟動(dòng)性能上的差異,讓各個(gè)產(chǎn)品間可以相互借鑒與提升.
無論是產(chǎn)品,開發(fā),測(cè)試與運(yùn)維,都會(huì)想知道:
一個(gè)APP中,哪些代碼是屬于核心鏈路?
這些核心鏈路的性能怎樣?
每個(gè)新版本中,這些核心鏈路的性能是否受到明顯的損耗?
我們可以繼續(xù)將卡慢上報(bào)范圍擴(kuò)大,上報(bào)全量方法.通過數(shù)據(jù)分析及篩選,我們可以挖掘出核心鏈路及其性能數(shù)據(jù);
通過鏈路特性分析,我們也可以抽取出調(diào)用次數(shù)很少,非主場景調(diào)用的代碼.對(duì)于這些代碼,在app啟動(dòng)加載時(shí),我們可以使用延時(shí)加載.從而提升APP的啟動(dòng)效率.
對(duì)于App 啟動(dòng)性能分析以及App 核心鏈路性能分析,我們將在后續(xù)做單獨(dú)的介紹.
myAPM,是我們結(jié)合部門實(shí)際需求和APM理念,在移動(dòng)端性能管理的一個(gè)新探索,新實(shí)踐.不僅面向性能問題的定位,也應(yīng)用于日常的app性能運(yùn)營分析.
簡單分享myAPM在移動(dòng)性能管理方面的一點(diǎn)思考及應(yīng)用,希望大家打造好自己移動(dòng)端的性能小船,關(guān)鍵時(shí)刻,不會(huì)說翻就翻.共勉!
文:黃偉俊(henry)
原文出處:高效運(yùn)維(greatops)
轉(zhuǎn)載請(qǐng)注明本頁網(wǎng)址:
http://www.fzlkiss.com/jiaocheng/4472.html