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


一般用systrace分析問題,我們直接查看關注的流程即可。

有時logcat提供了重要的信息,但這些信息沒有用systrace log輸出。

如果我們能將systrace時間與手機時間對應起來,就不用添加systrace log重新編譯手機ROM了。

----------------------------------------------------------------------------------

這篇文章的小目標:

1. 計算systrace時間與手機時間的對應關系

2. 在自己的代碼中添加systrace log

---------------------------------------------------

 

這里存在三個時間戳,

1)systrace時間軸上的時間,時間軸從0開始算起,以毫秒為單位

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM