Как использовать async_start и async_stop в systrace/atrace для Android

Я хочу получить отчет Systrace на своем телефоне Android во время автоматического тестирования. Неизвестно, сколько времени займет тестирование, поэтому я не могу указать период --time для Systrace.

Углубившись в 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 

person Zythyr    schedule 02.07.2015    source источник


Ответы (1)


  1. schedgfx, вероятно, должно быть 2 отдельных вызова: sched и gfx. Посмотрите вывод с вашего устройства при запуске:

    $ 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. Инструмент работает с кольцевым буфером, поэтому каждый раз, когда вы запускаете команду дампа, вы получаете только то содержимое, которое в данный момент находится в буфере. В пакете 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/

Затем каждый файл atrace можно просмотреть с помощью средства просмотра systrace, запустив systrace с параметром --from-file=<trace file>.

person Joe    schedule 12.05.2016