Android Systrace使用

使用背景:随着Android开发的深入,必须要考虑性能问题,而原始的通过logcat是无法通过log来查看定位或者锚定性能问题的关键点在哪里。例如由于某个view 在调用过程中,多次meatrue layout造成卡顿。由于线程太多,造成前台线程调度睡眠时间过长,造成用户体验慢,系统运行卡,等等。所以有必要使用新的log查看分析工具——systrace。

我使用的是通过Android Studio下载后的SDK tools工具中的monitor.bat 路径为:sdk/tools/monitor.bat

在dos窗口下打开后会出现如下界面:

Android Systrace使用

Android Systrace使用

点击此图标,会出现trace设置界面,可以选择具体的某个app来抓trace,最终会产生trace.html文件

Android Systrace使用

注意设置时间和文件大小。然后就可以抓取trace了。在成功后会在你设置的目录下形成trace.html文件

我们需要用Chrome浏览器打开它,在此很多朋友都发现打开此文件显示为空白,原来需要这样打开:

在浏览器输入框输入:chrome://tracing/

Android Systrace使用

然后点击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,
         // [email protected] 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:[email protected]
         Log.i(TAG, "onResume end!");
+        Trace.endSection();
     }

最后需要注意的一点是:打trace的软件版本为eng版本或者userdebug版本,正式的release版本是不带此trace 的