您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“Android性能之冷啟動(dòng)優(yōu)化的示例分析”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“Android性能之冷啟動(dòng)優(yōu)化的示例分析”這篇文章吧。
1.前言
APP冷啟動(dòng)比較慢,點(diǎn)擊桌面圖片需要用戶(hù)等待很久,體驗(yàn)較差。
2.APP啟動(dòng)方式
冷啟動(dòng)(Cold start)
場(chǎng)景:冷啟動(dòng)是指APP在手機(jī)啟動(dòng)后第一次運(yùn)行,或者APP進(jìn)程被kill掉后在再次啟動(dòng)。
可見(jiàn)冷啟動(dòng)的必要條件是該APP進(jìn)程不存在,這就意味著系統(tǒng)需要?jiǎng)?chuàng)建進(jìn)程,APP需要初始化。在這三種啟動(dòng)方式中,冷啟動(dòng)耗時(shí)最長(zhǎng),對(duì)于冷啟動(dòng)的優(yōu)化也是最具挑戰(zhàn)的。因此本文重點(diǎn)談?wù)摰氖菍?duì)冷啟動(dòng)相關(guān)的優(yōu)化。
生命周期:Process.start->Application創(chuàng)建->attachBaseContext->onCreate->onStart->onResume->Activity生命周期
啟動(dòng)速度:在幾種啟動(dòng)類(lèi)型中最慢,也是我們優(yōu)化啟動(dòng)速度最大的攔路虎
溫啟動(dòng)(Warm start)
場(chǎng)景:App進(jìn)程存在,當(dāng)時(shí)Activity可能因?yàn)閮?nèi)存不足被回收。這時(shí)候啟動(dòng)App不需要重新創(chuàng)建進(jìn)程,但是Activity的onCrate還是需要重新執(zhí)行的。場(chǎng)景類(lèi)似打開(kāi)淘寶逛了一圈然后切到微信去聊天去了,過(guò)了半小時(shí)再次回到淘寶。這時(shí)候淘寶的進(jìn)程存在,但是Activity可能被回收,這時(shí)候只需要重新加載Activity即可。
生命周期:onCreate->onStart->onResume->Activity生命周期
啟動(dòng)速度:較快
熱啟動(dòng)(Hot start)
場(chǎng)景:App進(jìn)程存在,并且Activity對(duì)象仍然存在內(nèi)存中沒(méi)有被回收??梢灾貜?fù)避免對(duì)象初始化,布局解析繪制。
場(chǎng)景就類(lèi)似你打開(kāi)微信聊了一會(huì)天這時(shí)候出去看了下日歷 在打開(kāi)微信 微信這時(shí)候啟動(dòng)就屬于熱啟動(dòng)。
生命周期:onResume->Activity生命周期
啟動(dòng)速度:快
3.如何統(tǒng)計(jì)Android App啟動(dòng)時(shí)間(使用命令行)
adb shell am start -W [packageName]/[packageName.***Activity]
例如:
adb shell am start -W com.dateyou.test/com.datayou.test.ui.home.PageLoadingActivity
當(dāng)然為了結(jié)果更加準(zhǔn)確,可以執(zhí)行多次取平均值。
adb shell am start -S -R 10 -W com.dateyou.test/com.datayou.test.ui.home.PageLoadingActivity
其中-S表示每次啟動(dòng)前先強(qiáng)行停止,-R表示重復(fù)測(cè)試次數(shù)。每一次的輸出如下所示信息。
其中TotalTime代表當(dāng)前Activity啟動(dòng)時(shí)間
4.冷啟動(dòng)流程
冷啟動(dòng)指的是應(yīng)用程序從進(jìn)程在系統(tǒng)不存在,到系統(tǒng)創(chuàng)建應(yīng)用運(yùn)行進(jìn)程空間的過(guò)程。冷啟動(dòng)通常會(huì)發(fā)生在一下兩種情況:
1)設(shè)備啟動(dòng)以來(lái)首次啟動(dòng)應(yīng)用程序
2)系統(tǒng)殺死應(yīng)用程序之后再次啟動(dòng)應(yīng)用程序
在冷啟動(dòng)的最開(kāi)始,系統(tǒng)需要負(fù)責(zé)做三件事:
1)加載以及啟動(dòng)app
2)app啟動(dòng)之后立刻顯示一個(gè)空白的預(yù)覽窗口
3)創(chuàng)建app進(jìn)程
一旦系統(tǒng)完成創(chuàng)建app進(jìn)程后,app進(jìn)程將要接著負(fù)責(zé)完成下面的工作:
1)創(chuàng)建Application對(duì)象
2)創(chuàng)建并且啟動(dòng)主線程ActivityThread
3)創(chuàng)建啟動(dòng)第一個(gè)Activity
4)Inflating views
5)布局屏幕
6)執(zhí)行第一次繪制
一旦app進(jìn)程完完成了第一次繪制工作,系統(tǒng)進(jìn)程就會(huì)用main activity替換前面顯示的預(yù)覽窗口,這個(gè)時(shí)候,用戶(hù)就可以正式開(kāi)始與app進(jìn)行交互了。
從冷啟動(dòng)的流程看,我們無(wú)法干預(yù)app進(jìn)程創(chuàng)建等系統(tǒng)操作,我們能夠干預(yù)的有:
1)預(yù)覽窗口
2)Application生命周期回調(diào)
3)Activity生命周期回調(diào)
5.冷啟動(dòng)優(yōu)化
1)預(yù)覽窗口
為什么啟動(dòng)時(shí)會(huì)出現(xiàn)短暫黑屏或白屏的現(xiàn)象?當(dāng)用戶(hù)點(diǎn)擊你的app那一刻到系統(tǒng)調(diào)用Activity.onCreate()之間的這個(gè)時(shí)間段內(nèi),WindowManager會(huì)先加載app主題樣式中的windowBackground做為app的預(yù)覽元素,然后再真正去加載activity的layout布局。
很顯然,如果你的application或activity啟動(dòng)的過(guò)程太慢,導(dǎo)致系統(tǒng)的BackgroundWindow沒(méi)有及時(shí)被替換,就會(huì)出現(xiàn)啟動(dòng)時(shí)白屏或黑屏的情況(取決于你的主題是Dark還是Light)。
解決辦法:在style中自定義一個(gè)主題,在其中放一張背景圖片或者廣告頁(yè),讓用戶(hù)先看默認(rèn)圖。
2)Application OnCrate()優(yōu)化
1.耗時(shí)操作子線程中進(jìn)行
2.非必要初始化懶加載
3)Activity onCreate()優(yōu)化
1.耗時(shí)操作子線程中進(jìn)行
2.布局層次減少
以上是“Android性能之冷啟動(dòng)優(yōu)化的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。