linux内核-如何在安卓系统的systrace/atrace中使用async_start和async_stop



我想在进行自动测试时在我的Android手机上捕获Systrace报告。不知道测试需要多长时间,所以我不能指定Systrace的--time周期。

深入挖掘systrace.py,我发现systemrace正在使用atrace来获取内核日志。

我使用了adb shell atrace --help,得到了以下输出:

usage: atrace [options] [categories...]
options include:
  -a appname      enable app-level tracing for a comma separated list of cmdlines
  -b N            use a trace buffer size of N KB
  -c              trace into a circular buffer
  -k fname,...    trace the listed kernel functions
  -n              ignore signals
  -s N            sleep for N seconds before tracing [default 0]
  -t N            trace for N seconds [defualt 5]
  -z              compress the trace dump
  --async_start   start circular trace and return immediatly
  --async_dump    dump the current contents of circular trace buffer
  --async_stop    stop tracing and dump the current contents of circular
                    trace buffer
  --list_categories
                  list the available tracing categories

如何使用atrace在自动测试开始时开始跟踪,并在自动测试结束时停止跟踪和转储内核日志?

我尝试使用以下命令,但我认为它不能正常工作。只有async_dump在日志中提供了一些数据。async_stop转储在日志中没有任何内容。如何正确启动跟踪,转储它,然后停止它?

adb shell atrace -b 10000 -c am shedgfx view --async_start > C:Usersuser1Desktoplog.txt 
adb shell atrace -b 10000 -c am shedgfx view --async_dump  > C:Usersuser1Desktoplog.txt 
adb shell atrace -b 10000 -c am shedgfx view --async_stop > C:Usersuser1Desktoplog.txt 
  1. schedgfx可能是两个独立的调用:schedgfx。运行时查看设备的输出:

    $ adb shell atrace --list_categories

  2. 类别应该是命令行的最后部分(在您的命令中,类别位于async_*选项之前(:

    $ adb shell atrace --help usage: atrace [options] [categories...] options include: -a appname enable app-level tracing for a comma separated list of cmdlines -b N use a trace buffer size of N KB -c trace into a circular buffer -k fname,... trace the listed kernel functions -n ignore signals -s N sleep for N seconds before tracing [default 0] -t N trace for N seconds [defualt 5] -z compress the trace dump --async_start start circular trace and return immediatly --async_dump dump the current contents of circular trace buffer --async_stop stop tracing and dump the current contents of circular trace buffer --list_categories list the available tracing categories

  3. 该工具在循环缓冲区上运行,因此每次运行dump命令时,您只能获得缓冲区中的任何内容。在Espresso rules:0.5软件包中(假设您使用的是Espresso(,有一个AtraceLogger类可以通过调用atraceStart(...)方法来帮助您将其自动化,作为测试工具的一部分:

    public void atraceStart(Set<String> traceCategoriesSet, int atraceBufferSize, int dumpIntervalSecs, File destDirectory, String traceFileName) throws IOException

    您可以通过创建@Rule或@ClassRule来实现这一点,也可以通过其他方式连接到它,例如使用TestRunner:

    @Override
    protected void before() throws Throwable {
        mAtrace = AtraceLogger.getAtraceLoggerInstance(InstrumentationRegistry.getInstrumentation());
        mAtrace.atraceStart(new HashSet<>(Arrays.asList("gfx", "sched", ...)),
                1024 /* bufferSize */, 1 /* dump interval */,
                RuleLoggingUtils.getTestRunDir(), "filename");
    }
    @Override
    protected void after() {
        try {
            mAtrace.atraceStop();
        } catch (IOException e) {
            Log.w(TAG, "Failed to stop Atrace", e);
        } catch (InterruptedException e) {
            Log.w(TAG, "Failed to stop Atrace", e);
        }
    }
    

    RuleLoggingUtils.getTestRunDir()方法将捕获的转储文件放入应用程序的外部文件路径中,因此您可以在测试完成后使用提取这些文件

    $ adb pull /sdcard/Android/data/com.yourcompany.package/files/testdata/

然后,通过使用带有--from-file=<trace file>选项的systrace,可以使用systrace查看器检查每个atrace文件。

相关内容

  • 没有找到相关文章

最新更新