1page.title=表示パフォーマンスのテスト 2page.image=images/cards/card-test-performance_2x.png 3page.keywords=パフォーマンス,fps,ツール 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">UI のパフォーマンスを測定する</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">UI パフォーマンス テストを自動化する</a> 23 <ul> 24 <li><a href="#ui-tests">UI テストをセットアップする</a></li> 25 <li><a href="#automated-tests">自動化された UI テストをセットアップする</a></li> 26 <li><a href="#triage">見つけた問題を選別し解決する</a></li> 27 </ul> 28 </li> 29 </ol> 30 </div> 31</div> 32 33 34<p> 35 ユーザー インターフェース(UI)のパフォーマンスをテストすることで、アプリが機能面での要件に合うだけでなく、ユーザーがアプリをスムーズに操作でき、毎秒安定して 60 フレーム(<a href="https://www.youtube.com/watch?v=CaMTIgxCSqU&index=25&list=PLWz5rJ2EKKc9CBxr3BVjPTPoDPLdPIFCE">why 60fps?</a>)で、フレームのドロップや遅延なしで、言い換えれば<em>ジャンク</em>なしで実行されるようにします。 36 37 38このドキュメントでは、UI のパフォーマンスを測定することができるツールについて説明し、UI パフォーマンスの測定値をテストで活用する方法を提示します。 39 40 41</p> 42 43 44<h2 id="measure">UI のパフォーマンスを測定する</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> は端末上で動作し、システム サービスの状態についての情報をダンプする Android ツールです。 54 55<em>gfxinfo</em> コマンドを dumpsys に渡すと、記録中に実行されたアニメーションのフレームに関連するパフォーマンス情報が 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 フレームのフレーム タイミング情報を、ナノ秒の精度を持つタイムスタンプを使用して出力します。以下は、adb dumpsys gfxinfo 109 <PACKAGE_NAME> framestats による未加工の出力例です。 110 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 この出力の各行が、アプリによって生成される 1 つのフレームを示します。各ラインは、フレームを生成するパイプラインの各段階で費やされた時間を出力する固定された数の列を持ちます。 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」の行には、FRAME_COMPLETED 列から INTENDED_VSYNC 列を引いて計算されたフレームの総処理時間が示されます。 139 140 </li> 141 142 <li>FLAGS 列が「0」以外の場合、そのフレームは通常のパフォーマンスからの外れ値であると定められているのでその行は無視する必要があります。この場合、レイアウトと描画に 16 ミリ秒よりも長くかかることが想定されています。 143 144これは、以下の原因で起きることがあります。 145 <ul> 146 <li>ウィンドウのレイアウトが変更された(アプリケーションの最初のフレームの場合や画面が回転された後など)。 147 148 </li> 149 150 <li>フレームが省略された。この場合、いくつかの値には不適切なタイムスタンプが含まれます。 151たとえば 60 fps よりも速く実行されている場合や、画面上にダーティで終わったものが何もない場合など、フレームは省略することができます。これは必ずしもアプリに問題がある兆候ではありません。 152 153 154 </li> 155 </ul> 156 </li> 157 </ul> 158 </li> 159 160 <li>INTENDED_VSYNC 161 <ul> 162 <li>フレームの意図された開始ポイント。この値が VSYNC と異なる場合、vsync 信号にすぐに応答することを阻止する動作が UI スレッド上で発生していたことを意味します。 163 164 165 </li> 166 </ul> 167 </li> 168 169 <li>VSYNC 170 <ul> 171 <li>すべての vsync リスナーとフレームの描画(Choreographer フレーム コールバック、アニメーション、View.getDrawingTime() など)で使用された時間の値。 172 173 </li> 174 175 <li>VSYNC と VSYNC のアプリケーションへの影響の詳細については、<a href="https://www.youtube.com/watch?v=1iaHxmfZGGc&list=PLOU2XLYxmsIKEOXh5TwZEv89aofHzNCiu&index=23">Understanding VSYNC</a> のビデオをご覧ください。 176 177 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>ただし、FRAME_COMPLETED から NEWEST_INPUT_EVENT を引いた値を確認することによって、そのアプリが増やす待ち時間がどれくらいか大まかに知ることができます。 205 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 ミリ秒)の場合、View.onTouchEvent() などの入力イベントを処理するためにアプリが長い時間を費やしていることを意味します。これは、この動作の最適化または別のスレッドへの移行が必要なことを示している場合があります。 220 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 の間の時間を確認することで、実行中のすべてのアニメーター(ObjectAnimator、ViewPropertyAnimator、共通の遷移となっている Transitions)を評価するのにかかった時間を確認することができます。 234 235 236 </li> 237 238 <li>この値が大きい(> 2 ミリ秒)の場合、アプリがカスタム アニメーターを記述していないか、また ObjectAnimators がアニメーション化しているのがどの項目かを確認して、それらがアニメーションに適しているかどうか確かめてください。 239 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>レンダリング パイプラインのレイアウトと測定のフェーズについての詳細は、<a href="https://www.youtube.com/watch?v=we6poP0kw6E&list=PLOU2XLYxmsIKEOXh5TwZEv89aofHzNCiu&index=27">Invalidations, Layouts and Performance</a> のビデオをご覧ください。 257 258 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">Hardware Acceleration</a> または <a href="https://www.youtube.com/watch?v=we6poP0kw6E&list=PLOU2XLYxmsIKEOXh5TwZEv89aofHzNCiu&index=27">Invalidations, Layouts and Performance</a> のビデオをご覧ください。 274 275 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 ミリ秒またはこれに近い値)、通常は、GPU にアップロードする必要がある多くの新しい Bitmaps が描画されたこと意味します。 286 287 288 </li> 289 290 <li>同期フェーズについての詳細は、<a href="https://www.youtube.com/watch?v=VzYkVL1n4M8&index=24&list=PLOU2XLYxmsIKEOXh5TwZEv89aofHzNCiu">Profile GPU Rendering</a> のビデオをご覧ください。 291 292 </li> 293 </ul> 294 </li> 295 296 <li>ISSUE_DRAW_COMMANDS_START 297 <ul> 298 <li>ハードウェア レンダラーが、GPU への描画コマンドの発行を開始した時間。 299 </li> 300 301 <li>この値と FRAME_COMPLETED の間の時間により、そのアプリがどれくらいの量の GPU 作業を生じさせているのか大まかに知ることができます。 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>すべてが完了した時間です。そのフレームを処理するのにかかった時間の合計は、FRAME_COMPLETED から INTENDED_VSYNC を引くと計算できます。 319 320 </li> 321 </ul> 322 </li> 323 324</ul> 325 326<p> 327 このデータは、別の方法でも使用できます。たとえば、さまざまな遅延バケットでのフレームの処理にかかった時間(FRAME_COMPLETED - INTENDED_VSYNC)の分布を示す下記のヒストグラムは、単純ですが役に立ちます。 328 329このグラフを一目見るだけで、大部分のフレームは 16 ミリ秒の限界線(赤色の線)を大きく下回った良好な状態であるけれども、いくつかのフレームが限界線を著しく上回っていることがわかります。 330 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>GPUレンダリングのプロフィール作成</strong>] を [<strong>adb shell dumpsys gfxinfo</strong>] に設定すると、<code>adb shell dumpsys gfxinfo</code> コマンドにより、最新の 120 フレームのタイミング情報が、いくつかの異なるカテゴリに分かれて、タブ区切りで出力されます。 344 345 346このデータは、描画パイプラインのどの部分の処理が遅いのかを大まかに知るのに役に立ちます。 347 348</p> 349 350<p> 351 上記の <a href="#fs-data-format">framestats</a> と同様に、お好みのスプレッドシート ツールに簡単に貼り付けたり、スクリプトで簡単に集計し解析したりできます。 352 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 各縦棒は、アニメーションの 1 フレームを示し、その高さはそのフレームを処理するのにかかるミリ秒の数を示しています。 366また、縦棒の色分けされた各部分は、レンダリング パイプラインの各段階を示しています。これにより、ボトルネックを生んでいる可能性があるのはアプリケーションのどの箇所か確認できます。 367 368レンダリング パイプラインとその最適化方法に関する詳細は、<a href="https://www.youtube.com/watch?v=we6poP0kw6E&index=27&list=PLWz5rJ2EKKc9CBxr3BVjPTPoDPLdPIFCE">Invalidations, Layouts and Performance</a> のビデオをご覧ください。 369 370 371</p> 372 373 374<h3 id="collection-window">データ収集用のウィンドウを制御する</h3> 375 376<p> 377 Framestats と簡易フレーム タイミングの両方とも、非常に短いウィンドウを通じて、約 2 秒相当のレンダリングについてデータを収集しています。 378たとえば、収集するデータを特定のアニメーションだけに限定したい場合、このタイミング データ収集用ウィンドウを正確にコントロールするには、すべてのカウンタをリセットし収集したデータを集計します。 379 380 381</p> 382 383<pre> 384>adb shell dumpsys gfxinfo <PACKAGE_NAME> reset 385</pre> 386 387<p> 388 これは、ダンプ コマンドとあわせて使用することもでき、フレームの 2 秒未満のウィンドウを続けてキャプチャしながら、通常の流れで収集しリセットできます。 389 390 391</p> 392 393 394<h3 id="diagnose">パフォーマンスの低下を診断する</h3> 395 396<p> 397 パフォーマンスの低下を見つけることは、問題を見つけだし、アプリケーションの状態を良好に維持するための最初のステップです。 398ただし、dumpsys は、ただ問題の存在とその相対的な深刻度を明らかにするだけです。 399さらに、パフォーマンスの問題の具体的な原因を突き止め、解決するための適切な方法を見つける必要があります。 400それには、<a href="{@docRoot}tools/help/systrace.html">systrace</a> ツールを利用することをお勧めします。 401 402</p> 403 404 405<h3 id="resources">追加リソース</h3> 406 407<p> 408 Android のレンダリング パイプラインの仕組み、一般的な問題、それらの問題の修正方法についての詳細は、以下の資料が役に立ちます。 409 410 411</p> 412 413<ul> 414 <li>Rendering Performance 101 415 </li> 416 <li>Why 60fps? 417 </li> 418 <li>Android UI and the GPU 419 </li> 420 <li>Invalidations Layouts and performance 421 </li> 422 <li>Analyzing UI Performance with Systrace 423 </li> 424</ul> 425 426 427<h2 id="automate">UI パフォーマンス テストを自動化する</h2> 428 429<p> 430 UI パフォーマンスのテスト手法の 1 つに、対象のアプリ上で一連のユーザー操作を人間のテスターに実行してもらい、目視でジャンクを探すかツール主体の手法を使用して長い時間を費やしてジャンクを見つけるかのいずれかの方法をとるというものがあります。 431 432ただし、この人の力による方法は危険を伴います。フレームレートの変化に気付く能力は、人によって大きく異なります。また、この方法は、多くの時間が必要で単調で退屈なものであり、ミスも起こりがちです。 433 434 435</p> 436 437<p> 438 より効率的な手法は、自動化された UI テストにより主要なパフォーマンス指標のログを取って解析することです。 439Android M Developer Preview には、アプリケーションのアニメーションに対するジャンクの量と深刻度を簡単に確認することができ、現在のパフォーマンスを確認し将来のパフォーマンス目標を実現するための適切なプロセスを構築するために使用できる新しいログ記録機能が含まれています。 440 441 442 443</p> 444 445<p> 446 このドキュメントでは、この新しいログ機能によるデータを使用してパフォーマンス テストを自動化するための手法について紹介します。 447 448</p> 449 450<p> 451 この手法には、鍵となるアクションが 2 つあります。何をどのようにテストするかということを明確にすることと、自動化されたテスト環境をセットアップし管理することです。 452 453 454</p> 455 456 457<h3 id="ui-tests">UI テストをセットアップする</h3> 458 459<p> 460 自動化されたテストを実行する前に、テストの仕様や必要になる可能性があるものを適切に把握するために、いくつかの大まかな決定をしておくことが重要です。 461 462</p> 463 464<h4> 465 テストする重要なアニメーションやフローを明確にする 466</h4> 467 468<p> 469 パフォーマンスの低さがユーザーの目に最も多く触れるのは、アニメーションのスムーズさが失われる場合です。 470そのため、どのタイプの UI アクションをテストするか決めるときに、ユーザーが最もよく見る重要なアニメーションまたはユーザーの使用感にとって最も重要なアニメーションにフォーカスすると効果があります。 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>詳細を知るために、初めて UI パフォーマンスの追跡を開始したいだけですか。 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 アプリケーションのパフォーマンスは、そのアプリケーションが実行される端末によって異なります。端末によっては、メモリが少なく、GPU のパワーが低く、CPU チップが遅いものもあります。 534つまり、あるハードウェアでスムーズに実行できるアニメーションが別のハードウェアではうまく実行できなかったり、さらに悪い場合は、パイプラインの別の箇所にボトルネックを生んだりすることになります。 535 536そのため、このようなハードウェアの違いに対処するために、最新のハイエンド端末と、ローエンド端末、タブレットなどの幅広い端末を選んでテストを実行する必要があります。 537 538さまざまな CPU 性能、RAM、画面密度、サイズ等の端末を用意してください。 539ハイエンド端末でうまくいったテストが、ローエンド端末では失敗することがあります。 540 541</p> 542 543<h4> 544 UI のテストの基本的なフレームワーク 545</h4> 546 547<p> 548 <a href="{@docRoot}training/testing/ui-testing/uiautomator-testing.html">UI Automator</a> や <a href="{@docRoot}training/testing/ui-testing/espresso-testing.html">Espresso</a> といったツールが、ユーザーがアプリケーション内を移動する動作を自動処理にするために用意されています。 549 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">自動化された UI テストをセットアップする</h3> 564 565<p> 566 UI テストを実行する機能と、1 つのテストからデータを集めるためのパイプラインを用意したら、次の重要なステップは、複数の端末で、そのテストを複数回実行でき、開発チームの解析用にパフォーマンス データを集計できるフレームワークを用意することです。 567 568 569 570</p> 571 572<h4> 573 テスト自動化のためのフレームワーク 574</h4> 575 576<p> 577 UI テストのフレームワーク(<a href="{@docRoot}training/testing/ui-testing/uiautomator-testing.html">UI Automator</a> など)は、対象の端末やエミュレータ上で直接実行されます。 578<em>dumpsys gfxinfo</em> によるパフォーマンス情報の収集はホストマシンによって行われますが、コマンドの送信は ADB を通じて行われます。 579これらの別々に分かれている処理の自動化を橋渡しするために、<a href="{@docRoot}tools/help/monkeyrunner_concepts.html">MonkeyRunner</a> フレームワークは開発されました。このフレームワークは、ホストマシンで動作するスクリプティング システムで、接続されている端末にコマンドを発行できるとともに、それらの端末からデータを受け取ることもできます。 580 581 582 583</p> 584 585<p> 586 UI パフォーマンス テストの適切な自動化のためのスクリプトを作成することで、少なくとも、以下のタスクを MonkeyRunner を利用して実行することが可能になります。 587 588</p> 589 590<ul> 591 <li>対象の端末(1 台または複数台)またはエミュレータに任意の APK をロードして起動する 592 </li> 593 594 <li>UI Automator UI テストを起動して、実行できるようにする 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> から開始することをお勧めします。systrace は、システムのレンダリング パイプラインのすべての段階、すべてのスレッド、コア、およびテスト担当者が定義したカスタム イベントについての正確なタイミング情報を表示します。 613 614 615</p> 616 617<h4> 618 一時的なタイミングを適切にプロファイリングする 619</h4> 620 621<p> 622 レンダリング パフォーマンスのタイミングを取得し測定することには困難を伴います。 623これらの数値は、その本質として、決定的なものではなく、多くの場合、システムの状態、利用可能なメモリ量、サーマル・スロットリング、その地域に最後に日照があった時間などに応じて変動します。 624 625つまり同じテストを 2 度実行した場合、近似するが完全に同じではない、わずかに異なる結果が出ることがあるということです。 626 627 628</p> 629 630<p> 631 この方法で適切にデータを集めプロファイリングするには、同じテストを複数回実行し、結果を平均値または中間値として集計します(以下では、この処理を「バッチ」と記載します)。これにより、テストのパフォーマンスの大まかな数字を、正確なタイミングを必要とすることなく取得できます。 632 633 634 635</p> 636 637<p> 638 バッチは、コード変更の合間にも、それらの変更がパフォーマンスにもたらす相対的な影響を確認するために使用できます。 639変更前のバッチの平均フレームレートが変更後のバッチよりも大きい場合、通常、WRT パフォーマンスが全面的に改善したと言えます。 640 641 642</p> 643 644<p> 645 つまり、自動化された UI テストでは、この考え方を取り入れることと、テスト中に発生する可能性のある異常を把握しておくことが必要です。 646たとえば、アプリケーションのパフォーマンスが、そのアプリケーションではなく何らかの端末の問題により突然低下した場合、通常時のタイミングを取得するためにバッチを再度実行した方がよいことがあります。 647 648 649 650</p> 651 652<p> 653 それでは、測定値を意味のあるものにするには、何回テストを実行すればよいでしょうか。少なくとも 10 回は必要であり、50 回や 100 回などのように回数が多いほど正確な結果が得られます(もちろん、時間と正確さはトレードオフの関係にあります)。 654 655 656</p> 657