使用背景:随着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加载文件即可。

大家可以查看此博客,里面详细告诉大家了各种图标各种显示的意义和作用。

摘抄如下:

在进程的上面有一条很细的进度条,包含了该线程的状态:

灰色: 睡眠。
蓝色: 可以运行(它可以运行,但还未被调度运行)。
绿色: 正在运行(调度程序认为它正在运行)。

红色: 不间断的睡眠(通常发生在内核锁上), 指出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版本有可能会将对应的功能宏关掉。建议用userdebug或者eng版本来验证问题。

adb 中也是带有trace功能的比如可以使用如下命令:

adb shell atrace > trace.txt

然后使用catapult 里面的工具将trace文件转为html文件

cd ~/workspace/catapult/tracing/bin
 
./trace2html ~/workspace/trace.txt

 

Android Studio的Monitor.bat中有个工具Method tracing很实用,我们可以通过它查看函数调用栈,时长,从而得知系统卡顿的地方在哪儿!

Android str不一致 studio android studio systrace_ci

第一次使用,先mark一下。https://www.jianshu.com/p/96a16b5f1e9d