我想在进行自动化测试时在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
答案 0 :(得分:0)
sched
应该是两个单独的来电:gfx
和$ adb shell atrace --list_categories
。运行时请查看设备的输出:
async_*
类别应该是命令行的 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
该工具在循环缓冲区上运行,因此每次运行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>
然后,通过使用{{1}}选项运行systrace,可以使用systrace查看器检查每个atrace文件。