我想在进行自动测试时在我的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
-
schedgfx
可能是两个独立的调用:sched
和gfx
。运行时查看设备的输出:$ adb shell atrace --list_categories
-
类别应该是命令行的最后部分(在您的命令中,类别位于
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
-
该工具在循环缓冲区上运行,因此每次运行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文件。