想了解更多關于開源的內容,請訪問:
本站開源基礎軟件社區
Launch Profiler概述
DevEco Studio內置Profiler分析調優工具,其中Launch主要用于分析應用或服務的啟動耗時,分析啟動周期各階段的耗時情況、核心線程的運行情況等,協助開發者識別啟動緩慢的原因。此外,Launch任務窗口還集成了Time、CPU、Frame場景分析任務的功能,方便開發者在分析啟動耗時的過程中同步對比同一時段的其他資源占用情況。
場景示例
如下代碼在頁面繪制之前的aboutToAppear生命周期函數內執行了耗時的計算任務,導致應用冷啟動耗時長,文章后續將以本案例場景來簡單介紹Frame Profiler的使用。
@Entry
@Component
struct Index {
@State private text: string = "hello world";
private count: number = 0;
aboutToAppear() {
this.computeTask();
}
build() {
Column({space: 10}) {
Text(this.text).fontSize(50)
}
.width('100%')
.height('100%')
.padding(10)
}
computeTask() {
this.count = 0;
while (this.count < 10000000) {
this.count++;
}
}
}
使用約束
- 已通過USB連接設備
- 僅支持OpenHarmony API 10及以上版本的Stage工程
- 不支持對命令拉起的release應用進行Launch分析,也不可對其進行Launch錄制。
如何使用Launch Profiler錄制數據
首先打開profiler,以DevEco Studio 4.0.0.400版本為例,可以通過如下三種方式打開Profiler:
- 在DevEco Studio頂部菜單欄中選擇“View -> Tool Windows -> Profiler”。
- 在DevEco Studio底部工具欄中單擊“Profiler”。
- 按“Double Shift”或者“Crtl+Shift+A”打開搜索功能,搜索“Profiler”。
創建Launch任務并啟動錄制。
- 打開Profiler性能分析器。
- 選擇待分析的設備與應用進程。
- 選擇Launch工具。
- 點擊create Session按鈕創建啟動分析任務。
- 準備好調試環境后,點擊開始錄制啟動數據,再次點擊結束錄制。
說明:
針對調測應用的當前運行情況,Profiler對其做如下處理:
- 如選擇的是已安裝但未啟動的應用,在啟動該分析任務時,會自動拉起應用,進行數據錄制,結束錄制后可正常進入解析階段。
- 如選擇的是正在運行的應用,在啟動該分析任務時,會先將應用關停,再自動拉起應用,進行數據錄制,結束錄制后可正常進入解析階段。
在任務錄制(recording)及分析(analyzing)的過程中,請不要主動斷開應用或者設備,否則可能導致分析任務異常失敗。
如何使用Launch Profiler分析數據
“Launch”泳道顯示啟動生命周期各階段的耗時分布情況,如下圖:
- Process Creating:進程創建階段。該階段主要是AppSpawn fork子進程,AMS創建ability。
- Application Launching:應用程序啟動階段。該階段主要是資源加載、Application相關對象的創建與初始化、依賴模塊的加載等。
- UI Ability Launching:UIAbiity啟動階段。該階段主要是資源加載、Ability相關對象的創建與初始化、依賴模塊的加載等。
- UI Ability OnForeground:UIAbility置為前臺階段。該階段主要是加載應用首頁的源碼和so以及創建應用首頁內各個組件。
- First Frame - App Phase:應用側首幀。在FlushTask中把之前加載的組件上樹并布局。
- First Frame - Render Phase:渲染側首幀。render_service接受下一幀應用來的首頁布局信息,并繪制渲染
- EntryAbility:渲染完成,首頁顯示。
展開“Launch”泳道還包含多個與進程啟動有關聯的子泳道:
- “Static Initialization”子泳道:展示啟動過程中各靜態資源庫的加載耗時。
- “Running CPU Cores”子泳道:展示啟動過程中的主線程具體運行在哪個CPU核心。
- “le.startup_demo”子泳道:展示啟動過程的主線程的狀態和Trace數據。
針對應用冷啟動問題的性能分析,有以下兩種方式可以選擇,一種是分析主線程的Trace數據,另一種則是分析采樣得到的函數熱點。
分析主線程的Trace數據
從“Launch”泳道可以很明顯的看出UI Ability OnForeground階段的耗時占據應用冷啟動過程的大部分時間,如下圖:
- 單擊“Launch”泳道上的UI Ability OnForeground階段,在下方的“Details”詳情面板中,可查看到所選階段的耗時統計情況。
- 展開UI Ability OnForeground統計信息折疊表,可以看到各函數的具體耗時信息。
- 根據Duration找到耗時最長的函數aboutToAppear。
- 單擊。
按鈕,可直接跳轉至主線程的打點任務中,查看相關Trace數據,如下圖
可以發現aboutToAppear函數的耗時占據UI Ability OnForeground階段的大部分時間,結合應用代碼將aboutToAppear函數中的耗時計算任務以異步延遲的方式處理后,可以得到如下“Launch”泳道。
上述對比可以發現將耗時的計算任務以異步延遲的方式處理后可以顯著縮短UI Ability OnForeground階段的耗時,提升應用的冷啟動速度。
分析采樣得到的函數熱點
我們也可以分析采樣得到的函數熱點直觀的顯示應用冷啟動過程中具體函數的耗時,如下圖:
- 單擊“Launch”泳道上的UI Ability OnForeground階段。
- 選擇“ArkTS Callstack”泳道,其會基于時間軸展示CPU使用率和狀態的變化,以及當前調用棧名稱和調用類型。
- 下方“Details”詳情面板中查看到這段時間內的函數熱點,其會以Top-Down形式的樹狀列表進行展示。很明顯aboutToAppear函數中的computeTask函數耗時最多,占整個階段的81%。
此外,點擊Flame Chart按鈕打開火焰圖可以更直觀的看出熱點函數的耗時情況,如下圖:
根據上述步驟,使用異步延遲處理后的函數熱點如下,可以發現aboutToAppear函數的執行耗時只占整個UI Ability OnForeground階段的5.8%。
上述方法開發者可以選擇自己習慣的方式去查看。一般來說,如果所選的時間段里,函數棧比較復雜的話,用火焰圖找熱點會更高效。當鎖定到某個熱點函數之后,只需要雙擊函數結點,Profiler工具就會為您自動打開對應的源文件,并聚焦到相應代碼行。上述前提是這個源文件須是屬于當前工程,并且是在DevEco Studio內完成編譯的。
在使用Launch Profiler工具獲取啟動各階段的耗時信息時,需要應用結合實際開發需要修改。無特殊情況下,應該避免在應用啟動的生命周期函數內執行耗時操作,若需要可以使用異步延遲處理或者拋到其他線程處理。
提示
Profiler為Launch分析數據提供了全局搜索能力。單擊分析窗口左上角的,根據界面提示信息輸入需要搜索的項目,可獲取到相關內容的定位,使用搜索框的<、>按鍵可依次顯示返回結果的詳細內容。
在任務分析窗口,可以通過“Ctrl+鼠標滾輪”縮放時間軸,通過“Shift+鼠標滾輪”左右移動時間軸。
想了解更多關于開源的內容,請訪問:
本站開源基礎軟件社區