android 启动优化方案,Android 项目优化(五):应用启动优化
介紹了前面的優化的方案后,這里我們在針對應用的啟動優化做一下講解和說明。
一、App啟動概述
一個應用App的啟動速度能夠影響用戶的首次體驗,啟動速度較慢(感官上)的應用可能導致用戶再次開啟App的意圖下降,或者卸載放棄該應用程序。
應用程序啟動有主要分為兩種狀態,每種狀態都會影響應用程序對用戶可見所需的時間:冷啟動,熱啟動。
冷啟動:冷啟動表示用戶首次打開應用,這時進程還沒創建,包含了Application創建的過程。冷啟動時間指從第一次用戶點擊Launcher中的應用圖標開始,到首頁內容全部展示出來。
熱啟動:熱啟動表示用戶在首頁按了返回,首頁Activity已經Destroy,不過Application仍在內存中存在,對應的進程并沒有被殺掉,不包含Application創建過程。熱啟動時間指在Application仍然存在的情況下,從用戶點擊桌面圖標,到首頁內容全部展示出來。
注:冷啟動、熱啟動不是官方的定義,而是我們基于用戶的角度考慮的定義。
在冷啟動開始時,系統有三個任務。這些任務是:
加載并啟動應用程序。
啟動后立即顯示應用程序空白的啟動窗口。
創建應用程序進程。
一旦系統創建應用程序進程,應用程序進程就會負責下一階段。這些階段是:
創建App對象
啟動主線程(main thread)
創建應用入口的Activity對象
填充加載布局Views
在屏幕上執行View的繪制過程.measure -> layout -> draw
應用程序進程完成第一次繪制后,系統進程會交換當前顯示的背景窗口,將其替換為主Activity。此時,用戶可以開始使用該應用程序。
這里我們建議始終根據冷啟動的假設進行優化。這樣做也可以改善熱啟動的性能。
二、冷啟動視覺效果優化
上面我們說了,冷啟動的階段執行的操作為:
加載并啟動應用程序
啟動后立即顯示應用程序空白的啟動窗口
創建應用程序進程
現在 App 應用啟動都會先進入一個閃屏頁(LaunchActivity)?來展示應用信息。
系統默認會在啟動應用程序的時候啟動空白窗口?,直到 App 應用程序的入口Activity創建成功,視圖繪制完畢。但是存在的問題就是在進入閃屏頁的時候,會有2秒左右的白屏/灰屏的界面。
為了更順滑無縫銜接我們的閃屏頁,可以在啟動 Activity 的 Theme中設置閃屏頁圖片,這樣啟動窗口的圖片就會是閃屏頁圖片,而不是白屏。配置代碼如下:
@drawable/lunch//閃屏頁圖片true
false
這樣設置的話,就會在冷啟動的時候,展示閃屏頁的圖片,等App進程初始化加載入口 Activity (也是閃屏頁) 就可以無縫銜接。
其實這種方式并沒有真正的加速應用進程的啟動速度,而只是通過用戶視覺效果帶來的優化體驗。
備注:上面的方案適用于閃屏頁為整張圖片為閃屏內容(閃屏頁圖片推薦.9格式,防止拉伸失真)。不適用于閃屏頁為多個元素混合的。后者推薦參考Android 項目優化(二):啟動頁面優化。
三、App冷啟動耗時統計
App冷啟動耗時統計方式主要是:adb 命令統計、系統日志統計。
1. adb 命令統計
adb命令 :?adb shell am start -S -W 包名/啟動類的全限定名?, -S 表示重啟當前應用。示例如下:
C:AndroidDemo>adb shell am start -S -W com.example.moneyqian.demo/com.example.moneyqian.demo.MainActivity
Stopping: com.example.moneyqian.demo
Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.example.moneyqian.demo/.MainActivity }
Status: ok
Activity: com.example.moneyqian.demo/.MainActivity
ThisTime: 2247
TotalTime: 2247
WaitTime: 2278
Complete
ThisTime : 最后一個 Activity 的啟動耗時(例如從 LaunchActivity - >MainActivity「adb命令輸入的Activity」 , 只統計 MainActivity 的啟動耗時)
TotalTime : 啟動一連串的 Activity 總耗時.(有幾個Activity 就統計幾個)
WaitTime : 應用進程的創建過程 TotalTime .
總結一下 : 如果需要統計從點擊桌面圖標到 Activity 啟動完畢,可以用WaitTime作為標準,但是系統的啟動時間優化不了,所以優化冷啟動我們只要在意?ThisTime?即可。
2.?系統日志統計
根據系統日志來統計啟動耗時,在Android Studio中查找已用時間,必須在logcat視圖中禁用過濾器(No Filters)。因為這個是系統的日志輸出,而不是應用程序的。
比如我們可以通過過濾displayed輸出的啟動日志. 示例如下:
四、冷啟動 Application 優化
我們知道有很多第三方組件(包括App應用本身)都在 Application 中完成初始化操作。但是在 Application 中完成繁重的初始化操作和復雜的邏輯就會影響到應用的啟動性能。
通過分析一下,我們可以知道還是有機會優化這些工作以實現冷啟動的性能改進的,分析后發現影響冷啟動時間的常見問題如下:
復雜繁瑣的布局初始化
阻塞主線程 UI 繪制的操作,如 I/O 讀寫或者是網絡訪問.
其它占用主線程的操作
我們可以根據這些組件的輕重緩急之分,對初始化做一下分類 :
必要的組件一定要在主線程中立即初始化(入口 Activity 可能立即會用到)
組件一定要在主線程中初始化,但是可以延遲初始化。
組件可以在子線程中初始化。
在進行優化的時候,需要注意以下幾種情況:
放在子線程的組件初始化建議延遲初始化,這樣就可以了解是否會對項目造成影響!
將需要在主線程中初始化但是可以不用立即完成的動作延遲加載(初始化放在 Application 中統一管理為妙,不建議放在Activity里面)
可以嘗試將常見的組件庫,例如 Bugly,x5內核初始化,SP的讀寫,友盟等組件放到子線程中初始化。(子線程初始化不能影響到組件的使用)
在優化好啟動時間后,我們就可以在針對閃屏頁的時間,進行調整優化,具體公式為:
閃屏頁展示總時間 = 組件初始化時間 剩余展示時間
總結
以上是生活随笔為你收集整理的android 启动优化方案,Android 项目优化(五):应用启动优化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: html中svg的css,HTML5 内
- 下一篇: 【批处理】windows环境将文件放置在