App啟動(dòng)優(yōu)化

對(duì)于Android平臺(tái)上的線程優(yōu)先級(jí)設(shè)置來(lái)說(shuō)可以處理很多并發(fā)線程的阻塞問(wèn)題纪铺,比如很多無(wú)關(guān)緊要的線程會(huì)占用大量的CPU時(shí)間,雖然通過(guò)了MultiThread來(lái)解決慢速I(mǎi)/O但是合理分配優(yōu)先級(jí)對(duì)于并發(fā)編程來(lái)說(shuō)十分重要膳凝。Android在線程方面主要使用的是Java本身的Thread類(lèi),我們可以在Thread或Runnable接口中的run方法首句加入Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND); //設(shè)置線程優(yōu)先級(jí)為后臺(tái),這樣當(dāng)多個(gè)線程并發(fā)后很多無(wú)關(guān)緊要的線程分配的CPU時(shí)間將會(huì)減少壶愤,有利于主線程的處理

現(xiàn)場(chǎng)優(yōu)先級(jí):

int THREAD_PRIORITY_AUDIO //標(biāo)準(zhǔn)音樂(lè)播放使用的線程優(yōu)先級(jí)

int THREAD_PRIORITY_BACKGROUND //標(biāo)準(zhǔn)后臺(tái)程序

int THREAD_PRIORITY_DEFAULT // 默認(rèn)應(yīng)用的優(yōu)先級(jí)

int THREAD_PRIORITY_DISPLAY //標(biāo)準(zhǔn)顯示系統(tǒng)優(yōu)先級(jí),主要是改善UI的刷新

int THREAD_PRIORITY_FOREGROUND //標(biāo)準(zhǔn)前臺(tái)線程優(yōu)先級(jí)

int THREAD_PRIORITY_LESS_FAVORABLE //低于favorable

int THREAD_PRIORITY_LOWEST //有效的線程最低的優(yōu)先級(jí)

int THREAD_PRIORITY_MORE_FAVORABLE //高于favorable

int THREAD_PRIORITY_URGENT_AUDIO //標(biāo)準(zhǔn)較重要音頻播放優(yōu)先級(jí)

int THREAD_PRIORITY_URGENT_DISPLAY //標(biāo)準(zhǔn)較重要顯示優(yōu)先級(jí)馏鹤,對(duì)于輸入事件同樣適用征椒。

一、工具:adb 或Python

adb計(jì)算app啟動(dòng)時(shí)間

adb shell am start -w packagename/activity

三個(gè)返回結(jié)果ThisTime湃累,TotalTime勃救,WaitTime

WaitTime就是app啟動(dòng)時(shí)間:WaitTime=startTime-endTime

startTime:記錄的剛準(zhǔn)備調(diào)用startActivityAndWait()的時(shí)間點(diǎn)

endTime:記錄的是startActivityAndWait()函數(shù)調(diào)用返回的時(shí)間點(diǎn)

ThisTime、TotalTime 的計(jì)算在 frameworks\base\services\core\java\com\android\server\am\ActivityRecord.java 文件的 reportLaunchTimeLocked() 函數(shù)中治力。

curTime表示該函數(shù)調(diào)用的時(shí)間點(diǎn).

displayStartTime表示一連串啟動(dòng)Activity中的最后一個(gè)Activity的啟動(dòng)時(shí)間點(diǎn).

mLaunchStartTime表示一連串啟動(dòng)Activity中第一個(gè)Activity的啟動(dòng)時(shí)間點(diǎn).

displayStartTime和mLaunchStartTime的區(qū)別:分兩種情況

正常情況下點(diǎn)擊桌面圖標(biāo)只啟動(dòng)一個(gè)有界面的 Activity蒙秒,此時(shí) displayStartTime 與mLaunchStartTime 便指向同一時(shí)間點(diǎn),此時(shí) ThisTime=TotalTime宵统。另一種情況是點(diǎn)擊桌面圖標(biāo)應(yīng)用會(huì)先啟動(dòng)一個(gè)無(wú)界面的 Activity 做邏輯處理(如占位界面)晕讲,接著又啟動(dòng)一個(gè)有界面的Activity,在這種啟動(dòng)一連串 Activity 的情況下(知乎的啟動(dòng)就是屬于這種情況)马澈,displayStartTime 便指向最后一個(gè) Activity 的開(kāi)始啟動(dòng)時(shí)間點(diǎn)瓢省,mLaunchStartTime 指向第一個(gè)無(wú)界面Activity的開(kāi)始啟動(dòng)時(shí)間點(diǎn),此時(shí) ThisTime痊班!=TotalTime勤婚。這兩種情況如下圖:

如果只關(guān)心某個(gè)應(yīng)用自身啟動(dòng)耗時(shí),參考TotalTime涤伐;如果關(guān)心系統(tǒng)啟動(dòng)應(yīng)用耗時(shí)馒胆,參考WaitTime;如果關(guān)心應(yīng)用有界面Activity啟動(dòng)耗時(shí)凝果,參考ThisTime国章。

二、熱啟動(dòng)

如果是你按Back鍵豆村,并沒(méi)有將應(yīng)用進(jìn)程殺掉的話液兽,那么執(zhí)行上述命令就會(huì)快一些,因?yàn)椴挥脛?chuàng)建進(jìn)程了掌动,只需要啟動(dòng)一個(gè)Activity即可四啰。這也就是我們說(shuō)的應(yīng)用熱啟動(dòng)。

游戲啟動(dòng)的話粗恢,就不適用用命令行的方法來(lái)啟動(dòng)了柑晒,因?yàn)閺挠脩?hù)點(diǎn)擊桌面圖標(biāo)到登錄界面,既有系統(tǒng)的部分也有游戲自己的部分眷射。

系統(tǒng)部分:游戲也有一個(gè) Activity匙赞,所以啟動(dòng)的時(shí)候還是會(huì)去啟動(dòng)這個(gè) Activity佛掖,所以系統(tǒng)啟動(dòng)部分也就是用戶(hù)點(diǎn)擊桌面桌面響應(yīng)到這個(gè)Activity啟動(dòng)。

游戲部分:一般游戲的主 Activity 啟動(dòng)后涌庭,還會(huì)做一些比較耗時(shí)的事情芥被,這時(shí)候你看到的界面是不能操作的,比如:加載游戲數(shù)據(jù)坐榆、聯(lián)網(wǎng)更新數(shù)據(jù)拴魄、讀取和更新配置文件、游戲引擎初始化等操作席镀。從游戲開(kāi)發(fā)的角度來(lái)看匹中,到了真正用戶(hù)能操作的界面才算是一個(gè)游戲真正加載完成的時(shí)間。

那么這個(gè)時(shí)間豪诲,就得使用 Log 來(lái)記錄了顶捷,因?yàn)榧虞d游戲數(shù)據(jù)、聯(lián)網(wǎng)更新數(shù)據(jù)屎篱、讀取和更新配置文件焊切、游戲引擎初始化這些操作,都是游戲自己的邏輯芳室,與系統(tǒng)無(wú)關(guān)专肪,所以得由游戲自己定義加載完成的點(diǎn)。

對(duì)于游戲的啟動(dòng)時(shí)間堪侯,我們更傾向于計(jì)算從點(diǎn)擊桌面圖標(biāo)到用戶(hù)可以與游戲進(jìn)行交互這個(gè)時(shí)間段作為一個(gè)游戲的啟動(dòng)時(shí)間

三嚎尤、冷啟動(dòng)

應(yīng)用不在后臺(tái)時(shí)第一次啟動(dòng),系統(tǒng)和App本身都有更多的工作要從頭開(kāi)始伍宦!芽死、

應(yīng)用在冷啟動(dòng)之前,要執(zhí)行三個(gè)任務(wù):

加載啟動(dòng)App次洼;

App啟動(dòng)之后立即展示出一個(gè)空白的Window关贵;

創(chuàng)建App的進(jìn)程;

而這三個(gè)任務(wù)執(zhí)行完畢之后會(huì)馬上執(zhí)行以下任務(wù):

創(chuàng)建App對(duì)象卖毁;

啟動(dòng)Main Thread揖曾;

創(chuàng)建啟動(dòng)的Activity對(duì)象;

加載View亥啦;

布置屏幕炭剪;

進(jìn)行第一次繪制;

而一旦App進(jìn)程完成了第一次繪制翔脱,系統(tǒng)進(jìn)程就會(huì)用Main Activity替換已經(jīng)展示的Background Window奴拦,此時(shí)用戶(hù)就可以使用App了。

作為普通應(yīng)用届吁,App進(jìn)程的創(chuàng)建等環(huán)節(jié)我們是無(wú)法主動(dòng)控制的错妖,可以?xún)?yōu)化的也就是Application绿鸣、Activity創(chuàng)建以及回調(diào)等過(guò)程。

同樣暂氯,Google也給出了啟動(dòng)加速的方向:

利用提前展示出來(lái)的Window潮模,快速展示出來(lái)一個(gè)界面,給用戶(hù)快速反饋的體驗(yàn)株旷;

避免在啟動(dòng)時(shí)做密集沉重的初始化(Heavy app initialization)再登;

定位問(wèn)題:避免I/O操作尔邓、反序列化晾剖、網(wǎng)絡(luò)操作、布局嵌套等梯嗽。

備注:方向1屬于治標(biāo)不治本齿尽,只是表面上快;方向2灯节、3可以真實(shí)的加快啟動(dòng)速度循头。

接下來(lái)我們就在項(xiàng)目中實(shí)際應(yīng)用。

gold.xitu.io/post/5874bff0128fe1006b443fa0

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末炎疆,一起剝皮案震驚了整個(gè)濱河市卡骂,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌形入,老刑警劉巖全跨,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異亿遂,居然都是意外死亡浓若,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)蛇数,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)挪钓,“玉大人,你說(shuō)我怎么就攤上這事耳舅÷瞪希” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵浦徊,是天一觀的道長(zhǎng)绍赛。 經(jīng)常有香客問(wèn)我,道長(zhǎng)辑畦,這世上最難降的妖魔是什么吗蚌? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮纯出,結(jié)果婚禮上蚯妇,老公的妹妹穿的比我還像新娘敷燎。我一直安慰自己,他們只是感情好箩言,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布硬贯。 她就那樣靜靜地躺著,像睡著了一般陨收。 火紅的嫁衣襯著肌膚如雪饭豹。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,365評(píng)論 1 302
  • 那天务漩,我揣著相機(jī)與錄音拄衰,去河邊找鬼。 笑死饵骨,一個(gè)胖子當(dāng)著我的面吹牛翘悉,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播居触,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼妖混,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了轮洋?” 一聲冷哼從身側(cè)響起制市,我...
    開(kāi)封第一講書(shū)人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤煌茴,失蹤者是張志新(化名)和其女友劉穎趁蕊,沒(méi)想到半個(gè)月后值漫,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體蚓挤,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡肢预,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年论巍,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了阔挠。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片医舆。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡竭翠,死狀恐怖振坚,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情斋扰,我是刑警寧澤渡八,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站传货,受9級(jí)特大地震影響屎鳍,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜问裕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一逮壁、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧粮宛,春花似錦窥淆、人聲如沸卖宠。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)扛伍。三九已至,卻和暖如春词裤,著一層夾襖步出監(jiān)牢的瞬間刺洒,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工吼砂, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留逆航,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓帅刊,卻偏偏與公主長(zhǎng)得像纸泡,于是被迫代替她去往敵國(guó)和親漂问。 傳聞我的和親對(duì)象是個(gè)殘疾皇子赖瞒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354

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