亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

性能分析工具Systrace的使用及說明

 更新時間:2023年03月03日 10:40:54   作者:卜大爺  
這篇文章主要介紹了性能分析工具Systrace的使用及說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

Systrace介紹

Systrace 是Android平臺提供的一款工具,用于記錄短期內(nèi)的設(shè)備活動。該工具會生成一份報告,其中匯總了Android內(nèi)核中的數(shù)據(jù),例如CPU調(diào)度程序、磁盤活動和應(yīng)用線程。

這份報告可幫助我們了解如何以最佳方式改善應(yīng)用或游戲的性能。

Systrace 工具用于顯示整個設(shè)備在做些什么,不過也可用于識別應(yīng)用中的卡頓。Systrace 的系統(tǒng)開銷非常小,因此你可以在插樁測試期間體驗實際卡頓情況。

Systrace報告示例:

這份報告提供了 Android 設(shè)備在給定時間段內(nèi)的系統(tǒng)進程的總體情況,還會檢查所捕獲的跟蹤信息,以突出顯示它所觀察到的問題(例如界面卡頓或耗電量高)。

Systrace使用方法詳解

要想使用Systrace分析性能,我們首先需要找到Systrace工具,以及使用該工具生成一份.html的報告文件。

使用命令行捕獲Systreace報告文件

systrace命令

systrace命令會調(diào)用Systrace工具,以收集和檢查設(shè)備上在系統(tǒng)一級運行的所有進程的時間信息。

systrace命令是一個Python腳本,所以需要進行如下準(zhǔn)備:

  • Android Studio下載并安裝最新的Android SDK Tools。
  • 安裝Python并將其添加到工作站的執(zhí)行路徑中(注意,這里要求Python2.7版本)。
  • 使用USB調(diào)試連接將搭載Android 4.3(API 級別 18)或更高版本的設(shè)備連接到開發(fā)系統(tǒng)。

systrace 命令在 Android SDK Tools 工具包中提供,位于 android-sdk/platform-tools/systrace/。

例如,作者電腦上sstrace位置為:/Users/apple/Library/Android/sdk/platform-tools/systrace。

命令語法

要為應(yīng)用生成HTML報告,我們需要使用以下語法從命令行運行systrace:

python systrace.py [options] [categories]

命令和命令選項

示例1:

python ./systrace.py -t 5 -o mynewtrace.html
  • mynewtrace.html是最終的生成產(chǎn)物。
  • 5代表捕獲5s的數(shù)據(jù)。

示例2:

python systrace.py -o mynewtrace.html sched freq idle am wm gfx view \
        binder_driver hal dalvik camera input res

mynewtrace.html之后的參數(shù),表示類別列表。

提示:如果要在跟蹤輸出中查看任務(wù)名稱,必須在命令參數(shù)中添加 sched 類別。

查看已連接設(shè)備支持的類別列表

命令如下:

python systrace.py --list-categories

示例:

打開System報告

通過以上操作,會生成一個HTML文件,我們可以使用chrome瀏覽器,地址欄輸入chrome://tracing/ 來查看報告。

界面如下(點擊Load按鈕加載HTML文件即可):

查看報告元素

Systrace 會生成包含多個部分的輸出 HTML 文件。該報告列出了每個進程的線程。如果給定線程會渲染界面幀,該報告還會沿時間軸指明所渲染的幀。當(dāng)您在報告中從左向右移動時,時間會向前推移。

報告從上到下包含以下幾個部分。

用戶互動

第一部分包含表示應(yīng)用或游戲中的具體用戶互動(例如點按設(shè)備屏幕)的條形圖。這些互動可用作有用的時間標(biāo)記。

CPU 活動

下一部分顯示了表示每個 CPU 中的線程活動的條形圖。這些條形會顯示所有應(yīng)用(包括你的應(yīng)用或游戲)中的 CPU 活動。

CPU 活動部分可以展開,展開后您就可以查看每個 CPU 的時鐘頻率。

圖 1 展示了一個收起后的 CPU 活動部分示例,圖 2 展示了顯示時鐘頻率的展開后版本:

系統(tǒng)事件

此部分中的直方圖會顯示特定的系統(tǒng)級事件,例如特定對象的紋理計數(shù)和總大小。

值得仔細檢查的直方圖是標(biāo)記為 SurfaceView 的直方圖。計數(shù)表示已傳遞到顯示管道并等待顯示在設(shè)備屏幕上的組合幀緩沖區(qū)的數(shù)量。由于大多數(shù)設(shè)備都會進行雙重或三重緩沖,因此該計數(shù)幾乎總為 0、1 或 2。

描繪 Surface Flinger 進程(包括 VSync 事件和界面線程交換工作)的其他直方圖,如圖所示:

顯示幀

描繪了一條多色線條,后面是成堆的條形。這些形狀表示已創(chuàng)建的特定線程的狀態(tài)和幀堆棧。

堆棧的每個層級代表對 beginSection() 的一次調(diào)用,或您為應(yīng)用或游戲定義的自定義跟蹤事件的開頭。

每個條形堆上方的多色線條表示特定線程隨時間變化的一組狀態(tài)。每段線條可以包含以下顏色之一:

  • 綠色:正在運行
  • 線程正在完成與某個進程相關(guān)的工作或正在響應(yīng)中斷。
  • 藍色:可運行
  • 線程可以運行但目前未進行調(diào)度。
  • 白色:休眠
  • 線程沒有可執(zhí)行的任務(wù),可能是因為線程在遇到斥鎖定時被阻止。
  • 橙色:不可中斷的休眠
  • 線程在遇到 I/O 操作時被阻止或正在等待磁盤操作完成。
  • 紫色:可中斷的休眠
  • 線程在遇到另一項內(nèi)核操作(通常是內(nèi)存管理)時被阻止。

注意:在Systrace報告中,你可以點擊該線條以確定該線程在給定時間由哪個CPU控制。

鍵盤快捷鍵

下表列出了查看 Systrace 報告時可以使用的鍵盤快捷鍵:

使用工具幫助定位性能問題

瀏覽 Systrace 報告時,您可以通過執(zhí)行以下一項或多項操作來更輕松地識別性能問題:

  • 通過在時間間隔周圍繪制一個矩形來選擇所需的時間間隔。
  • 使用標(biāo)尺工具標(biāo)記或突出顯示問題區(qū)域。
  • 依次點擊 View Options > Highlight VSync,以顯示每項顯示屏刷新操作。
  • 如果覺得頁面中的信息太多了,想要篩選,可以點擊Processes菜單,在彈出列表中進行篩選。

檢查界面幀和提醒

如圖所示,Systrace 報告列出了渲染界面幀的每個進程,并指明了沿時間軸渲染的每個幀。在 16.6 毫秒內(nèi)渲染的必須保持每秒 60 幀穩(wěn)定幀速率的幀會以綠色圓圈表示。渲染時間超過 16.6 毫秒的幀會以黃色或紅色幀圓圈表示。

點擊某個幀圓圈可將其突出顯示,并提供有關(guān)系統(tǒng)為渲染該幀所做工作的其他信息,包括提醒。此報告還會顯示系統(tǒng)在渲染該幀時執(zhí)行的方法。您可以調(diào)查這些方法以確定界面卡頓的可能原因。

如果所示,選擇有問題的幀后,跟蹤報告下方會顯示一條提醒,用于指明問題所在。

選擇運行速度慢的幀后,您可能會在報告的底部窗格中看到一條提醒。

點擊窗口最右側(cè)的Alerts標(biāo)簽頁可以查看此工具在你的跟蹤記錄中發(fā)現(xiàn)的每條提醒以及設(shè)備觸發(fā)每條提醒的次數(shù),如下圖所示。Alerts 面板可幫助你了解跟蹤記錄中出現(xiàn)的問題以及這些問題導(dǎo)致出現(xiàn)卡頓的頻率。我們也可以將此面板視為要修正的錯誤列表。通常情況下,只需對一個區(qū)域進行細微改動或改進即可移除整組提醒。

Systrace的擴展使用

Systrace(系統(tǒng)跟蹤)僅在系統(tǒng)級別顯示進程的相關(guān)信息,這樣導(dǎo)致有時很難知道APP的哪些方法是在給定時間針對系統(tǒng)事件執(zhí)行的。

例如,我們在解決卡頓問題,當(dāng)查看系統(tǒng)跟蹤信息輸出后,你可能會懷疑應(yīng)用中的某些方法是導(dǎo)致卡頓的因素。例如,如果時間軸顯示某個幀的呈現(xiàn)速度較慢是因為 RecyclerView 花費很長時間導(dǎo)致的,這時我們需要更多的信息來進行判斷。

如何做呢?

我們可以在相關(guān)代碼中添加跟蹤標(biāo)記(定義自定義事件),然后重新運行 systrace 以獲取更多信息。在新的系統(tǒng)跟蹤信息中,時間軸會顯示應(yīng)用中的方法的調(diào)用時間和執(zhí)行時長。

定義自定義事件

Android 平臺提供了一個跟蹤 API,可用于為特定的代碼段添加標(biāo)簽。如果您捕獲應(yīng)用的“調(diào)試”版本的新系統(tǒng)跟蹤并添加 -a 選項(如以下代碼段所示),這些自定義事件便會顯示在 Systrace 報告中:

    python systrace.py -a com.example.myapp -b 16384 \
      -o my_systrace_report.html sched freq idle am wm gfx view binder_driver hal \
      dalvik camera input res

必須提供 -a 選項才能跟蹤應(yīng)用;如果沒有此選項,應(yīng)用的方法將不會顯示在 Systrace 報告中。

注意:該方法與使用 Debug 類不同,后者可幫助您通過生成 .trace 文件來檢查應(yīng)用 CPU 的詳細使用情況。

代碼中添加

在 Android 4.3(API 級別 18)及更高版本中,我們可以在代碼中使用 Trace 類來定義隨后會出現(xiàn)在 Perfetto 和 Systrace 報告中的自定義事件,如以下代碼段所示。

    public class MyAdapter extends RecyclerView.Adapter<MyViewHolder> {
        @Override
        public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            Trace.beginSection("MyAdapter.onCreateViewHolder");
            MyViewHolder myViewHolder;
            try {
                myViewHolder = MyViewHolder.newInstance(parent);
            } finally {
                // In try and catch statements, always call "endSection()" in a
                // "finally" block. That way, the method is invoked even when an
                // exception occurs.
                Trace.endSection();
            }
            return myViewHolder;
        }

       @Override
        public void onBindViewHolder(MyViewHolder holder, int position) {
            Trace.beginSection("MyAdapter.onBindViewHolder");
            try {
                try {
                    Trace.beginSection("MyAdapter.queryDatabase");
                    RowItem rowItem = queryDatabase(position);
                    dataset.add(rowItem);
                } finally {
                    Trace.endSection();
                }
                holder.bind(dataset.get(position));
            } finally {
                Trace.endSection();
            }
        }
    }
    

注意:如果多次調(diào)用 beginSection(),調(diào)用 endSection() 只會結(jié)束最后調(diào)用的 beginSection() 方法。因此,對于嵌套調(diào)用(如以下代碼段中所示),請務(wù)必將每次對 beginSection() 的調(diào)用與一次對 endSection() 的調(diào)用正確匹配。

此外,我們不能在一個線程上調(diào)用 beginSection(),而在另一個線程上結(jié)束它;而是必須在同一個線程上調(diào)用這兩個方法。

總結(jié)

通過本文學(xué)習(xí)了:

  • 性能分析工具Systrace的介紹。
  • Systrace報告文件如何進行采集。
  • 如何使用工具來查看Systrace報告文件。
  • 如何使用Systrace來分析性能問題。
  • Systrace工具的使用及使用技巧。
  • 如何添加和使用自定義事件。

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 一起動手編寫Android圖片加載框架

    一起動手編寫Android圖片加載框架

    這篇文章主要和大家一起動手編寫Android圖片加載框架,從內(nèi)部原理到具體實現(xiàn)來詳細介紹如何開發(fā)一個簡潔而實用的Android圖片加載緩存框架,感興趣的小伙伴們可以參考一下
    2016-04-04
  • Android學(xué)習(xí)筆記之ListView復(fù)用機制詳解

    Android學(xué)習(xí)筆記之ListView復(fù)用機制詳解

    本篇文章主要介紹了Android學(xué)習(xí)筆記之ListView復(fù)用機制詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-02-02
  • Android自定義View實現(xiàn)數(shù)字密碼鎖

    Android自定義View實現(xiàn)數(shù)字密碼鎖

    這篇文章主要為大家詳細介紹了Android自定義View實現(xiàn)數(shù)字密碼鎖,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • flutter布局約束原理深入解析

    flutter布局約束原理深入解析

    這篇文章主要為大家介紹了flutter布局約束原理深入解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-01-01
  • Android權(quán)限詢問的實例詳解

    Android權(quán)限詢問的實例詳解

    這篇文章主要介紹了Android權(quán)限詢問,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-09-09
  • Android RecyclerView加載兩種布局的方法

    Android RecyclerView加載兩種布局的方法

    這篇文章主要為大家詳細介紹了Android RecyclerView加載兩種布局的方法,Adapter加載多套布局,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-02-02
  • sweet alert dialog 在android studio應(yīng)用問題說明詳解

    sweet alert dialog 在android studio應(yīng)用問題說明詳解

    這篇文章主要介紹了sweet alert dialog 在android studio應(yīng)用問題說明詳解的相關(guān)資料,本文圖文并茂介紹的非常詳細,具有參考借鑒價值,需要的朋友可以參考下
    2016-09-09
  • 關(guān)于Android Studio封裝SDK的那些事兒

    關(guān)于Android Studio封裝SDK的那些事兒

    這篇文章主要給大家介紹了關(guān)于Android Studio封裝SDK的那些事兒,文中通過圖文以及示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-09-09
  • Android圖像處理之繪制圓形、三角形及扇形的頭像

    Android圖像處理之繪制圓形、三角形及扇形的頭像

    這篇文章主要給大家介紹了Android圖像處理之繪制圓形、三角形及扇形頭像的相關(guān)資料,文中給出了詳細的代碼示例,通過學(xué)會了文中的方法,就不局限于圓形頭像了,剛興趣的朋友們下面跟著小編一起來學(xué)習(xí)學(xué)習(xí)吧。
    2017-04-04
  • Android布局之TableLayout表格布局

    Android布局之TableLayout表格布局

    Tablelayout類以行和列的形式對控件進行管理,每一行為一個TableRow對象,或一個View控件。當(dāng)為TableRow對象時,可在TableRow下添加子控件,默認(rèn)情況下,每個子控件占據(jù)一列。 當(dāng)為View時,該View將獨占一行
    2015-12-12

最新評論