[Android systrace系列] systrace時間戳與手機時間的對應關係

通常用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

相關文章
相關標籤/搜索