Android性能之冷啟動優(yōu)化詳析
1.前言
APP冷啟動比較慢,點擊桌面圖片需要用戶等待很久,體驗較差。
2.APP啟動方式
冷啟動(Cold start)
場景:冷啟動是指APP在手機啟動后第一次運行,或者APP進程被kill掉后在再次啟動。
可見冷啟動的必要條件是該APP進程不存在,這就意味著系統(tǒng)需要創(chuàng)建進程,APP需要初始化。在這三種啟動方式中,冷啟動耗時最長,對于冷啟動的優(yōu)化也是最具挑戰(zhàn)的。因此本文重點談?wù)摰氖菍鋯酉嚓P(guān)的優(yōu)化。
生命周期:Process.start->Application創(chuàng)建->attachBaseContext->onCreate->onStart->onResume->Activity生命周期
啟動速度:在幾種啟動類型中最慢,也是我們優(yōu)化啟動速度最大的攔路虎
溫啟動(Warm start)
場景:App進程存在,當時Activity可能因為內(nèi)存不足被回收。這時候啟動App不需要重新創(chuàng)建進程,但是Activity的onCrate還是需要重新執(zhí)行的。場景類似打開淘寶逛了一圈然后切到微信去聊天去了,過了半小時再次回到淘寶。這時候淘寶的進程存在,但是Activity可能被回收,這時候只需要重新加載Activity即可。
生命周期:onCreate->onStart->onResume->Activity生命周期
啟動速度:較快
熱啟動(Hot start)
場景:App進程存在,并且Activity對象仍然存在內(nèi)存中沒有被回收??梢灾貜捅苊鈱ο蟪跏蓟季纸馕隼L制。
場景就類似你打開微信聊了一會天這時候出去看了下日歷 在打開微信 微信這時候啟動就屬于熱啟動。
生命周期:onResume->Activity生命周期
啟動速度:快
3.如何統(tǒng)計Android App啟動時間(使用命令行)
adb shell am start -W [packageName]/[packageName.***Activity]
例如:
adb shell am start -W com.dateyou.test/com.datayou.test.ui.home.PageLoadingActivity
當然為了結(jié)果更加準確,可以執(zhí)行多次取平均值。
adb shell am start -S -R 10 -W com.dateyou.test/com.datayou.test.ui.home.PageLoadingActivity
其中-S表示每次啟動前先強行停止,-R表示重復測試次數(shù)。每一次的輸出如下所示信息。
其中TotalTime代表當前Activity啟動時間
4.冷啟動流程
冷啟動指的是應用程序從進程在系統(tǒng)不存在,到系統(tǒng)創(chuàng)建應用運行進程空間的過程。冷啟動通常會發(fā)生在一下兩種情況:
1)設(shè)備啟動以來首次啟動應用程序
2)系統(tǒng)殺死應用程序之后再次啟動應用程序
在冷啟動的最開始,系統(tǒng)需要負責做三件事:
1)加載以及啟動app
2)app啟動之后立刻顯示一個空白的預覽窗口
3)創(chuàng)建app進程
一旦系統(tǒng)完成創(chuàng)建app進程后,app進程將要接著負責完成下面的工作:
1)創(chuàng)建Application對象
2)創(chuàng)建并且啟動主線程ActivityThread
3)創(chuàng)建啟動第一個Activity
4)Inflating views
5)布局屏幕
6)執(zhí)行第一次繪制
一旦app進程完完成了第一次繪制工作,系統(tǒng)進程就會用main activity替換前面顯示的預覽窗口,這個時候,用戶就可以正式開始與app進行交互了。
從冷啟動的流程看,我們無法干預app進程創(chuàng)建等系統(tǒng)操作,我們能夠干預的有:
1)預覽窗口
2)Application生命周期回調(diào)
3)Activity生命周期回調(diào)
5.冷啟動優(yōu)化
1)預覽窗口
為什么啟動時會出現(xiàn)短暫黑屏或白屏的現(xiàn)象?當用戶點擊你的app那一刻到系統(tǒng)調(diào)用Activity.onCreate()之間的這個時間段內(nèi),WindowManager會先加載app主題樣式中的windowBackground做為app的預覽元素,然后再真正去加載activity的layout布局。
很顯然,如果你的application或activity啟動的過程太慢,導致系統(tǒng)的BackgroundWindow沒有及時被替換,就會出現(xiàn)啟動時白屏或黑屏的情況(取決于你的主題是Dark還是Light)。
解決辦法:在style中自定義一個主題,在其中放一張背景圖片或者廣告頁,讓用戶先看默認圖。
2)Application OnCrate()優(yōu)化
1.耗時操作子線程中進行
2.非必要初始化懶加載
3)Activity onCreate()優(yōu)化
1.耗時操作子線程中進行
2.布局層次減少
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對我們的支持。
上一篇:Android自定義View實現(xiàn)點贊控件
欄 目:Android
下一篇:Android自定義View實現(xiàn)地鐵顯示牌效果
本文地址:http://mengdiqiu.com.cn/a1/Android/9073.html
您可能感興趣的文章
- 01-10Android自定義View之繪制圓形頭像功能
- 01-10Android實現(xiàn)雙擊返回鍵退出應用實現(xiàn)方法詳解
- 01-10android實現(xiàn)記住用戶名和密碼以及自動登錄
- 01-10android實現(xiàn)簡單計算器功能
- 01-10Android 友盟第三方登錄與分享的實現(xiàn)代碼
- 01-10android實現(xiàn)指紋識別功能
- 01-10Emoji表情在Android JNI中的兼容性問題詳解
- 01-10Android實現(xiàn)圓形漸變加載進度條
- 01-10android開發(fā)環(huán)境中SDK文件夾下的所需內(nèi)容詳解
- 01-10android異步消息機制 源碼層面徹底解析(1)


閱讀排行
本欄相關(guān)
- 01-10Android自定義View之繪制圓形頭像功能
- 01-10Android實現(xiàn)雙擊返回鍵退出應用實現(xiàn)方
- 01-10android實現(xiàn)簡單計算器功能
- 01-10android實現(xiàn)記住用戶名和密碼以及自動
- 01-10C++自定義API函數(shù)實現(xiàn)大數(shù)相乘算法
- 01-10Android 友盟第三方登錄與分享的實現(xiàn)代
- 01-10android實現(xiàn)指紋識別功能
- 01-10如何給Flutter界面切換實現(xiàn)點特效
- 01-10Android實現(xiàn)圓形漸變加載進度條
- 01-10Emoji表情在Android JNI中的兼容性問題詳
隨機閱讀
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-10C#中split用法實例總結(jié)
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 01-11ajax實現(xiàn)頁面的局部加載
- 01-10delphi制作wav文件的方法
- 04-02jquery與jsp,用jquery
- 08-05DEDE織夢data目錄下的sessions文件夾有什