使用背景:随着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很实用,我们可以通过它查看函数调用栈,时长,从而得知系统卡顿的地方在哪儿!
第一次使用,先mark一下。https://www.jianshu.com/p/96a16b5f1e9d