1. 程式人生 > 程式設計 >Android效能之冷啟動優化詳析

Android效能之冷啟動優化詳析

1.前言

APP冷啟動比較慢,點選桌面圖片需要使用者等待很久,體驗較差。

2.APP啟動方式

冷啟動(Cold start)

場景:冷啟動是指APP在手機啟動後第一次執行,或者APP程序被kill掉後在再次啟動。

可見冷啟動的必要條件是該APP程序不存在,這就意味著系統需要建立程序,APP需要初始化。在這三種啟動方式中,冷啟動耗時最長,對於冷啟動的優化也是最具挑戰的。因此本文重點談論的是對冷啟動相關的優化。

生命週期:Process.start->Application建立->attachBaseContext->onCreate->onStart->onResume->Activity生命週期

啟動速度:在幾種啟動型別中最慢,也是我們優化啟動速度最大的攔路虎

溫啟動(Warm start)

場景:App程序存在,當時Activity可能因為記憶體不足被回收。這時候啟動App不需要重新建立程序,但是Activity的onCrate還是需要重新執行的。場景類似開啟淘寶逛了一圈然後切到微信去聊天去了,過了半小時再次回到淘寶。這時候淘寶的程序存在,但是Activity可能被回收,這時候只需要重新載入Activity即可。

生命週期:onCreate->onStart->onResume->Activity生命週期

啟動速度:較快

熱啟動(Hot start)

場景:App程序存在,並且Activity物件仍然存在記憶體中沒有被回收。可以重複避免物件初始化,佈局解析繪製。

場景就類似你開啟微信聊了一會天這時候出去看了下日曆 在開啟微信 微信這時候啟動就屬於熱啟動。

生命週期:onResume->Activity生命週期

啟動速度:快

3.如何統計Android App啟動時間(使用命令列)

adb shell am start -W [packageName]/[packageName.***Activity]

例如:

adb shell am start -W com.dateyou.test/com.datayou.test.ui.home.PageLoadingActivity

當然為了結果更加準確,可以執行多次取平均值。

adb shell am start -S -R 10 -W com.dateyou.test/com.datayou.test.ui.home.PageLoadingActivity

其中-S表示每次啟動前先強行停止,-R表示重複測試次數。每一次的輸出如下所示資訊。

其中TotalTime代表當前Activity啟動時間

4.冷啟動流程

冷啟動指的是應用程式從程序在系統不存在,到系統建立應用執行程序空間的過程。冷啟動通常會發生在一下兩種情況:

1)裝置啟動以來首次啟動應用程式

2)系統殺死應用程式之後再次啟動應用程式

在冷啟動的最開始,系統需要負責做三件事:

1)載入以及啟動app

2)app啟動之後立刻顯示一個空白的預覽視窗

3)建立app程序

一旦系統完成建立app程序後,app程序將要接著負責完成下面的工作:

1)建立Application物件

2)建立並且啟動主執行緒ActivityThread

3)建立啟動第一個Activity

4)Inflating views

5)佈局螢幕

6)執行第一次繪製

一旦app程序完完成了第一次繪製工作,系統程序就會用main activity替換前面顯示的預覽視窗,這個時候,使用者就可以正式開始與app進行互動了。

從冷啟動的流程看,我們無法干預app程序建立等系統操作,我們能夠干預的有:

1)預覽視窗

2)Application生命週期回撥

3)Activity生命週期回撥

5.冷啟動優化

1)預覽視窗

為什麼啟動時會出現短暫黑屏或白屏的現象?當用戶點選你的app那一刻到系統呼叫Activity.onCreate()之間的這個時間段內,WindowManager會先載入app主題樣式中的windowBackground做為app的預覽元素,然後再真正去載入activity的layout佈局。
很顯然,如果你的application或activity啟動的過程太慢,導致系統的BackgroundWindow沒有及時被替換,就會出現啟動時白屏或黑屏的情況(取決於你的主題是Dark還是Light)。

解決辦法:在style中自定義一個主題,在其中放一張背景圖片或者廣告頁,讓使用者先看預設圖。

2)Application OnCrate()優化

1.耗時操作子執行緒中進行

2.非必要初始化懶載入

3)Activity onCreate()優化

1.耗時操作子執行緒中進行

2.佈局層次減少

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對我們的支援。