效能優化工具知識梳理(2) Systrace

澤毛發表於2017-12-21

一、概述

SystaceAndroid推出的效能優化工具,通過這個工具我們可以在實時操作的情況下,獲得某段時間內當前系統各個程式的執行時情況,通過分析所生成的報表,我們可以定位出App卡頓的原因。下面,我們分以下兩部分介紹Systrace的相關知識:

  • 獲取分析報表
  • 分析

二、獲取分析報表

第一步,就是要獲取分析報表,這個報表其實就是一個html網頁的形式,需要用Chrome瀏覽器來開啟,我們可以通過下面幾種方法獲取:

2.1 魅族手機提供的獲取方式

  • 第一步:在Flyme6的手機上,進入**/設定/輔助功能/開發者選項/效能優化/效能日誌抓取**,可以設定是否開啟開關以及抓取的時間長度,設定完畢後按下音量下+電源鍵,這時候手機會震動一次,說明系統就開始在後臺進行跟蹤了。
  • 第二步:進入需要分析的應用,進行一系列的操作,在過了設定的時間之後,手機會再次震動一次。
  • 第三步:進入檔案管理器根目錄下的PerformanceLog資料夾,檢視距離當前時間最近的資料夾,我們可以看到裡面有兩個檔案,裡面就是我們上次抓取的結果,我們需要把它拷貝出來匯出到電腦上面:
    效能優化工具知識梳理(2)   Systrace
  • 第四步:上面得到的這兩個檔案並不能直接開啟,我們需要使用到Android SDK中提供的轉換指令碼轉換上圖當中的systrace檔案,systrace.py,如果安裝了Android SDK,那麼進入SDK目錄/platform-tools/systrace/,執行下面的命令:
python systrace.py -o <轉換後需要儲存到的檔案路徑> --from-file=<手機匯出的systrace檔案路徑> 
複製程式碼

例如,執行下面的語句,得到轉換後的分析報表mobile_systrace

效能優化工具知識梳理(2)   Systrace

2.2 直接採用指令碼抓取

上面2.1方法的優點是簡便,隨時隨地都可以抓取日誌,並且不要求手機有root許可權,而如果我們是在電腦前面除錯,那麼可以通過上面這個指令碼,執行更加細緻的配置,例如配置抓取的時間,抓取的範圍等等:

python systrace.py --time=<抓取時間長度> -o <轉換後所需要儲存到的檔案路徑> sched gfx view wm
複製程式碼

執行上面的命令後,然後去到要分析的介面進行操作,當到達指定的時間之後,就會在指定的目錄下生成*.html檔案,我們可以直接開啟python_systrace檔案,不需要進行轉換:

效能優化工具知識梳理(2)   Systrace

2.3 systrace.py可接受引數

systrace.py提供了很多可配置的引數,下面是官方文件中對於引數的說明,在使用2.2方式的時候,我們可以根據需要選取引數進行配置:

效能優化工具知識梳理(2)   Systrace
效能優化工具知識梳理(2)   Systrace

三、具體分析

3.1 分析動畫卡頓問題

我們使用下面這段程式碼,在動畫執行的過程中,同時進行IO操作,以模擬動畫卡頓的問題:

    private void startAnimator() {
        ValueAnimator valueAnimator = ValueAnimator.ofFloat(0, 1f);
        valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {

            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                mTv.setAlpha((float) animation.getAnimatedValue());
                writeSomething();
            }
        });
        valueAnimator.setDuration(1000);
        valueAnimator.start();
    }

    private void writeSomething() {
        OutputStream outputStream = null;
        try {
            outputStream = openFileOutput("systrace", MODE_APPEND);
            DataOutputStream dataOutputStream = new DataOutputStream(outputStream);
            for (int i = 0; i < 10000; i++) {
                dataOutputStream.write(10);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (outputStream != null) {
                    outputStream.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }

        }
    }
複製程式碼

之後,按照上面的方法匯出systrace檔案,找到我們應用包名所對應的程式,可以看到許多紅色F,這些就表明遇到了卡頓,如果正常時應當是綠色,如果出現了輕微卡頓,那麼為黃色,嚴重卡頓則為紅色:

效能優化工具知識梳理(2)   Systrace
而我們點選紅色的F,它會給出我們對應的建議:
效能優化工具知識梳理(2)   Systrace
我們也可以點選旁邊的alert選項,它會列出所有的問題點:
效能優化工具知識梳理(2)   Systrace


更多文章,歡迎訪問我的 Android 知識梳理系列:

相關文章