Android Systrace使用

使用背景:隨着Android開發的深入,必須要考慮性能問題,而原始的通過logcat是無法通過log來查看定位或者錨定性能問題的關鍵點在哪裏。例如由於某個view 在調用過程中,多次meatrue layout造成卡頓。由於線程太多,造成前臺線程調度睡眠時間過長,造成用戶體驗慢,系統運行卡,等等。所以有必要使用新的log查看分析工具——systrace。

我使用的是通過Android Studio下載後的SDK tools工具中的monitor.bat 路徑爲:sdk/tools/monitor.bat

在dos窗口下打開後會出現如下界面:

點擊此圖標,會出現trace設置界面,可以選擇具體的某個app來抓trace,最終會產生trace.html文件

注意設置時間和文件大小。然後就可以抓取trace了。在成功後會在你設置的目錄下形成trace.html文件

我們需要用Chrome瀏覽器打開它,在此很多朋友都發現打開此文件顯示爲空白,原來需要這樣打開:

在瀏覽器輸入框輸入:chrome://tracing/

然後點擊Load加載文件即可。

大家可以查看此博客https://www.cnblogs.com/1996swg/archive/2018/11/23/10007602.html,裏面詳細告訴大家了各種圖標各種顯示的意義和作用。

摘抄如下:

在進程的上面有一條很細的進度條,包含了該線程的狀態:

灰色: 睡眠。
藍色: 可以運行(它可以運行,但還未被調度運行)。
綠色: 正在運行(調度程序認爲它正在運行)。

紅色: 不間斷的睡眠(通常發生在內核鎖上), 指出I / O負載,對於性能問題的調試非常有用
橙色: 由於I / O負載導致的不間斷睡眠。
要查看不間斷睡眠的原因(可從sched_blocked_reason跟蹤點獲取),請選擇紅色不間斷睡眠切片。

這裏面需要大家多用,多測多分析。才能熟練使用該工具,才能體會到此工具的作用。

在弄清楚如何使用和初步能分析trace.html文件後,我們可以試着寫一個帶Trace功能的demo,編譯後刷機,抓trace來分析,我選擇的是DreamCamera2的幾個簡單的調用。

git diff vendor/sprd/platform/packages/apps/DreamCamera2/src/com/android/camera/CameraActivity.java

+++ b/vendor/sprd/platform/packages/apps/DreamCamera2/src/com/android/camera/CameraActivity.java
@@ -213,6 +213,7 @@ import java.io.FileReader;
 import java.io.IOException;
 import java.util.List;
 
+import android.os.Trace;
 
 public class CameraActivity extends QuickActivity implements AppController,
         CameraAgent.CameraOpenCallback, ResetListener,
@@ -810,6 +811,7 @@ public class CameraActivity extends QuickActivity implements AppController,
 
     @Override
     public void onPreviewStarted() {
+        Trace.beginSection("DreamCamera2#onPreview");
         if (CameraUtil.isIdleSleepEnable()) {
             mLastReceiveEventTime = System.currentTimeMillis();
             mMainHandler.removeMessages(MSG_DESTORY_CAMER);
@@ -825,6 +827,7 @@ public class CameraActivity extends QuickActivity implements AppController,
         }
         if(mCurrentModule.getModuleTpye() != DreamModule.AUDIOPICTURE_MODULE||!mCurrentModule.isShutterClicked())
         getCameraAppUI().setBottomPanelLeftRightClickable(true);
+        Trace.endSection();
         /* @} */
     }
 
@@ -1687,6 +1690,7 @@ public class CameraActivity extends QuickActivity implements AppController,
     };
     @Override
     public void onCreateTasks(Bundle state) {
+        Trace.beginSection("DreamCamera2#onCreate");
         if (isInMultiWindowMode()) {
 
             CameraUtil.toastHint(this, R.string.multi_window_tip);
@@ -1759,6 +1763,7 @@ public class CameraActivity extends QuickActivity implements AppController,
         // jyq@revo for covered custom light
         BRIGHT_LIGHT_TH = getResources().getInteger(R.integer.bright_light_th);
         COVERD_LIGHT_TH = getResources().getInteger(R.integer.coverd_light_th);
+        Trace.endSection();
     }
 
     private void preInit() {
@@ -2314,6 +2319,7 @@ public class CameraActivity extends QuickActivity implements AppController,
     public void onResumeTasks() {
 
         Log.i(TAG, "onResumeTasks start!");
+        Trace.beginSection("DreamCamera2#onstart");
 
         mPaused = false;
         // ModeCover may not be drawed when monkey test
@@ -2404,6 +2410,7 @@ public class CameraActivity extends QuickActivity implements AppController,
         }
         // End of Revo:xuyong@revoview
         Log.i(TAG, "onResume end!");
+        Trace.endSection();
     }

最後需要注意的一點是:打trace的軟件版本爲eng版本或者userdebug版本,正式的release版本是不帶此trace 的

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章