一秸苗、前記
? ? ? ? 隨著技術(shù)的迭代,許多三方SDK一涌而出运褪,統(tǒng)計(jì)惊楼、推送玖瘸、IM、BUG監(jiān)控等檀咙,導(dǎo)致我們現(xiàn)在項(xiàng)目中的Application很臃腫雅倒,在onCreate方法中各種初始化,最后導(dǎo)致App啟動非常緩慢攀芯,初始化一個(gè)推送需要2秒時(shí)間屯断,初始化百度地圖需要3秒時(shí)間,初始化.....各種加在一起就N秒了侣诺,啟動應(yīng)用殖演,等待如此漫長,最后的結(jié)果年鸳,用戶不干了趴久,本篇文章就是講解如何優(yōu)化App啟動。
二搔确、初識App啟動
? ? ? ? 從源碼了解彼棍,我們的手機(jī)屏幕其實(shí)就是一個(gè)大的app,上面每一個(gè)應(yīng)用都是一個(gè)Activity膳算,在我們點(diǎn)擊屏幕App應(yīng)用座硕,系統(tǒng)通知ActivityManagerService來操作一系列事情,這一塊我們是沒法優(yōu)化的涕蜂,我們能優(yōu)化是Application與啟動頁华匾,為什么啟動會慢,我們先來看項(xiàng)目中Application的代碼机隙。
基本上我們都會在Application中做這種類似的操作(以上代碼來自GitHub某個(gè)Demo)蜘拉,我啟動該應(yīng)用,發(fā)現(xiàn)會白屏一段時(shí)間有鹿,啟動耗時(shí):8s旭旭。如果說是因?yàn)轫?xiàng)目大而啟動慢,我們打開QQ或者微信發(fā)現(xiàn)葱跋,他們非吵旨模快,所以這個(gè)說法不成立年局,那么原因出在哪里际看。當(dāng)前在前面就說了,是由于Application初始化太多控件所導(dǎo)致的矢否,那么哪個(gè)控件耗時(shí)較多仲闽,在哪一步導(dǎo)致這個(gè)問題,這個(gè)我們并不知道僵朗,所以我們先用Trace文件來統(tǒng)計(jì)耗時(shí)情況赖欣,代碼很簡單屑彻。兩句代碼。如下圖顶吮,在Application的onCreate中加入代碼社牲。
? ? ? ? 看圖中兩個(gè)箭頭在SDk初始化前開始執(zhí)行,完成后停止統(tǒng)計(jì)悴了。添加以上代碼搏恤,然后運(yùn)行程序,會在手機(jī)sdcard里生成一個(gè)startTIme.trace文件湃交。接下來我們用cmd命令熟空,把他拖到電腦桌面。如下圖
怎么打開他呢搞莺,直接丟到androidStudio里面息罗,如下圖
通過這個(gè)圖我們可以看到,標(biāo)1的是執(zhí)行次數(shù),一些方法指令的次數(shù)才沧,標(biāo)2的為耗時(shí)操作迈喉,在耗時(shí)這邊,推送要3.4秒加載時(shí)間温圆,地圖要2.9秒加載時(shí)間挨摸,bug監(jiān)控1.2秒加載時(shí)間,這一塊占據(jù)了7.6秒岁歉,那如何優(yōu)化油坝,接下來我們開始去優(yōu)化這段代碼。
三刨裆、App啟動優(yōu)化
? ? ? ? ? ?在這邊優(yōu)化的方式有多種,延遲加載彬檀、開啟子線程等帆啃。。這些要根據(jù)原因而定窍帝。因?yàn)槲宜眠@些SDK沒有處理Handler努潘,可以直接放到線程里面去工作。如何優(yōu)化坤学,如下圖:
把耗時(shí)操作丟到線程里頭疯坤,等然后在啟動頁的onCreate里面調(diào)用。
看下優(yōu)化過后的啟動時(shí)間:0.04秒深浮,快的不行压怠。
接下來大功告成了嗎,No飞苇,還沒有菌瘫,因?yàn)橛捎谶^快蜗顽,還是有閃的動作,怎么著雨让,最后參考了QQ的做法雇盖,在Theme樣式中加上這兩個(gè)屬性,一個(gè)是設(shè)置透明栖忠,一個(gè)是不要背景圖〈尥冢現(xiàn)在點(diǎn)擊就沒有閃屏的現(xiàn)象,直接進(jìn)入啟動頁庵寞。
啟動優(yōu)化就到這里狸相。