DevEco Studio Profiler工具分析應(yīng)用啟動(dòng)性能

想了解更多關(guān)于開(kāi)源的內(nèi)容,請(qǐng)?jiān)L問(wèn):
Launch Profiler概述
DevEco Studio內(nèi)置Profiler分析調(diào)優(yōu)工具,其中Launch主要用于分析應(yīng)用或服務(wù)的啟動(dòng)耗時(shí),分析啟動(dòng)周期各階段的耗時(shí)情況、核心線程的運(yùn)行情況等,協(xié)助開(kāi)發(fā)者識(shí)別啟動(dòng)緩慢的原因。此外,Launch任務(wù)窗口還集成了Time、CPU、Frame場(chǎng)景分析任務(wù)的功能,方便開(kāi)發(fā)者在分析啟動(dòng)耗時(shí)的過(guò)程中同步對(duì)比同一時(shí)段的其他資源占用情況。
場(chǎng)景示例
如下代碼在頁(yè)面繪制之前的aboutToAppear生命周期函數(shù)內(nèi)執(zhí)行了耗時(shí)的計(jì)算任務(wù),導(dǎo)致應(yīng)用冷啟動(dòng)耗時(shí)長(zhǎng),文章后續(xù)將以本案例場(chǎng)景來(lái)簡(jiǎn)單介紹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++;
  }
 }
}使用約束
- 已通過(guò)USB連接設(shè)備
 - 僅支持OpenHarmony API 10及以上版本的Stage工程
 - 不支持對(duì)命令拉起的release應(yīng)用進(jìn)行Launch分析,也不可對(duì)其進(jìn)行Launch錄制。
 
如何使用Launch Profiler錄制數(shù)據(jù)
首先打開(kāi)profiler,以DevEco Studio 4.0.0.400版本為例,可以通過(guò)如下三種方式打開(kāi)Profiler:
- 在DevEco Studio頂部菜單欄中選擇“View -> Tool Windows -> Profiler”。
 - 在DevEco Studio底部工具欄中單擊“Profiler”。
 - 按“Double Shift”或者“Crtl+Shift+A”打開(kāi)搜索功能,搜索“Profiler”。
 
創(chuàng)建Launch任務(wù)并啟動(dòng)錄制。

- 打開(kāi)Profiler性能分析器。
 - 選擇待分析的設(shè)備與應(yīng)用進(jìn)程。
 - 選擇Launch工具。
 - 點(diǎn)擊create Session按鈕創(chuàng)建啟動(dòng)分析任務(wù)。
 - 準(zhǔn)備好調(diào)試環(huán)境后,點(diǎn)擊開(kāi)始錄制啟動(dòng)數(shù)據(jù),再次點(diǎn)擊結(jié)束錄制。
 
說(shuō)明:
針對(duì)調(diào)測(cè)應(yīng)用的當(dāng)前運(yùn)行情況,Profiler對(duì)其做如下處理:
- 如選擇的是已安裝但未啟動(dòng)的應(yīng)用,在啟動(dòng)該分析任務(wù)時(shí),會(huì)自動(dòng)拉起應(yīng)用,進(jìn)行數(shù)據(jù)錄制,結(jié)束錄制后可正常進(jìn)入解析階段。
 - 如選擇的是正在運(yùn)行的應(yīng)用,在啟動(dòng)該分析任務(wù)時(shí),會(huì)先將應(yīng)用關(guān)停,再自動(dòng)拉起應(yīng)用,進(jìn)行數(shù)據(jù)錄制,結(jié)束錄制后可正常進(jìn)入解析階段。
 
在任務(wù)錄制(recording)及分析(analyzing)的過(guò)程中,請(qǐng)不要主動(dòng)斷開(kāi)應(yīng)用或者設(shè)備,否則可能導(dǎo)致分析任務(wù)異常失敗。
如何使用Launch Profiler分析數(shù)據(jù)
“Launch”泳道顯示啟動(dòng)生命周期各階段的耗時(shí)分布情況,如下圖:

- Process Creating:進(jìn)程創(chuàng)建階段。該階段主要是AppSpawn fork子進(jìn)程,AMS創(chuàng)建ability。
 - Application Launching:應(yīng)用程序啟動(dòng)階段。該階段主要是資源加載、Application相關(guān)對(duì)象的創(chuàng)建與初始化、依賴(lài)模塊的加載等。
 - UI Ability Launching:UIAbiity啟動(dòng)階段。該階段主要是資源加載、Ability相關(guān)對(duì)象的創(chuàng)建與初始化、依賴(lài)模塊的加載等。
 - UI Ability OnForeground:UIAbility置為前臺(tái)階段。該階段主要是加載應(yīng)用首頁(yè)的源碼和so以及創(chuàng)建應(yīng)用首頁(yè)內(nèi)各個(gè)組件。
 - First Frame - App Phase:應(yīng)用側(cè)首幀。在FlushTask中把之前加載的組件上樹(shù)并布局。
 - First Frame - Render Phase:渲染側(cè)首幀。render_service接受下一幀應(yīng)用來(lái)的首頁(yè)布局信息,并繪制渲染
 - EntryAbility:渲染完成,首頁(yè)顯示。
 
展開(kāi)“Launch”泳道還包含多個(gè)與進(jìn)程啟動(dòng)有關(guān)聯(lián)的子泳道:
- “Static Initialization”子泳道:展示啟動(dòng)過(guò)程中各靜態(tài)資源庫(kù)的加載耗時(shí)。
 - “Running CPU Cores”子泳道:展示啟動(dòng)過(guò)程中的主線程具體運(yùn)行在哪個(gè)CPU核心。
 - “l(fā)e.startup_demo”子泳道:展示啟動(dòng)過(guò)程的主線程的狀態(tài)和Trace數(shù)據(jù)。
 
針對(duì)應(yīng)用冷啟動(dòng)問(wèn)題的性能分析,有以下兩種方式可以選擇,一種是分析主線程的Trace數(shù)據(jù),另一種則是分析采樣得到的函數(shù)熱點(diǎn)。
分析主線程的Trace數(shù)據(jù)
從“Launch”泳道可以很明顯的看出UI Ability OnForeground階段的耗時(shí)占據(jù)應(yīng)用冷啟動(dòng)過(guò)程的大部分時(shí)間,如下圖:

- 單擊“Launch”泳道上的UI Ability OnForeground階段,在下方的“Details”詳情面板中,可查看到所選階段的耗時(shí)統(tǒng)計(jì)情況。
 - 展開(kāi)UI Ability OnForeground統(tǒng)計(jì)信息折疊表,可以看到各函數(shù)的具體耗時(shí)信息。
 - 根據(jù)Duration找到耗時(shí)最長(zhǎng)的函數(shù)aboutToAppear。
 - 單擊。
 
按鈕,可直接跳轉(zhuǎn)至主線程的打點(diǎn)任務(wù)中,查看相關(guān)Trace數(shù)據(jù),如下圖

可以發(fā)現(xiàn)aboutToAppear函數(shù)的耗時(shí)占據(jù)UI Ability OnForeground階段的大部分時(shí)間,結(jié)合應(yīng)用代碼將aboutToAppear函數(shù)中的耗時(shí)計(jì)算任務(wù)以異步延遲的方式處理后,可以得到如下“Launch”泳道。

上述對(duì)比可以發(fā)現(xiàn)將耗時(shí)的計(jì)算任務(wù)以異步延遲的方式處理后可以顯著縮短UI Ability OnForeground階段的耗時(shí),提升應(yīng)用的冷啟動(dòng)速度。
分析采樣得到的函數(shù)熱點(diǎn)
我們也可以分析采樣得到的函數(shù)熱點(diǎn)直觀的顯示應(yīng)用冷啟動(dòng)過(guò)程中具體函數(shù)的耗時(shí),如下圖:

- 單擊“Launch”泳道上的UI Ability OnForeground階段。
 - 選擇“ArkTS Callstack”泳道,其會(huì)基于時(shí)間軸展示CPU使用率和狀態(tài)的變化,以及當(dāng)前調(diào)用棧名稱(chēng)和調(diào)用類(lèi)型。
 - 下方“Details”詳情面板中查看到這段時(shí)間內(nèi)的函數(shù)熱點(diǎn),其會(huì)以Top-Down形式的樹(shù)狀列表進(jìn)行展示。很明顯aboutToAppear函數(shù)中的computeTask函數(shù)耗時(shí)最多,占整個(gè)階段的81%。
 
此外,點(diǎn)擊Flame Chart按鈕打開(kāi)火焰圖可以更直觀的看出熱點(diǎn)函數(shù)的耗時(shí)情況,如下圖:

根據(jù)上述步驟,使用異步延遲處理后的函數(shù)熱點(diǎn)如下,可以發(fā)現(xiàn)aboutToAppear函數(shù)的執(zhí)行耗時(shí)只占整個(gè)UI Ability OnForeground階段的5.8%。

上述方法開(kāi)發(fā)者可以選擇自己習(xí)慣的方式去查看。一般來(lái)說(shuō),如果所選的時(shí)間段里,函數(shù)棧比較復(fù)雜的話,用火焰圖找熱點(diǎn)會(huì)更高效。當(dāng)鎖定到某個(gè)熱點(diǎn)函數(shù)之后,只需要雙擊函數(shù)結(jié)點(diǎn),Profiler工具就會(huì)為您自動(dòng)打開(kāi)對(duì)應(yīng)的源文件,并聚焦到相應(yīng)代碼行。上述前提是這個(gè)源文件須是屬于當(dāng)前工程,并且是在DevEco Studio內(nèi)完成編譯的。
在使用Launch Profiler工具獲取啟動(dòng)各階段的耗時(shí)信息時(shí),需要應(yīng)用結(jié)合實(shí)際開(kāi)發(fā)需要修改。無(wú)特殊情況下,應(yīng)該避免在應(yīng)用啟動(dòng)的生命周期函數(shù)內(nèi)執(zhí)行耗時(shí)操作,若需要可以使用異步延遲處理或者拋到其他線程處理。
提示
Profiler為L(zhǎng)aunch分析數(shù)據(jù)提供了全局搜索能力。單擊分析窗口左上角的,根據(jù)界面提示信息輸入需要搜索的項(xiàng)目,可獲取到相關(guān)內(nèi)容的定位,使用搜索框的<、>按鍵可依次顯示返回結(jié)果的詳細(xì)內(nèi)容。
在任務(wù)分析窗口,可以通過(guò)“Ctrl+鼠標(biāo)滾輪”縮放時(shí)間軸,通過(guò)“Shift+鼠標(biāo)滾輪”左右移動(dòng)時(shí)間軸。















 
 
 











 
 
 
 