在移動互聯網領域,Android系統可以說是最常用的系統之一。很多APP也大都是Android系統的。提高程序的啟動速度意義重大,很顯然,啟動時間越短,用戶才越有耐心等待打開這個 App 進行使用。反之啟動時間越長,用戶則越有可能來不及等到 App 打開就已經切換到其他 App 了。程序啟動過程中的那些復雜錯誤的操作很可能導致嚴重的性能問題。
中培偉業《Android APP 開發架構應用實戰》專家蔣老師在這里就Android APP程序啟動加速的方法進行了介紹。
李老師指出,Android 系統會根據用戶的操作行為調整程序的顯示策略,用來提高程序的顯示性能。例如,一旦用戶點擊桌面圖標,Android 系統會立即顯示一個啟動窗口,這個窗口會一直保持顯示,直到畫面中的元素成功加載并繪制完第一幀。這種行為常見于程序的冷啟動,或者程序的熱啟動場景(程序從后臺被喚起或者從其他 App 界面切換回來)。那么關鍵的問題是,用戶很可能會因為從啟動窗口到顯示畫面的過程耗時過長而感到厭煩,從而導致用戶沒有來得及等程序啟動完畢就切換到其他 App 了。更嚴重的是,如果啟動時間過長,可能導致程序出現 ANR。我們應該避免出現這兩種糟糕的情況。
從技術角度來說,當用戶點擊桌面圖標開始,系統會立即為這個 App 創建獨立的專屬進程,然后顯示啟動窗口,直到 App 在自己的進程里面完成了程序的創建以及主線程完成了 Activity 的初始化顯示操作,再然后系統進程就會把啟動窗口替換成APP的顯示窗口。
上述流程里面的絕大多數步驟都是由系統控制的,一般來說不會出現什么問題,可是對于啟動速度,我們能夠控制并且需要特別關注的地方主要有三處:
1.Activity 的 onCreate 流程,特別是 UI 的布局與渲染操作,如果布局過于復雜很可能導致嚴重的啟動性能問題。
2.Application 的 onCreate 流程,對于大型的 App 來說,通常會在這里做大量的通用組件的初始化操作。
3.目前有部分 App 會提供自定義的啟動窗口,這里可以做成品牌宣傳界面或者是給用戶提供一種程序已經啟動的視覺效果。
在正式著手解決問題之前,我們需要掌握一套正確測量評估啟動性能的方法。所幸的是,Android 系統有提供一些工具來幫助我們定位問題。
1. 首先是 display time:從 Android KitKat 版本開始,Logcat 中會輸出從程序啟動到某個 Activity 顯示到畫面上所花費的時間。這個方法比較適合測量程序的啟動時間。
2. 其次是 reportFullyDrawn 方法:我們通常來說會使用異步懶加載的方式來提升程序畫面的顯示速度,這通常會導致的一個問題是,程序畫面已經顯示,可是內容卻還在加載中。為了衡量這些異步加載資源所耗費的時間,我們可以在異步加載完畢之后調用activity.reportFullyDrawn()方法來告訴系統此時的狀態,以便獲取整個加載的耗時。
3. 然后是 Method Tracing:前面兩個方法提供了啟動耗時的總時間,可是卻無法提供具體的耗時細節。為了獲取具體的耗時分布情況,我們可以使用 Method Tracing工具來進行詳細的測量。
4. 最后是 Systrace:我們可以在 onCreate 方法里面添加trace.beginSection()與trace.endSection()方法來聲明需要跟蹤的起止位置,系統會幫忙統計中間經歷過的函數調用耗時,并輸出報表。