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