Android性能優(yōu)化第(八)篇---App啟動速度優(yōu)化之耗時檢測處理

應(yīng)用的啟動速度緩慢這是很多開發(fā)者都遇到的一個問題耀态,比如啟動緩慢導(dǎo)致的黑屏轮傍,白屏問題,大部分的答案都是做一個透明的主題茫陆,或者是做一個Splash界面金麸,但是這并沒有從根本上解決這個問題擎析。那么如何從根本上解決這個問題或者做到一定程度的緩解簿盅?

一挥下、應(yīng)用的啟動方式

1、冷啟動:當(dāng)啟動應(yīng)用時桨醋,后臺沒有該應(yīng)用的進(jìn)程棚瘟,這時系統(tǒng)會首先會創(chuàng)建一個新的進(jìn)程分配給該應(yīng)用,這種啟動方式就是冷啟動喜最。

2偎蘸、熱啟動:當(dāng)啟動應(yīng)用時,后臺已有該應(yīng)用的進(jìn)程瞬内,比如按下home鍵迷雪,這種在已有進(jìn)程的情況下,這種啟動會從已有的進(jìn)程中來啟動應(yīng)用虫蝶,這種啟動方式叫熱啟動章咧。

3、溫啟動 :當(dāng)啟動應(yīng)用時能真,后臺已有該應(yīng)用的進(jìn)程赁严,但是啟動的入口Activity被干掉了,比如按了back鍵粉铐,應(yīng)用雖然退出了疼约,但是該應(yīng)用的進(jìn)程是依然會保留在后臺,這種啟動方式叫溫啟動蝙泼。

二程剥、應(yīng)用的啟動時間統(tǒng)計

adb shell am start -W [PackageName]/[PackageName.MainActivity]

執(zhí)行成功后將返回三個測量到的時間:

這里面涉及到三個時間,ThisTime踱承、TotalTime 和 WaitTime倡缠。WaitTime 是 startActivityAndWait 這個方法的調(diào)用耗時,ThisTime 是指調(diào)用過程中最后一個 Activity 啟動時間到這個 Activity 的 startActivityAndWait 調(diào)用結(jié)束茎活。TotalTime 是指調(diào)用過程中第一個 Activity 的啟動時間到最后一個 Activity 的 startActivityAndWait 結(jié)束昙沦。如果過程中只有一個 Activity ,則 TotalTime 等于 ThisTime载荔。

總結(jié):如果只關(guān)心某個應(yīng)用自身啟動耗時盾饮,參考TotalTime;如果關(guān)心系統(tǒng)啟動應(yīng)用耗時懒熙,參考WaitTime丘损;如果關(guān)心應(yīng)用有界面Activity啟動耗時,參考ThisTime工扎。

三徘钥、性能檢查項

從我們Application開始到首頁顯示出來,這個過程肢娘,我們應(yīng)該注意一些什么呈础,將這個過程細(xì)分一下舆驶,會有下面的時間點需要注意。

Application的構(gòu)造器方法——>attachBaseContext()——>onCreate()——>Activity的構(gòu)造方法——>onCreate()——>配置主題中背景等屬性——>onStart()——>onResume()——>測量而钞、布局沙廉、繪制顯示在界面上。

因為上面這些階段全部都是在主線程中執(zhí)行的臼节,任何不經(jīng)意的操作都可能拖慢應(yīng)用的啟動速度撬陵。所以我們不應(yīng)在Application以及Activity的生命周期回調(diào)中做任何費時操作,具體指標(biāo)大概是你在onCreate网缝,onResume巨税,onStart等回調(diào)中所花費的總時間最好不要超過400ms,否則用戶在桌面點擊你的應(yīng)用圖標(biāo)后粉臊,將感覺到明顯的卡頓垢夹。但是有些不得以的任務(wù)又必須在UI顯示之前執(zhí)行。所以我們要將任務(wù)劃分優(yōu)先級维费。

  • ** 優(yōu)先級為1的在應(yīng)用啟動時果元,就開始加載**
  • 優(yōu)先級為2的在首頁渲染完成后,開始加載
  • 優(yōu)先級為3的在首頁渲染完成后犀盟,延遲加載

對于首頁渲染完成后而晒,開始加載,或者延遲加載阅畴,延遲加載的目的就是界面先顯示出來倡怎,然后加載,但是你覺得要延遲多久呢贱枣?在 Android 的高端機型上,應(yīng)用的啟動是非臣嗍穑快的 , 這時候只需要 Delay 很短的時間就可以了, 但是在低端機型上,應(yīng)用的啟動就沒有那么快了,而且現(xiàn)在應(yīng)用為了兼容舊的機型,往往需要 Delay 較長的時間,這樣帶來體驗上的差異是很明顯的。延遲加載有一種方式纽哥。

  第一種寫法:直接PostDelay 300ms.
  myHandler.postDelayed(mLoadingRunnable, DEALY_TIME);
  第二種寫法:優(yōu)化的DelayLoad
  getWindow().getDecorView().post(new Runnable() {
    @Override
   public void run() {
        myHandler.post(mLoadingRunnable);
   }
  });

極力推薦用第二種钠乏,在窗口完成以后進(jìn)行加載,這里面的run方法是在onResume之后運行的春塌。關(guān)于這種懶加載機制晓避,參考Android應(yīng)用啟動優(yōu)化:一種DelayLoad的實現(xiàn)和原理(上篇),給出了詳細(xì)的解釋只壳。

四俏拱、利用TraceView逐個修復(fù)

通過上面我們知道一種懶加載機制,所以我們可以將Application中和首頁的onCreate中的有些耗時任務(wù)吼句,放到首頁渲染完畢后加載锅必。如何找出這些耗時任務(wù),TraceView就派上用場了惕艳,TraceView的用法搞隐,移步我的前面的博客Android性能優(yōu)化第(六)篇---TraceView 分析圖怎么看分蓖?


比如在首頁的onCreate中我們進(jìn)行了用戶啟動上報,這個進(jìn)行懶加載是不是分分鐘減少139毫秒呢尔许?


在比如在Application里面用到了GSON,將String轉(zhuǎn)化成json,我將這個移動到懶加載里面终娃,是不是又減少了100毫秒呢味廊?

在比如,有些Application中做了支付SDK的初始化棠耕,用戶又不會一打開App就要支付余佛,放在Application中加載干嘛?

此處我們這里舉得例子是優(yōu)化了139毫秒和100毫秒的窍荧,其實真正耗時的任務(wù)有的有1秒多辉巡,都被我優(yōu)化完了,所以trace圖中看不到了蕊退,就舉個了這兩個例子郊楣,還有SharedPreferences也是耗時大戶,經(jīng)過檢測保存一個boolean變量耗時120+毫秒以上瓤荔。

利用TraceView可以清楚我們每一個方法的耗時時間净蚤,極大的幫助了我們做優(yōu)化工作阳惹。

五砚著、優(yōu)化思路總結(jié)
1旬蟋、UI渲染優(yōu)化奉瘤,去除重復(fù)繪制窃判,減少UI重復(fù)繪制時間嗤详,打開設(shè)置中的GPU過度繪制開關(guān)礁遣,各界面過度繪制不應(yīng)超過2.5x矾削;也就是打開此調(diào)試開關(guān)后郎逃,界面整體呈現(xiàn)淺色哥童,特別復(fù)雜的界面,紅色區(qū)域也不應(yīng)該超過全屏幕的四分之一褒翰;
2如蚜、根據(jù)優(yōu)先級的劃分,KoMobileApplication的一些初始化工作能否將任務(wù)優(yōu)先級劃分成3,在首頁渲染完成后進(jìn)行加載影暴,比如:PaySDKManager错邦。
3、主線程中的所有SharedPreference能否在非UI線程中進(jìn)行型宙,SharedPreferences的apply函數(shù)需要注意撬呢,因為Commit函數(shù)會阻塞IO,這個函數(shù)雖然執(zhí)行很快妆兑,但是系統(tǒng)會有另外一個線程來負(fù)責(zé)寫操作魂拦,當(dāng)apply頻率高的時候毛仪,該線程就會比較占用CPU資源。類似的還有統(tǒng)計埋點等芯勘,在主線程埋點但異步線程提交箱靴,頻率高的情況也會出現(xiàn)這樣的問題。
4荷愕、檢查BaseActivity,不恰當(dāng)?shù)牟僮鲿绊懰凶覣ctivity的啟動衡怀。
5、對于首次啟動的黑屏問題安疗,對于“黑屏”是否可以設(shè)計一個.9圖片替換掉抛杨,間接減少用戶等待時間。
6荐类、對于網(wǎng)絡(luò)錯誤界面怖现,友好提示界面,使用ViewStub的方式玉罐,減少UI一次性繪制的壓力屈嗤。
7、任務(wù)優(yōu)先級為2吊输,3的恢共,通過下面這種方式進(jìn)行懶加載的方式

  getWindow().getDecorView().post(new Runnable() {
   @Override
   public void run() {
       myHandler.post(mLoadingRunnable);
    }
  });

8、Multidex的使用璧亚,也是拖慢啟動速度的元兇讨韭,必須要做優(yōu)化。后面有空專門寫一篇Multidex癣蟋。

相關(guān)鏈接:

Android應(yīng)用啟動優(yōu)化:一種DelayLoad的實現(xiàn)和原理(上篇)http://androidperformance.com/2015/11/18/Android-app-lunch-optimize-delay-load.html

Android性能優(yōu)化之加快應(yīng)用啟動速度http://www.open-open.com/lib/view/open1452821612355.html

手機淘寶性能優(yōu)化全記錄http://www.open-open.com/lib/view/open1452488209370.html

Android客戶端性能優(yōu)化(魅族資深工程師毫無保留奉獻(xiàn))http://blog.tingyun.com/web/article/detail/155#rd

Please accept mybest wishes for your happiness and success !

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末透硝,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子疯搅,更是在濱河造成了極大的恐慌濒生,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件幔欧,死亡現(xiàn)場離奇詭異罪治,居然都是意外死亡,警方通過查閱死者的電腦和手機礁蔗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進(jìn)店門觉义,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人浴井,你說我怎么就攤上這事晒骇。” “怎么了?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵洪囤,是天一觀的道長徒坡。 經(jīng)常有香客問我,道長瘤缩,這世上最難降的妖魔是什么喇完? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮剥啤,結(jié)果婚禮上锦溪,老公的妹妹穿的比我還像新娘。我一直安慰自己铐殃,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布跨新。 她就那樣靜靜地躺著富腊,像睡著了一般。 火紅的嫁衣襯著肌膚如雪域帐。 梳的紋絲不亂的頭發(fā)上赘被,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天,我揣著相機與錄音肖揣,去河邊找鬼民假。 笑死,一個胖子當(dāng)著我的面吹牛龙优,可吹牛的內(nèi)容都是我干的羊异。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼彤断,長吁一口氣:“原來是場噩夢啊……” “哼野舶!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起宰衙,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤平道,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后供炼,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體一屋,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年袋哼,在試婚紗的時候發(fā)現(xiàn)自己被綠了冀墨。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡涛贯,死狀恐怖轧苫,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤含懊,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布身冬,位于F島的核電站,受9級特大地震影響岔乔,放射性物質(zhì)發(fā)生泄漏酥筝。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一雏门、第九天 我趴在偏房一處隱蔽的房頂上張望嘿歌。 院中可真熱鬧,春花似錦茁影、人聲如沸宙帝。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽步脓。三九已至,卻和暖如春浩螺,著一層夾襖步出監(jiān)牢的瞬間靴患,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工要出, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留鸳君,地道東北人。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓患蹂,卻偏偏與公主長得像或颊,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子传于,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,901評論 2 345

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,521評論 25 707
  • 1饭宾、前言 隨著項目版本的迭代,App的性能問題會逐漸暴露出來格了,而好的用戶體驗與性能表現(xiàn)緊密相關(guān)看铆,性能問題從應(yīng)用的啟...
    蕭竹閱讀 14,870評論 1 24
  • 請保持淡定,分析代碼盛末,記椎搿:性能很重要。 啟動時間優(yōu)化 毫無疑問悄但,應(yīng)用的啟動速度越快越好棠隐。 本文可以幫助你優(yōu)化應(yīng)用...
    Mupceet閱讀 11,373評論 5 19
  • 新月媽媽的人設(shè)開始崩了,不知道楚老師為什么書寫那么多筆墨檐嚣。新月病情惡化嚴(yán)重好像快要不行了助泽,除了新月啰扛,新月爸爸和...
    Chv閱讀 214評論 0 0
  • 第十八章和十九章讀書筆記 “語言不是溝通的唯一方式,但經(jīng)常是最無效的一種”文章中提到的例子經(jīng)常在生活中遇見嗡贺,從來沒...
    芳芳的讀書時光閱讀 114評論 0 0