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版本有可能会将对应的功能宏关掉。建议用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很实用,我们可以通过它查看函数调用栈,时长,从而得知系统卡顿的地方在哪儿!

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值