如何使你的 App 運(yùn)行更流暢

原文地址

前一篇文章中,我們討論了監(jiān)控app性能的重要性×陆現(xiàn)在挫剑,我們要告訴你具體如何去做到這一點(diǎn)。我們已經(jīng)和世界上幾個(gè)最受歡迎的app開發(fā)團(tuán)隊(duì)討論過了構(gòu)建流暢App的最佳實(shí)踐孙咪,團(tuán)隊(duì)包括WeChat、Yahoo News Digest應(yīng)用巡语。根據(jù)我們的經(jīng)驗(yàn)和與那些頂尖的開發(fā)者討論翎蹈,我們總結(jié)發(fā)現(xiàn)開發(fā)一個(gè)成功的App中最重要的實(shí)踐是建立一個(gè)性能優(yōu)化流程


一直監(jiān)控app性能對(duì)當(dāng)你的app性能不佳時(shí)去監(jiān)測(cè)問題非常。一旦發(fā)現(xiàn)某個(gè)性能問題男公,一定要集中所有力量解決根本問題荤堪。檢測(cè)問題可能需要更多的措施和詳細(xì)的數(shù)據(jù)。偵測(cè)到問題的原因枢赔,僅僅對(duì)它進(jìn)行修復(fù)是不夠的澄阳,你還必須得重新評(píng)估你的app性能,驗(yàn)證你的修改已經(jīng)生效了糠爬。這就是更多的措施寇荧。
措施
有兩個(gè)性能指標(biāo)與用戶體驗(yàn)(UX)密切相關(guān)。首先执隧,我們來討論響應(yīng)時(shí)間:你的app響應(yīng)用戶操作需要多長(zhǎng)時(shí)間(比如啟動(dòng)app揩抡、打開新的文章、加載聯(lián)系人列表等)镀琉。理想情況下峦嗤,你的app響應(yīng)這些操作應(yīng)該非常快屋摔,這有助于提供更具吸引力的用戶體驗(yàn)烁设。
響應(yīng)時(shí)間的一個(gè)關(guān)鍵之一是啟動(dòng)時(shí)間。App的啟動(dòng)是給用戶第一體驗(yàn)感钓试,第一印象非常重要装黑。事實(shí)上,一份研究數(shù)據(jù)表明79%的用戶在刪除app之前會(huì)再次重試有問題的app一次或兩次弓熏。
這里有些來自NimbleDroid的建議恋谭,他擁有多年的軟件性能優(yōu)化經(jīng)驗(yàn)。
建議1:限制app的啟動(dòng)時(shí)間小于2秒
我們建議app的啟動(dòng)時(shí)間不超過2秒挽鞠,這是用戶期望的中等時(shí)間長(zhǎng)度疚颊。與Web性能類似狈孔,47%的用戶期望加載一個(gè)頁面的時(shí)間不超過2秒,并且移動(dòng)用戶的耐心更小材义,他們希望能快速順暢地使用均抽。
建議2:消除鴻方法
第二個(gè)重要指標(biāo)是平滑性。雖然具有很短的響應(yīng)時(shí)間非常棒其掂,但是響應(yīng)操作本身應(yīng)該足夠平滑油挥,將“停滯”最小化。用戶很善于發(fā)現(xiàn)停滯現(xiàn)象清寇,這意味著即使是很小的結(jié)巴也很能反應(yīng)出你的app的用戶體驗(yàn)感喘漏。
為了理解平滑性,你可以收集你的app每秒鐘的幀(FPS)和幀定時(shí)數(shù)據(jù)华烟。然而,需要注意的是這個(gè)數(shù)據(jù)并不能夠告訴你的app性能問題的原因持灰,也就是說它不能明確是哪個(gè)方法使得你的app出現(xiàn)停滯盔夜。
在Android中,UI線程(即主線程)是唯一可以更新UI的線程堤魁。為了維持60FPS的刷新頻率喂链,UI線程必須在大約16ms內(nèi)繪制完每個(gè)幀。如果在UI線程中妥泉,任何方法的調(diào)用時(shí)間超過這個(gè)時(shí)間椭微,那么app就必須失去一個(gè)幀,從而產(chǎn)生了一個(gè)異常的停滯盲链。更糟糕的是在這個(gè)時(shí)間期間蝇率,app不會(huì)相應(yīng)用戶操作,因?yàn)閁I線程卡住在一個(gè)方法調(diào)用中刽沾。
在實(shí)際開發(fā)中本慕,不能確定每個(gè)方法在UI線程中被調(diào)用的延時(shí)小于16ms。32ms可能會(huì)更加現(xiàn)實(shí)點(diǎn)侧漓,調(diào)用方法時(shí)間超過這個(gè)時(shí)間的方法稱為鴻方法锅尘,因?yàn)樗鼈円餫pp出現(xiàn)“卡頓”。去掉所有鴻方法非常有利于提高app的平滑性布蔗,從而為用戶提供更好的用戶體驗(yàn)藤违。
建議3:盡可能早的檢測(cè)
Okay!監(jiān)測(cè)與UX相關(guān)的指標(biāo)很重要纵揍,但是顿乒,監(jiān)測(cè)這些標(biāo)準(zhǔn)的頻率是多久才合適呢?每次build的時(shí)候骡男?每天build時(shí)淆游?每次發(fā)布前傍睹?發(fā)布后?你應(yīng)該衡量下什么時(shí)候來執(zhí)行檢測(cè)好些犹菱,越早跟蹤檢測(cè)軟件的標(biāo)準(zhǔn)拾稳,就會(huì)越早發(fā)現(xiàn)和處理性能問題。Yahoo團(tuán)隊(duì)安排每次發(fā)布版本之前腊脱,WeChat團(tuán)隊(duì)把它安排在app每天build的時(shí)候访得。
分析
建議4:了解常見性能問題
優(yōu)化軟件的關(guān)鍵是了解常見的性能問題并把它們從你的代碼消滅掉。在我們分析的下載量到達(dá)500萬的apps當(dāng)中陕凹,發(fā)現(xiàn)開發(fā)者往往是構(gòu)建的應(yīng)用在桌面運(yùn)行非澈芬郑快,但是在移動(dòng)端運(yùn)行就會(huì)明顯變慢杜耙。比如搜骡,ClassLoader.getResourceAsStream()方法加載一個(gè)3K的jar資源在MacBook Air上需要大約7ms,而這個(gè)操作在Nexus 7 2013上要耗時(shí)大約1700ms佑女。 這說明在Android中g(shù)etResourceAsStream的實(shí)現(xiàn)在它的第一次調(diào)用時(shí)執(zhí)行了大量額外的工作记靡,如索引APK文件中的所有資源、驗(yàn)證APK文件的權(quán)限团驱、解析它的manifest摸吠。像這樣的操作非常消耗CPU,從而使得app運(yùn)行明顯變慢嚎花,etResourceAsStream使得Walgreens app運(yùn)行變慢1.7秒寸痢。NimbleDroid 編譯了一系列方法來避免在你的Android app中使用它,可以從這里獲取紊选。
建議5:第三方SDK并不總會(huì)給你驚喜
有時(shí)候性能問題是由你使用的第三方SDK引起的啼止,并不是你自己的代碼問題。這樣的問題特別難偵測(cè)到丛楚。像非常流行的一Java時(shí)間庫(kù)org.joda.time族壳,可能你在以前的Java項(xiàng)目中使用過它,結(jié)果是它在你的app啟動(dòng)時(shí)僅僅創(chuàng)建一個(gè)org.joda.time.DateTime()對(duì)象就使得你的應(yīng)用明顯變慢趣些。這是因?yàn)閛rg.joda.time.DateTime() 使用了getResourceAsStream()去避免從APK文件中加載時(shí)間區(qū)仿荆。
優(yōu)化
修復(fù)運(yùn)行緩慢的代碼可以是一個(gè)噩夢(mèng)般的過程。有數(shù)百種可能使得app陷于卡頓坏平,發(fā)現(xiàn)app運(yùn)行緩慢的原因可能要耗時(shí)數(shù)個(gè)星期拢操。然而,有些常見修復(fù)準(zhǔn)則舶替。你要么使用更高效的數(shù)據(jù)集令境、算法、接口實(shí)現(xiàn)顾瞪,或調(diào)用的后臺(tái)線程不會(huì)使UI卡住舔庶。遵循上面的準(zhǔn)則抛蚁,你可使得你的app更高效,做出的產(chǎn)品會(huì)令人更喜歡惕橙。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末瞧甩,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子弥鹦,更是在濱河造成了極大的恐慌肚逸,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,718評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件彬坏,死亡現(xiàn)場(chǎng)離奇詭異朦促,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)栓始,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門务冕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人混滔,你說我怎么就攤上這事洒疚。” “怎么了坯屿?”我有些...
    開封第一講書人閱讀 158,207評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)巍扛。 經(jīng)常有香客問我领跛,道長(zhǎng),這世上最難降的妖魔是什么撤奸? 我笑而不...
    開封第一講書人閱讀 56,755評(píng)論 1 284
  • 正文 為了忘掉前任吠昭,我火速辦了婚禮,結(jié)果婚禮上胧瓜,老公的妹妹穿的比我還像新娘矢棚。我一直安慰自己,他們只是感情好府喳,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評(píng)論 6 386
  • 文/花漫 我一把揭開白布蒲肋。 她就那樣靜靜地躺著,像睡著了一般钝满。 火紅的嫁衣襯著肌膚如雪兜粘。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,050評(píng)論 1 291
  • 那天弯蚜,我揣著相機(jī)與錄音孔轴,去河邊找鬼。 笑死碎捺,一個(gè)胖子當(dāng)著我的面吹牛路鹰,可吹牛的內(nèi)容都是我干的贷洲。 我是一名探鬼主播,決...
    沈念sama閱讀 39,136評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼晋柱,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼优构!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起趣斤,我...
    開封第一講書人閱讀 37,882評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤俩块,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后浓领,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體玉凯,經(jīng)...
    沈念sama閱讀 44,330評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評(píng)論 2 327
  • 正文 我和宋清朗相戀三年联贩,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了漫仆。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,789評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡泪幌,死狀恐怖盲厌,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情祸泪,我是刑警寧澤吗浩,帶...
    沈念sama閱讀 34,477評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站没隘,受9級(jí)特大地震影響懂扼,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜右蒲,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評(píng)論 3 317
  • 文/蒙蒙 一阀湿、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧瑰妄,春花似錦陷嘴、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至眶诈,卻和暖如春涨醋,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背逝撬。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評(píng)論 1 267
  • 我被黑心中介騙來泰國(guó)打工浴骂, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人宪潮。 一個(gè)月前我還...
    沈念sama閱讀 46,598評(píng)論 2 362
  • 正文 我出身青樓溯警,卻偏偏與公主長(zhǎng)得像趣苏,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子梯轻,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容