如何在Android

时间:2015-07-02 18:33:11

标签: android linux-kernel tracing systrace ftrace

我想在进行自动化测试时在Android手机上捕获Systrace报告。不知道测试需要多长时间,因此我无法为Systrace指定 - time 期间。

深入研究 systrace.py ,我发现 systrace 正在使用 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:\Users\user1\Desktop\log.txt 

adb shell atrace -b 10000 -c am shedgfx view --async_dump  > C:\Users\user1\Desktop\log.txt 

adb shell atrace -b 10000 -c am shedgfx view --async_stop > C:\Users\user1\Desktop\log.txt 

1 个答案:

答案 0 :(得分:0)

  1. sched应该是两个单独的来电:gfx$ adb shell atrace --list_categories。运行时请查看设备的输出:

    async_*

  2. 类别应该是命令行的 last 部分(在命令中,类别放在$ 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 选项之前):

    rules:0.5

  3. 该工具在循环缓冲区上运行,因此每次运行dump命令时,您将只获得当时缓冲区中的任何内容。在Espresso AtraceLogger包中(假设您使用的是Espresso),有一个atraceStart(...)类可以通过调用public void atraceStart(Set<String> traceCategoriesSet, int atraceBufferSize, int dumpIntervalSecs, File destDirectory, String traceFileName) throws IOException 方法帮助您自动执行此操作作为测试工具的一部分:

    @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); } }

    您可以通过创建@Rule或@ClassRule来实现,或者通过其他方式挂钩,例如使用TestRunner:

    RuleLoggingUtils.getTestRunDir()

    $ adb pull /sdcard/Android/data/com.yourcompany.package/files/testdata/方法会将捕获的转储文件放入应用程序的外部文件路径中,因此您可以在测试完成后使用以下方法提取这些文件:

    --from-file=<trace file>

  4. 然后,通过使用{{1}}选项运行systrace,可以使用systrace查看器检查每个atrace文件。