Android Systrace使用
分类:
文章
•
2024-03-11 13:00:55
使用背景:随着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浏览器打开它,在此很多朋友都发现打开此文件显示为空白,原来需要这样打开:

然后点击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,
// [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 的