通常用systrace分析问题,咱们直接查看关注的流程便可。html
有时logcat提供了重要的信息,但这些信息没有用systrace log输出。python
若是咱们能将systrace时间与手机时间对应起来,就不用添加systrace log从新编译手机ROM了。android
----------------------------------------------------------------------------------app
这篇文章的小目标:ide
1. 计算systrace时间与手机时间的对应关系google
2. 在本身的代码中添加systrace logspa
---------------------------------------------------debug
这里存在三个时间戳,code
1)systrace时间轴上的时间,时间轴从0开始算起,以毫秒为单位htm
2)kernel 时间,记录kernel开始启动后流逝的时间,以秒为单位
3)系统时钟,显示当时几点钟,也就是system log的时间
要找到systrace时间与kernel时间的对应关系,很是简单,只须要以纯文本方式打开systrace的html文件,搜"TIMESTAMP FUNCTION",第一句log显示的kernel时间,就对应着systrace时间轴的起始时间。
咱们用一个真实的trace文件来算一下,下面是第一句log
<...>-8634 (-----) [001] ...1 944990.442341: tracing_mark_write: trace_event_clock_sync: parent_ts=80241.648438
这里的944990.442341是kernel log时间,同时也是systrace时间轴的起始时间。
咱们用下面截图,算出DrawFrame流程的开始时的kernel时间,因为单位不一样,这里systrace时间戳须要转换单位为秒。
咱们用纯文本打开trace文件看看是否是:
RenderThread-8555 ( 8508) [002] ...1 944997.124754: tracing_mark_write: B|8508|DrawFrame
这里的偏差是毫秒之内的,通常足够了。
咱们再来找kernel log时间与系统system log时间的对应关系。
每一个厂商或许都有各自的log对照,这里使用一个浅显的方法来对照。
思路是在app中以systrace log的方式,输出当前系统时间,再用systrace来看。
首先要介绍添加systrace log的方法,按照惯例,我引用官方文档:
https://developer.android.google.cn/studio/profile/systrace/custom-events?hl=zh-cn
这个文档,说明了在本身代码添加systrace log,测量耗时的方法。
看完如何加log的文档,言归正传,咱们在Hello world app上加上一个按钮,一点按钮就打systrace log,咱们这里用Time align做为关键字。
package nothing.example; import android.os.Bundle; import android.os.Trace; import android.view.View; import android.widget.Button; import androidx.appcompat.app.AppCompatActivity; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button TimeAlignButton = findViewById(R.id.TimeAlignButton); TimeAlignButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { long totalMilliSeconds = System.currentTimeMillis(); long totalSeconds = totalMilliSeconds / 1000; long currentSecond = totalSeconds % 60; long totalMinutes = totalSeconds / 60; long currentMinute = totalMinutes % 60; //中国时区是东八区,因此+8 long totalHour = totalMinutes / 60 + 8; long currentHour = totalHour % 24; long ms = totalMilliSeconds % 1000; Trace.beginSection("Time align " + currentHour + ":" + currentMinute + ":" + currentSecond + "." + ms); Trace.endSection(); } }); } }
接下来咱们抓取点击按钮操做的systrace,按照 [Android systrace系列] systrace入门第一式 的方法,把app输出的systrace log抓到。
须要留心的是,由于这里须要抓app的systrace log,因此须要userdebug版本的手机。
python systrace.py -o mynewtrace.html -a nothing.example
纯文本打开mynewtrace.html,搜索Time align,kernel时间1434.981241和系统时钟15:11:32.537就对上了。
nothing.exampl-7676 ( 7676) [000] ...1 1434.981241: tracing_mark_write: B|7676|Time align 15:11:32.537
小目标,完成。
转载请注明出处:https://www.cnblogs.com/zzcperf/p/14008147.html