Android項(xiàng)目中的優(yōu)化 -- 啟動(dòng)時(shí)間

0. 概念

冷啟動(dòng):?jiǎn)?dòng)應(yīng)用時(shí)瘪匿,后臺(tái)沒有該應(yīng)用的進(jìn)程(首次安裝萨赁、手工強(qiáng)制殺死APP進(jìn)程柑蛇、系統(tǒng)強(qiáng)制殺死APP進(jìn)程等操作)罐旗。
熱啟動(dòng):?jiǎn)?dòng)應(yīng)用時(shí),后臺(tái)已有該應(yīng)用的進(jìn)程(home鍵唯蝶、back鍵退出等操作)九秀。

1. 優(yōu)化工具

既然是優(yōu)化,肯定要能看到效果粘我,所以要有數(shù)據(jù)顯示證明優(yōu)化確實(shí)起到了作用鼓蜒。

  • Displayed
    在Android Studio中的logcat過濾Displayed關(guān)鍵字就可以(不包括不被布局文件及初始化對(duì)象所引用的資源的加載時(shí)間)
    image.png
  • ADB Shell Activity Manager
    看到數(shù)據(jù)和上面的差不多痹换,具體詳細(xì)操作可以網(wǎng)上搜索
adb shell am start -S -W com.android.diaodiao/.MainActivity
-c android.intent.category.LAUNCHER
-a android.intent.action.MAIN
  • reportFullyDrawn()
    這次主要是采用的這個(gè)方法的數(shù)據(jù)作為標(biāo)準(zhǔn),因?yàn)轱@示的是應(yīng)用啟動(dòng)到所有資源和視圖層次結(jié)構(gòu)的完整顯示之間所經(jīng)過的時(shí)間都弹,因?yàn)橄旅嬗袘屑虞d優(yōu)化方法娇豫,所以這個(gè)方法非常有用。
    主要用法就是在自己代碼中畅厢,特別是懶加載結(jié)束的時(shí)候調(diào)用
reportFullyDrawn()

告訴系統(tǒng)結(jié)束加載了冯痢,系統(tǒng)會(huì)打印出APP啟動(dòng)到這個(gè)函數(shù)調(diào)用的時(shí)間。

2. 冷啟動(dòng)分析

啟動(dòng)過程:

  • 點(diǎn)擊app的啟動(dòng)圖標(biāo)時(shí)框杜,安卓系統(tǒng)會(huì)從Zygote進(jìn)程中fork創(chuàng)建出一個(gè)新的進(jìn)程分配給該應(yīng)用浦楣。
  • 創(chuàng)建對(duì)象,啟動(dòng)主線程 (MainThread)咪辱。
  • 初始化Application和MainActivity振劳、加載視圖(Inflating views)、渲染布局(Laying out)油狂、完成繪制(onDraw)历恐。

前兩個(gè)主要過程是:

  1. 點(diǎn)擊APP桌面圖標(biāo),通過Binder IPC調(diào)用ActivityManagerService
  2. ActivityManagerService會(huì)孵化出一個(gè)Zygote進(jìn)程.
  3. Zygote進(jìn)程會(huì)實(shí)例化ActivityThread對(duì)象
  4. ActivityThread對(duì)象會(huì)調(diào)用Looper.prepareLoop()和Looper.loop()來開啟消息循環(huán)
  5. ActivityThread對(duì)象會(huì)調(diào)用bindApplication方法专筷,這個(gè)方法里面會(huì)發(fā)送BIND_APPLICATION到消息隊(duì)列
  6. handleBindApplication會(huì)處理剛才發(fā)送的消息弱贼,然后調(diào)用makeApplication來加載APP的classes到內(nèi)存
  7. 在剛才啟動(dòng)的Application進(jìn)程會(huì)發(fā)送LAUNCH_ACTIVITY消息到消息隊(duì)列
  8. 通過handleLaunchActivity來處理消息啟動(dòng)Activity.

從以上部分可以得知主要是第三部分的優(yōu)化。

首先Android Studio提供強(qiáng)大工具來分析trace文件磷蛹,查看各個(gè)函數(shù)執(zhí)行的時(shí)間哮洽,所以要先生成trace文件。

  • 在onCreate() 和 onWindowFocusChanged()中分別添加android.os.Debug.startMethodTracing()和android.os.Debug.stopMethodTracing()就會(huì)在sdcard 根目錄下或者應(yīng)用的目錄中生存trace文件弦聂,這兩個(gè)函數(shù)主要作用是生存函數(shù)執(zhí)行時(shí)間鸟辅。
  • 通過 Trace.beginSection 和 Trace.endSection來追蹤應(yīng)用的代碼片段,這兩個(gè)函數(shù)主要跟蹤系統(tǒng)的 I/O 操作莺葫、內(nèi)核工作隊(duì)列匪凉、 CPU 負(fù)載等,很好收集分析 UI 顯示性能的數(shù)據(jù)捺檬。

以上兩個(gè)方法都能很明顯的找到性能瓶頸和主要耗時(shí)的操作再层。

3. 項(xiàng)目中遇到的問題

  • 啟動(dòng)白屏:這個(gè)是很久以前的方案了,設(shè)置主題為自己的圖片堡纬,然后在MainActivity的onCreate里面重新設(shè)置回項(xiàng)目的主題(只是體驗(yàn)上的優(yōu)化聂受,并沒有加快app的啟動(dòng)速度)
  • 異步加載:把一些能放入WorkThread里面加載的放入子線程,并且降低線程優(yōu)先級(jí)烤镐。比如友盟和數(shù)據(jù)庫(kù)初始化等
  • 延時(shí)加載:必須放入主線程初始化的蛋济,如果在MainActivity加載完成立即必須用的就用View.post(Runnable) 比如IM模塊,在后續(xù)操作用的就用Handler的postDelayed盡量延時(shí)加載比如統(tǒng)計(jì)模塊炮叶。
  • 懶加載:有些對(duì)象可以到用的時(shí)候在初始化就用懶加載比如ImageLoader碗旅。
  • 布局優(yōu)化:MainActivity中布局的嵌套層數(shù)盡量少渡处,后續(xù)會(huì)講到,并且盡量不要有大量數(shù)據(jù)庫(kù)祟辟、IO操作医瘫。
  • 其他方面:去除無用代碼、開發(fā)階段代碼旧困、重復(fù)邏輯醇份、緩存技術(shù)等。

4.總結(jié)

  • 每一步優(yōu)化操作都要對(duì)癥下藥吼具,不可胡亂下藥僚纷,不然會(huì)引起新的bug。
  • 優(yōu)化后的效果要用前面說的工具詳細(xì)對(duì)比馍悟,確認(rèn)優(yōu)化起到了作用畔濒。
  • 有些歷史原因現(xiàn)在已經(jīng)不方便優(yōu)化剩晴,改動(dòng)太大锣咒,所以以后開發(fā)的時(shí)候要注意,盡量隔一段時(shí)間用traceView對(duì)比分析一下赞弥。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末毅整,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子绽左,更是在濱河造成了極大的恐慌悼嫉,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拼窥,死亡現(xiàn)場(chǎng)離奇詭異戏蔑,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)鲁纠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門总棵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人改含,你說我怎么就攤上這事情龄。” “怎么了捍壤?”我有些...
    開封第一講書人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵骤视,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我鹃觉,道長(zhǎng)专酗,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任盗扇,我火速辦了婚禮笼裳,結(jié)果婚禮上唯卖,老公的妹妹穿的比我還像新娘。我一直安慰自己躬柬,他們只是感情好拜轨,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著允青,像睡著了一般橄碾。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上颠锉,一...
    開封第一講書人閱讀 51,679評(píng)論 1 305
  • 那天法牲,我揣著相機(jī)與錄音,去河邊找鬼琼掠。 笑死拒垃,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的瓷蛙。 我是一名探鬼主播悼瓮,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼艰猬!你這毒婦竟也來了横堡?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤冠桃,失蹤者是張志新(化名)和其女友劉穎命贴,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體食听,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡胸蛛,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了樱报。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片葬项。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖肃弟,靈堂內(nèi)的尸體忽然破棺而出玷室,到底是詐尸還是另有隱情,我是刑警寧澤笤受,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布穷缤,位于F島的核電站,受9級(jí)特大地震影響箩兽,放射性物質(zhì)發(fā)生泄漏津肛。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一汗贫、第九天 我趴在偏房一處隱蔽的房頂上張望身坐。 院中可真熱鬧秸脱,春花似錦、人聲如沸部蛇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽涯鲁。三九已至巷查,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間抹腿,已是汗流浹背岛请。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留警绩,地道東北人崇败。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像肩祥,于是被迫代替她去往敵國(guó)和親后室。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

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