1page.title=Тестирование скорости отображения 2page.image=images/cards/card-test-performance_2x.png 3page.keywords=скорость отображения, кадр/с, инструменты 4 5@jd:body 6 7 8<div id="qv-wrapper"> 9 <div id="qv"> 10 <h2>Содержание документа</h2> 11 <ol> 12 <li><a href="#measure">Измерение производительности интерфейса</a> 13 <ul> 14 <li><a href="#aggregate">Агрегированные статические данные о кадрах</a></li> 15 <li><a href="#timing-info">Точная информация о кадровой синхронизации</a></li> 16 <li><a href="#timing-dump">Дамп простой кадровой синхронизации</a></li> 17 <li><a href="#collection-window">Управление промежутком времени для сбора статистических данных</a></li> 18 <li><a href="#diagnose">Диагностика снижения производительности</a></li> 19 <li><a href="#resources">Дополнительные ресурсы</a></li> 20 </ul> 21 </li> 22 <li><a href="#automate">Автоматизация тестирования производительности интерфейса</a> 23 <ul> 24 <li><a href="#ui-tests">Настройка тестов интерфейса</a></li> 25 <li><a href="#automated-tests">Настройка автоматизированного тестирования интерфейса</a></li> 26 <li><a href="#triage">Определение и устранение обнаруженных проблем</a></li> 27 </ul> 28 </li> 29 </ol> 30 </div> 31</div> 32 33 34<p> 35 Тестирование производительности интерфейса позволяет убедиться в том, что ваше приложение не только соответствует функциональным требованиям, 36но и гарантирует пользователю безупречное взаимодействие с интерфейсом с постоянной частотой отображения 3760 кадров в секунду (<a href="https://www.youtube.com/watch?v=CaMTIgxCSqU&index=25&list=PLWz5rJ2EKKc9CBxr3BVjPTPoDPLdPIFCE">почему именно 3860 кадров/с?</a>), без каких-либо задержек и пропущенных кадров или, как их называют, <em>глюков</em>. В этой 39статье рассматриваются инструменты для измерения производительности интерфейса, а также предлагается подход к 40интеграции этих процедур измерения производительности в ваши методы тестирования приложений. 41</p> 42 43 44<h2 id="measure">Измерение производительности интерфейса</h2> 45 46<p> 47 Чтобы улучшить производительность, прежде всего у вас должна иметься возможность измерить производительность 48вашей системы. Когда это сделано, необходимо диагностировать и определить проблемы, которые могут возникнуть на разных этапах 49процесса разработки. 50</p> 51 52<p> 53 <em><a href="https://source.android.com/devices/tech/debug/dumpsys.html">dumpsys</a></em> 54– это инструмент Android, который запускается на устройстве и создает дамп интересной информации о состоянии системных 55служб. После передачи в dumpsys команды <em>gfxinfo</em> в журнал устройства (logcat) 56записываются сведения о производительности, касающиеся скорости анимации на этапе 57записи. 58</p> 59 60<pre> 61> adb shell dumpsys gfxinfo <PACKAGE_NAME> 62</pre> 63 64<p> 65 Эта команда может создавать множество различных вариантов данных кадровой синхронизации. 66</p> 67 68<h3 id="aggregate">Агрегированные статические данные о кадрах</h3> 69 70<p> 71 В M Preview эта команда фиксирует в logcat агрегированный анализ данных о кадрах, полученных 72за весь жизненный цикл процесса. Например: 73</p> 74 75<pre class="noprettyprint"> 76Stats since: 752958278148ns 77Total frames rendered: 82189 78Janky frames: 35335 (42.99%) 7990th percentile: 34ms 8095th percentile: 42ms 8199th percentile: 69ms 82Number Missed Vsync: 4706 83Number High input latency: 142 84Number Slow UI thread: 17270 85Number Slow bitmap uploads: 1542 86Number Slow draw: 23342 87</pre> 88 89<p> 90 Приведенные выше статистические данные высокого уровня демонстрируют производительность отрисовки, которой обладает приложение, 91а также ее стабильность при обработке множества кадров. 92</p> 93 94 95<h3 id="timing-info">Точная информация о кадровой синхронизации</h3> 96 97<p> 98 В M Preview представлена новая команда для gfxinfo – <em>framestats</em>. Она позволяет получить 99чрезвычайно точную информацию о кадровой синхронизации из последних кадров, что поможет вам отслеживать проблемы 100и устранять их. 101</p> 102 103<pre> 104>adb shell dumpsys gfxinfo <PACKAGE_NAME> framestats 105</pre> 106 107<p> 108 Данная команда предоставляет информацию о кадровой синхронизации буквально по наносекундам на основании последних 120 109кадров, созданных приложением. Ниже приводится пример необработанного результата из журнала adb после выполнения команды dumpsys gfxinfo 110<PACKAGE_NAME> framestats: 111</p> 112 113<pre class="noprettyprint"> 1140,49762224585003,49762241251670,9223372036854775807,0,49762257627204,49762257646058,49762257969704,49762258002100,49762265541631,49762273951162,49762300914808,49762303675954, 1150,49762445152142,49762445152142,9223372036854775807,0,49762446678818,49762446705589,49762447268818,49762447388037,49762453551527,49762457134131,49762474889027,49762476150120, 1160,49762462118845,49762462118845,9223372036854775807,0,49762462595381,49762462619287,49762462919964,49762462968454,49762476194547,49762476483454,49762480214964,49762480911527, 1170,49762479085548,49762479085548,9223372036854775807,0,49762480066370,49762480099339,49762481013089,49762481085850,49762482232152,49762482478350,49762485657620,49762486116683, 118</pre> 119 120<p> 121 Каждая строка здесь представляет собой кадр, созданный приложением. В каждой строке имеется фиксированное количество 122столбцов, где указано время, затраченное на каждом этапе процесса создания кадра. Более подробно этот формат рассматривается в следующем разделе, 123включая сведения о том, что означает каждый столбец. 124</p> 125 126 127<h4 id="fs-data-format">Формат данных, возвращаемых командой framestats</h4> 128 129<p> 130 Поскольку блок данных выводится в формате CSV, вы можете с легкостью вставить его в любую программу 131для работы с электронными таблицами, а также собрать и обработать данные с помощью сценария. Ниже рассматривается формат 132столбцов выходных данных. Все временные метки указаны в наносекундах. 133</p> 134 135<ul> 136 <li>FLAGS 137 <ul> 138 <li>В строках, в которых в столбце FLAGS указано «0», общее время смены кадра вычислялось путем 139вычитания значения в столбце INTENDED_VSYNC из значения в столбце FRAME_COMPLETED. 140 </li> 141 142 <li>Если это значение не равно нулю, то строку следует пропустить, поскольку кадр был определен как отличающийся от 143обычной производительности, при которой ожидается, что размещение и прорисовка кадра займут 144больше 16 мс. Причина этого может заключаться в следующем: 145 <ul> 146 <li>макет окна был изменен (например, первый кадр приложения или после 147вращения); 148 </li> 149 150 <li>также, возможно, кадр был пропущен, в результате чего временные метки некоторых значений 151содержат бессмысленную информацию; кадр можно пропустить, если, например, скорость отображения превышает 60 кадров/с или если 152на экране от этого не появяются шумы; это не обязательно указывает на проблему 153в приложении. 154 </li> 155 </ul> 156 </li> 157 </ul> 158 </li> 159 160 <li>INTENDED_VSYNC 161 <ul> 162 <li>Предполагаемая начальная точка кадра. Если данное значение отличается от значения в столбце VSYNC, это указывает на то, 163что поток был занят и не смог своевременно среагировать на сигнал 164vsync. 165 </li> 166 </ul> 167 </li> 168 169 <li>VSYNC 170 <ul> 171 <li>Значение времени, которое использовалось во всех приемниках vsync, а также которое было затрачено на прорисовку кадра 172(обратные вызовы кадров Choreographer и анимации, View.getDrawingTime() и т. д.) 173 </li> 174 175 <li>Чтобы узнать подробнее о VSYNC и о том, какое значение это имеет для вашего приложения, просмотрите 176видеоролик, 177<a href="https://www.youtube.com/watch?v=1iaHxmfZGGc&list=PLOU2XLYxmsIKEOXh5TwZEv89aofHzNCiu&index=23">посвященный общим сведениям о VSYNC</a>. 178 </li> 179 </ul> 180 </li> 181 182 <li>OLDEST_INPUT_EVENT 183 <ul> 184 <li>Временная метка для самого старого события ввода в очереди ввода или Long.MAX_VALUE, если 185для кадра отсутствуют события ввода. 186 </li> 187 188 <li>Это значение в первую очередь предназначено для платформы и имеет ограниченную практическую ценность для разработчиков 189приложений. 190 </li> 191 </ul> 192 </li> 193 194 <li>NEWEST_INPUT_EVENT 195 <ul> 196 <li>Временная метка для самого нового события ввода в очереди ввода или 0, если 197для кадра отсутствуют события ввода. 198 </li> 199 200 <li>Это значение в первую очередь предназначено для платформы и имеет ограниченную практическую ценность для разработчиков 201приложений. 202 </li> 203 204 <li>Однако оно позволяет получить приблизительное представление о том, какая задержка возникает у приложения, 205обратившись к значению разницы (FRAME_COMPLETED - NEWEST_INPUT_EVENT). 206 </li> 207 </ul> 208 </li> 209 210 <li>HANDLE_INPUT_START 211 <ul> 212 <li>Временная метка отправки событий ввода в приложение. 213 </li> 214 215 <li>Разность между этим значением и значением ANIMATION_START позволяет определить, 216сколько времени было затрачено приложением на обработку событий ввода. 217 </li> 218 219 <li>Если разность достаточно велика (>2 мс), это означает, что приложение затрачивает очень 220много времени на обработку событий ввода, таких как View.onTouchEvent(). В свою очередь, это может указывать на 221необходимость оптимизации этого процесса обработки или переноса этой нагрузки в другой поток. Следует помнить, что существуют 222сценарии, когда такое 223поведение ожидается и является приемлемым. Имеются в виду нажатия или аналогичные сценарии, в которых запускаются новые операции. 224 </li> 225 </ul> 226 </li> 227 228 <li>ANIMATION_START 229 <ul> 230 <li>Временная метка запуска анимаций, зарегистрированных с помощью Choreographer. 231 </li> 232 233 <li>Разность между этим значением и PERFORM_TRANVERSALS_START позволяет 234определить, сколько времени потребовалось на оценку всех запущенных аниматоров (ObjectAnimator, 235ViewPropertyAnimator и общих переходов). 236 </li> 237 238 <li>Если разность достаточно велика (>2 мс), проверьте наличие в приложении настраиваемых 239аниматоров, а также то, какие поля анимируют классы ObjectAnimator. Убедитесь, что 240эти поля подходят для анимации. 241 </li> 242 243 <li>Чтобы узнать подробнее о Choreographer, просмотрите видео <a href="https://developers.google.com/events/io/sessions/325418001">For Butter or Worse</a>. 244 245 </li> 246 </ul> 247 </li> 248 249 <li>PERFORM_TRAVERSALS_START 250 <ul> 251 <li>Если вычесть значение DRAW_START из этого значения, вы можете узнать, сколько времени было затрачено на разметку и 252измерение. (Обратите внимание, что во время прокрутки или анимации это значение должно быть близко 253к нулю.) 254 </li> 255 256 <li>Чтобы узнать подробнее об этапах разметки и измерения во время рендеринга интерфейса приложения, просмотрите 257видео, посвященное 258<a href="https://www.youtube.com/watch?v=we6poP0kw6E&list=PLOU2XLYxmsIKEOXh5TwZEv89aofHzNCiu&index=27">аннулированию, макетам и производительности</a>. 259 </li> 260 </ul> 261 </li> 262 263 <li>DRAW_START 264 <ul> 265 <li>Время начала этапа отрисовки с помощью метода performTraversals. Это точка начала 266записи списков отображения любых представлений, которые были аннулированы. 267 </li> 268 269 <li>Разность между этим значением и значением SYNC_START означает, сколько времени потребовалось на вызов метода View.draw() для всех 270аннулированных представлений в дереве. 271 </li> 272 273 <li>Дополнительные сведения о модели отрисовки представлены в видео, посвященном <a href="{@docRoot}guide/topics/graphics/hardware-accel.html#hardware-model">аппаратному ускорению</a> 274или 275<a href="https://www.youtube.com/watch?v=we6poP0kw6E&list=PLOU2XLYxmsIKEOXh5TwZEv89aofHzNCiu&index=27">аннулированию, макетам и производительности</a>. 276 </li> 277 </ul> 278 </li> 279 280 <li>SYNC_START 281 <ul> 282 <li>Время начала этапа синхронизации отрисовки. 283 </li> 284 285 <li>Если разность между этим значением и значением ISSUE_DRAW_COMMANDS_START достаточно велика (>0,4 мс или около этого), 286обычно это указывает на наличие большого количество новых растровых изображений, которые следует передать 287ЦП. 288 </li> 289 290 <li>Чтобы узнать подробнее об этапе синхронизации, просмотрите видео, посвященное 291<a href="https://www.youtube.com/watch?v=VzYkVL1n4M8&index=24&list=PLOU2XLYxmsIKEOXh5TwZEv89aofHzNCiu">рендерингу профиля с помощью ЦП</a>. 292 </li> 293 </ul> 294 </li> 295 296 <li>ISSUE_DRAW_COMMANDS_START 297 <ul> 298 <li>Время начала отправки аппаратным обработчиком команд на отрисовку для ЦП. 299 </li> 300 301 <li>Разность между этим значением и значением FRAME_COMPLETED позволяет получить приблизительное представление об объеме ресурсов ЦП, используемых 302приложением. Здесь отображаются такие проблемы, как превышение или недостаток эффектов рендеринга. 303 304 </li> 305 </ul> 306 </li> 307 308 <li>SWAP_BUFFERS 309 <ul> 310 <li>Время вызова eglSwapBuffers; 311относится к работе платформы и имеет ограниченную практическую ценность для разработчиков приложений. 312 </li> 313 </ul> 314 </li> 315 316 <li>FRAME_COMPLETED 317 <ul> 318 <li>Все готово! Общее время, затраченное на обработку этого кадра, вычисленное по следующей формуле: 319FRAME_COMPLETED - INTENDED_VSYNC. 320 </li> 321 </ul> 322 </li> 323 324</ul> 325 326<p> 327 Эти данные можно использовать несколькими способами. Простым, но полезным примером может служить 328график, иллюстрирующий распределение времени кадров (FRAME_COMPLETED - INTENDED_VSYNC) в 329различных диапазонах задержки (см. рисунок ниже). На графике ясно видно, что с большинством кадров 330никаких проблем не возникло (ниже отметки в 16 мс; обозначено красным), однако для некоторых кадров 331это значение значительно превышено. Можно обратиться к этому графику и пронаблюдать изменения по времени, 332чтобы увидеть общую картину смещения или новые отличающиеся значения. Также можно создать график задержи ввода, 333времени, затраченного на разметку или других интересующих вас показателей, руководствуясь множеством временных меток, 334имеющихся в данных. 335</p> 336 337<img src="{@docRoot}preview/images/perf-test-framestats.png"> 338 339 340<h3 id="timing-dump">Дамп простой кадровой синхронизации</h3> 341 342<p> 343 Если в разделе настроек для разработчиков для параметра <strong>Profile GPU rendering</strong> задано значение <strong>In adb shell dumpsys gfxinfo</strong>, 344команда <code>adb shell dumpsys gfxinfo</code> выдает сведения о синхронизации 345по времени для последних 120 кадров. При этом вы увидите несколько категорий значений, 346разделенные знаком табуляции. Эти данные могут оказаться полезными для определения частей конвейера отрисовки, которые могут работать с задержкой 347при высоком уровне обработки. 348</p> 349 350<p> 351 Как и в случае с командой 352<a href="#fs-data-format">framestats</a>, описанной выше, вы можете с легкостью вставить полученные данные в любую программу 353для работы с электронными таблицами, а также собрать и обработать их с помощью сценария. На графике ниже иллюстрируется разбивка со сведениями о количестве созданных кадров и времени, которое приложение затратило на 354это. 355</p> 356 357<img src="{@docRoot}preview/images/perf-test-frame-latency.png"> 358 359<p> 360 Результаты выполнения команды gfxinfo, копирования полученного результата, передачи его в приложение для работы 361с электронными таблицами и построения графика представлены в виде столбцов. 362</p> 363 364<p> 365 Каждый столбец представляет собой один кадр анимации; его высота обозначает количество миллисекунд, 366затраченных на вычисление этого кадра. Каждый цветной сегмент столбца 367обозначает различный этап процесса рендеринга, что позволяет определить проблемные компоненты 368приложения в плане производительности. Дополнительные сведения о 369процессе рендеринга, а также о том, как оптимизировать его, представлены в видео, посвященном 370<a href="https://www.youtube.com/watch?v=we6poP0kw6E&index=27&list=PLWz5rJ2EKKc9CBxr3BVjPTPoDPLdPIFCE">аннулированию, макетам и производительности</a>. 371</p> 372 373 374<h3 id="collection-window">Управление промежутком времени для сбора статистических данных</h3> 375 376<p> 377 При выполнении команды framestats, равно как и при вычислении простой кадровой синхронизации, данные собираются за достаточно короткий промежуток времени – порядка 378двух секунд рендеринга. Чтобы точно указать этот промежуток времени (например, 379чтобы ограничить данные определенной анимацией), можно сбросить все счетчики 380и объединить собранные статистические данные. 381</p> 382 383<pre> 384>adb shell dumpsys gfxinfo <PACKAGE_NAME> reset 385</pre> 386 387<p> 388 Это также можно сделать совместно с выполнением самих команд создания дампа, чтобы выполнять сбор 389и сброс регулярно, непрерывно получая данные за промежутки времени продолжительностью менее двух секунд. 390 391</p> 392 393 394<h3 id="diagnose">Диагностика снижения производительности</h3> 395 396<p> 397 Определение снижений производительности послужит отличным началом для отслеживания проблем, а также позволит всегда поддерживать 398хорошую работоспособность приложения. Однако инструмент dumpsys позволяет лишь определить наличие проблем и приблизительный уровень их 399серьезности. Вам же требуется диагностировать каждую конкретную проблему с 400производительностью и найти подходящие способы ее устранения. Для этих целей прекрасно 401подходит инструмент <a href="{@docRoot}tools/help/systrace.html">systrace</a>. 402</p> 403 404 405<h3 id="resources">Дополнительные ресурсы</h3> 406 407<p> 408 Дополнительные сведения о принципе работы конвейера рендеринга платформы Android, информация об общих проблемах, с которыми можно столкнуться при его использовании, 409а также способы их устранения представлены на указанных ниже 410полезных ресурсах. 411</p> 412 413<ul> 414 <li>Производительность визуализации 101 415 </li> 416 <li>Частота 60 кадров в секунду 417 </li> 418 <li>Пользовательский интерфейс Android и графический процессор 419 </li> 420 <li>Аннулирование макетов и производительность 421 </li> 422 <li>Анализ производительности интерфейса с помощью systrace 423 </li> 424</ul> 425 426 427<h2 id="automate">Автоматизация тестирования производительности интерфейса</h2> 428 429<p> 430 Один из подходов к тестированию производительности интерфейса заключается в простом привлечении тестировщиков, чтобы они выполнили ряд 431операций с целевым приложением, а также либо просто визуально убедились в отсутствии глюков, либо уделили достаточно много времени 432тестированию приложения с помощью соответствующего инструмента. Однако такой подход имеет один важный недостаток 433– человек физически не способен обрабатывать информацию при очень быстрой смене кадров. 434Кроме того, такая работа занимает много времени, утомляет и не гарантирует полное отсутствие ошибок. 435</p> 436 437<p> 438 Гораздо эффективнее записать ключевые показатели производительности, полученные в ходе автоматического 439тестирования интерфейса, и проанализировать их. В состав Android M Developer Preview входят новые функции ведения журналов, которые позволяют с легкостью 440определить объем и серьезность глюков анимации в приложении. 441Их также можно использовать для того, чтобы создать строгий процесс определения текущей производительности и отслеживать соответствие требованиям будущих задач 442производительности. 443</p> 444 445<p> 446 В этой статье мы расскажем вам, как мы рекомендуем использовать такие данные, чтобы автоматизировать 447тестирование производительности. 448</p> 449 450<p> 451 Этот подход большей частью сводится к двум ключевым шагам. Шаг первый: определите, что вы 452тестируете и как вы это делаете. Шаг второй: произведите настройку 453среды автоматизированного тестирования и ее обслуживание. 454</p> 455 456 457<h3 id="ui-tests">Настройка тестов интерфейса</h3> 458 459<p> 460 Прежде чем приступить к автоматизированному тестированию, необходимо принять ряд важных решений, 461чтобы правильно определить область тестирования и ваши требования. 462</p> 463 464<h4> 465 Определение ключевых анимаций или потоков для тестирования 466</h4> 467 468<p> 469 Помните, что плохая производительность чаще всего выражается для пользователей в отсутствии плавной 470анимации. Поэтому при определении того, какие типы действий в пользовательском интерфейсе следует протестировать, полезно 471сосредоточить внимание на ключевых анимациях, наиболее важных для 472взаимодействия пользователя с приложением. Ниже представлены примеры наиболее распространенных сценариев, которые может оказаться полезным определить. 473</p> 474 475<ul> 476 <li>Прокрутка основного представления ListView или RecyclerView 477 </li> 478 479 <li>Анимации во время циклов асинхронного ожидания 480 </li> 481 482 <li>Любые анимации, включающие загрузку растровых изображений или манипуляции с ними 483 </li> 484 485 <li>Анимации, включающие смешивание альфа-канала 486 </li> 487 488 <li>Отрисовка настраиваемого представления на экране 489 </li> 490</ul> 491 492<p> 493 Определите, какие из этих 494ключевых анимаций следует протестироваит в первую очередь. При принятии решения подключите инженеров, дизайнеров и менеджеров по продукту. 495</p> 496 497<h4> 498 Определите свои будущие задачи и отслеживайте их выполнение 499</h4> 500 501<p> 502 С профессиональной точки зрения, может оказаться крайне важным решить, каких именно показателей производительности вы хотите добиться, и 503сосредоточить усилия на создании необходимых тестов и сборе соответствующих данных. Например: 504</p> 505 506<ul> 507 <li>Вы только хотите начать отслеживание производительности интерфейса, чтобы получить дополнительные сведения? 508 </li> 509 510 <li>Вы хотите предотвратить возможно снижение производительности в будущем? 511 </li> 512 513 <li>На сегодняшний день 90% кадров анимируются плавно. Вы хотите увеличить этот показатель до 98% в этом квартале? 514 </li> 515 516 <li>На сегодняшний день 98% кадров анимируются плавно. Вы не хотите, чтобы производительность снизилась? 517 </li> 518 519 <li>Вы хотите улучшить производительность на бюджетных устройствах? 520 </li> 521</ul> 522 523<p> 524 Во всех перечисленных случаях вам потребуется хронологическое отслеживание показателей, демонстрирующих производительность 525разных версий вашего приложения. 526</p> 527 528<h4> 529 Определение устройств для тестирования 530</h4> 531 532<p> 533 Производительность приложения может меняться в зависимости от того, на каком устройстве оно установлено. Некоторые устройства могут обладать недостаточным 534объемом памяти, менее производительными графическими процессорами или слабыми ЦП. Это означает, что анимации, 535которые прекрасно работают на устройстве с одним оборудованием, могут вообще не работать на устройстве с другим оборудованием, и, что хуже всего, препятствовать 536нормальной работе другой части конвейера. Поэтому, учитывая такую разницу 537в отображении интерфейса для пользователей, выберите диапазон устройств для выполнения тестов, включив в него 538как современные высокотехнологичные, так и бюджетные устройства, планшеты и т. д. При выборе диапазона устройств учитывайте разницу в производительности ЦП 539, ОЗУ, разрешение экрана, его размер и т. д. Тесты, которые успешно прошли на устройстве верхнего ценового сегмента, 540могут завершиться сбоем на бюджетных моделях. 541</p> 542 543<h4> 544 Базовые средства для тестирования пользовательского интерфейса 545</h4> 546 547<p> 548 Такие наборы инструментов, как <a href="{@docRoot}training/testing/ui-testing/uiautomator-testing.html">UI Automator</a> и 549<a href="{@docRoot}training/testing/ui-testing/espresso-testing.html">Espresso</a>, 550призваны помочь автоматизировать действия пользователей при взаимодействии с вашим приложением. Это простые инструменты, 551имитирующие работу пользователя на устройстве. Для использования этих инструментов 552вам необходимо создать уникальные сценарии, которые будут включать выполнение ряда действий, и воспроизвести 553их на устройстве. 554</p> 555 556<p> 557 Используя эти автоматизированные тесты в сочетании с командой <code>dumpsys gfxinfo</code>, вы можете быстро создать 558воспроизводимую систему, позволяющую выполнять тестирование и анализировать 559полученную информацию о производительности для каждого определенного условия. 560</p> 561 562 563<h3 id="automated-tests">Настройка автоматизированного тестирования интерфейса</h3> 564 565<p> 566 Получив возможность протестировать интерфейс, а также настроив конвейер на сбор результатов 567отдельного теста, важно выбрать инструмент, который позволит многократно выполнить 568тест на нескольких устройствах, а также объединить данные о результатах 569тестирования производительности для их дальнейшего анализа вашими специалистами по разработке. 570</p> 571 572<h4> 573 Инструмент для автоматизации тестирования 574</h4> 575 576<p> 577 Следует отметить, что инструменты для тестирования интерфейса (такие как <a href="{@docRoot}training/testing/ui-testing/uiautomator-testing.html">UI Automator</a>) 578можно запускать прямо на целевом устройстве или в эмуляторе. Тогда как сбор командой 579<em>dumpsys gfxinfo</em> информации о производительности выполняется на хост-компьютере, который отправляет команды из ADB. Чтобы объединить 580усилия этих двух инструментов, был разработан <a href="{@docRoot}tools/help/monkeyrunner_concepts.html">MonkeyRunner</a>. 581Эта система написания сценариев, работающая на хост-компьютере, отправляет команды на 582подключенные устройства, а также получает данные от них. 583</p> 584 585<p> 586 Набор сценариев для надлежащей автоматизации тестирования производительности интерфейса должен включать использование 587системы MonkeyRunner хотя бы для выполнения следующих задач: 588</p> 589 590<ul> 591 <li>загрузка и запуск на целевые устройства или в эмулятор необходимого пакета APK; 592 </li> 593 594 <li>запуск теста UI Automator и его выполнение; 595 </li> 596 597 <li>сбор информации о производительности с помощью <em>dumpsys gfxinfo</em><em>;</em> 598 </li> 599 600 <li>объединение полученной информации и ее отображение для разработчика в удобочитаемой форме. 601 </li> 602</ul> 603 604 605<h3 id="triage">Определение и устранение обнаруженных проблем</h3> 606 607<p> 608 После обнаружения проблемных мест или причин снижения производительности необходимо понять, что должно быть исправлено 609и внести соответствующие изменения. Если используемый инструмент для автоматизированного тестирования обеспечивает соблюдение точной разбивки 610кадровой синхронизации по времени, то с его помощью можно тщательно изучить недавние подозрительные изменения в коде или макете (в случае 611со снижением производительности), а также ограничить область системы, которая подлежит анализу, когда вы переключаетесь на изучение проблемы 612вручную. В последнем случае прекрасно подойдет <a href="{@docRoot}tools/help/systrace.html">systrace</a>. С помощью этого инструмента вы можете получить подробнейшую информацию 613о синхронизации относительно каждого этапа конвейера рендеринга, относительно каждого потока и каждого ядра 614системы, а также относительно любых настраиваемых маркеров событий, которые вы задаете. 615</p> 616 617<h4> 618 Надлежащее профилирование синхронизации по времени 619</h4> 620 621<p> 622 Важно отметить трудности, с которыми можно столкнуться при получении и анализе данных синхронизации, связанных 623с производительностью визуализации. Результаты по своей природе недетерминированные и зачастую 624изменяются в зависимости от состояния системы, объема доступной памяти, температурного 625дросселирования и времени суток. Смысл в том, что 626вы можете выполнить один и тот же тест дважды и получить результаты, 627которые будут похожи, но не совпадут в точности. 628</p> 629 630<p> 631 Правильный сбор и профилирование данных означает выполнение одного и того же теста 632несколько раз и накопление результатов для вычисления среднего значения (для простоты назовем это 633пакетом результатов). Это позволяет получить приблизительное представление о производительности 634теста, когда нет необходимости в точных данных. 635</p> 636 637<p> 638 Пакеты можно использовать при изучении изменений кода, чтобы увидеть их относительное влияние на 639производительность. Если средняя частота кадров для пакета результатов, полученных до изменения, больше значения для пакета, полученного 640после изменения, обычно вы получаете общее повышение производительности в результате этого конкретного 641изменения. 642</p> 643 644<p> 645 При выполнении любого автоматизированного тестирования интерфейса следует учитывать этот момент, 646равно как и любые аномалии, которые могут возникнуть во время теста. Например, 647если производительность вашего приложения неожиданно резко падает из-за проблем с оборудованием устройства (которые 648не вызваны вашим приложением), возможно, вы захотите выполнить пакет повторно, чтобы получить 649менее беспорядочные данные о синхронизации. 650</p> 651 652<p> 653 Итак, сколько раз следует выполнять тест, прежде чем его результаты станут значимыми? Не менее 10! 654 Чем больше раз вы выполняете тест (например, можно сделать 50–100 прогонов), тем выше точность результатов 655(хотя, конечно, ради точности приходится поступаться временем). 656</p> 657