啟動的分類(熱身環節)
啟動動類型 | 觸發條件 | 系統開銷 & 速度 | 主要優化方向 |
---|---|---|---|
冷啟動 | 應用進程不存在(首次啟動或進程被殺后啟動) | 最高,需創建進程、加載資源、初始化所有組件 | 主要優化目標,減少主線程任務,延遲初始化 |
熱啟動 | 應用進程仍在后臺(從后臺喚起或切換回來) | 最低,只需將已有Activity切到前臺 | 保持進程存活,但需避免因后臺存活耗電或被殺 |
溫啟動 | 進程可能存在,但Activity需重建(如Back退出后又啟動或系統回收內存后) | 中等,可能需重建Activity | 優化Activity重建速度,利用Saved Instance State |
🔍 理解冷啟動
應用冷啟動時,系統需要創建新進程,并完成從Application初始化到首屏Activity渲染的完整過程。這個過程通常會給用戶呈現一個空白窗口(或主題指定的預覽窗口),直到首屏完成繪制。
冷啟動的完整流程可以概括為以下幾個關鍵階段:
-
系統準備進程:Launcher通過Binder IPC通知system_server進程,system_server再請求Zygotefork出新應用進程。
-
應用進程初始化:
-
執行
Application
的attachBaseContext()
和onCreate()
方法。 -
啟動主線程(UI線程)。
-
創建并初始化主Activity。
-
-
創建和渲染視圖:主Activity執行
onCreate()
(加載布局)、onStart()
、onResume()
,接著進行測量(measure)、布局(layout)、繪制(draw),最終內容被呈現到屏幕,替換之前的預覽窗口。
🐢 常見瓶頸與優化建議
冷啟動耗時通常消耗在以下方面(安卓為例子):
-
主線程繁重的初始化工作:在
Application
或首屏Activity
的onCreate
中同步執行大量耗時的第三方庫初始化、網絡請求、密集I/O操作(如讀寫數據庫或SharedPreferences)、復雜計算等,會阻塞UI渲染。 -
復雜的布局和視圖層次:首屏XML布局過于復雜,嵌套層次太深,或使用了耗時操作的自定義View,會導致
inflate
、measure
、layout
階段非常緩慢8。 -
過多的Class加載和對象初始化:加載大量類(特別是第三方庫的類)、創建大量臨時對象,會增加CPU壓力并可能觸發GC,導致卡頓。
優化思路主要是轉移、減少和推遲:
-
異步初始化與懶加載:
-
將非必需立即使用的組件(如某些第三方SDK、緩存預加載)放到后臺線程初始化(如使用
IntentService
或WorkManager
)。 -
對于一些組件,將其初始化推遲到真正需要使用的時候。
-
注意線程競爭,避免“偽異步”。
-
-
優化首屏布局和渲染:
-
簡化布局結構,減少不必要的嵌套和視圖數量,考慮使用
ConstraintLayout
。 -
避免在UI線程進行耗時的測量和繪制操作。
-
-
關注
Application
的創建過程:-
優化
Application
中的邏輯,只保留最必需的初始化。 -
控制方法數,避免過多的Dex文件,這會增加加載時間。
-
-
利用主題預覽窗減少白屏感:通過為啟動Activity設置特殊的主題,其中
android:windowBackground
設置為一張圖片或特定顏色的drawable,在頁面真正渲染完成前顯示,給用戶一種“應用已經啟動”的快速感覺,提升感知體驗
鴻蒙中
開發應用或元服務過程中,啟動速度是很重要的一個指標。如果開發者需要分析啟動過程的耗時瓶頸,優化應用或元服務的冷啟動速度,可使用DevEco Profiler提供的Launch場景分析能力,錄制啟動過程中的關鍵數據進行分析,從而識別出導致啟動緩慢的原因所在。此外,Launch任務窗口還集成了Time、CPU、Frame、Network場景分析任務的功能,方便開發者在分析啟動耗時的過程中同步對比同一時段的其他資源占用情況
啟動模式
啟動模式分為自動啟動和手動啟動,可點擊圖標切換兩種不同模式:
- 若選擇自動啟動模式,當用戶使用Launch模板并開始錄制時,將主動重啟所選應用;
- 手動啟動模式在開始錄制時,只會主動終止所選應用,等待界面出現彈窗提示啟動應用后,開發者需要手動啟動應用。
查看啟動過程中各階段的耗時情況
1:創建Launch場景調優分析任務并錄制相關數據,操作方法可參考性能問題定位:深度錄制,或在會話區選擇Open File,導入歷史數據。
說明
Launch分析任務支持在錄制前單擊,指定要錄制的泳道。“Launch”泳道顯示啟動生命周期各階段的耗時分布情況
- 在任務分析窗口,可以通過“Ctrl+鼠標滾輪”縮放時間軸,通過“Shift+鼠標滾輪”左右移動時間軸。或使用快捷鍵W/S放大或縮小時間軸,使用A鍵/D鍵可以左右移動時間軸。
- 將鼠標懸停在泳道任意位置,可以通過M鍵添加單點時間標簽。
- 鼠標框選要關注的時間段,可以通過“Shift+M”添加時間段時間標簽。
- 在任務分析窗口,可以通過“Ctrl+, ”向前選中單點時間標簽,通過“Ctrl+. ”向后選中單點時間標簽。
- 在任務分析窗口,可以通過“Ctrl+[ ”向前選中時間段時間標簽,通過“Ctrl+]”向后選中時間段時間標簽。
- Launch分析支持離線符號解析能力,請參見離線符號解析。
- Launch分析支持動效場景調優,請參見支持動效場景調優。
2:單擊“Launch”泳道上的單個階段,或框選多個階段,在下方的“Details”頁簽中,可查看到所選階段的耗時統計情況。展開各階段的統計信息折疊表,可以看到各個任務的具體耗時信息。單擊跳轉按鈕,可直接跳轉至相關線程打點任務中。
3:切換到“Load ETS Files”頁簽,從DevEco Studio 6.0.0 Beta1版本開始,支持查看冷啟動過程中ETS文件的加載情況。各字段含義如下:
- Category:該ETS文件在應用啟動過程中是否被使用。
- Weight:該ETS文件加載子節點文件(不包括自身)的總耗時。
- Self:該ETS文件自身加載的耗時。
- Import Count:該ETS文件被其他文件導入的次數。
- File Name:該ETS文件的名稱。
- Path:該ETS文件構建產物的路徑。
4:切換到“TOP Redundant”頁簽,可查看冷啟動過程中TOP 100冗余ETS加載文件信息。若File Name字段顯示為藍色,雙擊可快速跳轉至對應工程源文件
分析靜態資源庫加載耗時
-
展開“Launch”泳道,其中的“Static Initialization”子泳道展示啟動過程中各靜態資源庫的加載耗時。
-
單擊單個靜態資源庫色塊,或框選多個靜態資源庫,下方的“Details”區域展示所選對象的耗時統計信息。
針對耗時超過預期的加載任務,可單擊跳轉按鈕,跳轉至相關線程打點任務中進行深度分析。
查看核心線程在CPU Core的運行情況
- 展開“Launch”泳道,其中的“Running CPU Cores”子泳道展示啟動過程中的關鍵線程具體運行在哪個CPU核心。
- 單擊單個進程色塊,或框選多個進程,下方的“Details”區域展示所選對象的運行情況統計信息。
單擊對應CPU的跳轉按鈕,可進一步跳轉到CPU Core泳道查看詳細的調度信息。
指南優化應用性能冷啟動分析:Launch分析Launch模板基本操作
Launch模板基本操作
開發應用或元服務過程中,啟動速度是很重要的一個指標。如果開發者需要分析啟動過程的耗時瓶頸,優化應用或元服務的冷啟動速度,可使用DevEco Profiler提供的Launch場景分析能力,錄制啟動過程中的關鍵數據進行分析,從而識別出導致啟動緩慢的原因所在。此外,Launch任務窗口還集成了Time、CPU、Frame、Network場景分析任務的功能,方便開發者在分析啟動耗時的過程中同步對比同一時段的其他資源占用情況。
此處僅介紹“Launch”泳道相關內容,集成的Time、CPU、Frame、Network場景分析任務的功能請參考對應任務的章節。
說明
- 不支持命令拉起的Release應用不能進行Launch分析。
- 鎖屏狀態下可進行Launch錄制。
啟動模式
啟動模式分為
自動啟動和手動啟動,可點擊圖標切換兩種不同模式:
- 若選擇自動啟動模式,當用戶使用Launch模板并開始錄制時,將主動重啟所選應用;
- 手動啟動模式在開始錄制時,只會主動終止所選應用,等待界面出現彈窗提示啟動應用后,開發者需要手動啟動應用。
查看啟動過程中各階段的耗時情況
- 創建Launch場景調優分析任務并錄制相關數據,操作方法可參考性能問題定位:深度錄制,或在會話區選擇Open File,導入歷史數據。
說明
- 在任務分析窗口,可以通過“Ctrl+鼠標滾輪”縮放時間軸,通過“Shift+鼠標滾輪”左右移動時間軸。或使用快捷鍵W/S放大或縮小時間軸,使用A鍵/D鍵可以左右移動時間軸。
- 將鼠標懸停在泳道任意位置,可以通過M鍵添加單點時間標簽。
- 鼠標框選要關注的時間段,可以通過“Shift+M”添加時間段時間標簽。
- 在任務分析窗口,可以通過“Ctrl+, ”向前選中單點時間標簽,通過“Ctrl+. ”向后選中單點時間標簽。
- 在任務分析窗口,可以通過“Ctrl+[ ”向前選中時間段時間標簽,通過“Ctrl+]”向后選中時間段時間標簽。
- Launch分析支持離線符號解析能力,請參見離線符號解析。
- Launch分析支持動效場景調優,請參見支持動效場景調優。
Launch分析任務支持在錄制前單擊
指定要錄制的泳道。“Launch”泳道顯示啟動生命周期各階段的耗時分布情況。
- 單擊“Launch”泳道上的單個階段,或框選多個階段,在下方的“Details”頁簽中,可查看到所選階段的耗時統計情況。
展開各階段的統計信息折疊表,可以看到各個任務的具體耗時信息。單擊跳轉按鈕,可直接跳轉至相關線程打點任務中。
- 切換到“Load ETS Files”頁簽,從DevEco Studio 6.0.0 Beta1版本開始,支持查看冷啟動過程中ETS文件的加載情況。各字段含義如下:
- Category:該ETS文件在應用啟動過程中是否被使用。
- Weight:該ETS文件加載子節點文件(不包括自身)的總耗時。
- Self:該ETS文件自身加載的耗時。
- Import Count:該ETS文件被其他文件導入的次數。
- File Name:該ETS文件的名稱。
- Path:該ETS文件構建產物的路徑。
- 切換到“TOP Redundant”頁簽,可查看冷啟動過程中TOP 100冗余ETS加載文件信息。若File Name字段顯示為藍色,雙擊可快速跳轉至對應工程源文件。
說明
已上架應用市場的應用,不支持使用Load ETS Files或TOP Redundant頁簽查看冷啟動過程中ETS文件的加載情況。
分析靜態資源庫加載耗時
- 展開“Launch”泳道,其中的“Static Initialization”子泳道展示啟動過程中各靜態資源庫的加載耗時。
- 單擊單個靜態資源庫色塊,或框選多個靜態資源庫,下方的“Details”區域展示所選對象的耗時統計信息。
針對耗時超過預期的加載任務,可單擊跳轉按鈕,跳轉至相關線程打點任務中進行深度分析。
查看核心線程在CPU Core的運行情況
- 展開“Launch”泳道,其中的“Running CPU Cores”子泳道展示啟動過程中的關鍵線程具體運行在哪個CPU核心。
- 單擊單個進程色塊,或框選多個進程,下方的“Details”區域展示所選對象的運行情況統計信息。
單擊對應CPU的跳轉按鈕,可進一步跳轉到CPU Core泳道查看詳細的調度信息。
查看啟動過程相關的線程Trace數據
- 展開“Launch”泳道,除“Static Initialization”、“Running CPU Cores”外,還包含啟動過程的關鍵線程的狀態和Trace數據。
- 單擊單個切片色塊,或框選多個切片,可查看所選對象的詳情。
- “Details”區域對所選對象進行樹狀統計,顯示任務的名稱、起始時間以及耗時信息。
- “Thread States”區域展示線程的狀態統計信息。
- “Thread Usage”區域展示線程的使用情況。
- “Slice List”區域展示所選對象的切片統計信息。
- “Load Statistics”區域展示所選對象的中載重載信息。
官網鏈接??官方學習班級