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&amp;index=25&amp;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&gt; adb shell dumpsys gfxinfo &lt;PACKAGE_NAME&gt;
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&gt;adb shell dumpsys gfxinfo &lt;PACKAGE_NAME&gt; framestats
105</pre>
106
107<p>
108  このコマンドは、アプリによって生成された最新 120 フレームのフレーム タイミング情報を、ナノ秒の精度を持つタイムスタンプを使用して出力します。以下は、adb dumpsys gfxinfo
109  &lt;PACKAGE_NAME&gt; 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&amp;list=PLOU2XLYxmsIKEOXh5TwZEv89aofHzNCiu&amp;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_VALUE185
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>この値が大きい(&gt; 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>この値が大きい(&gt; 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&amp;list=PLOU2XLYxmsIKEOXh5TwZEv89aofHzNCiu&amp;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&amp;list=PLOU2XLYxmsIKEOXh5TwZEv89aofHzNCiu&amp;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 の間の時間が非常に大きい場合(&gt; 0.4 ミリ秒またはこれに近い値)、通常は、GPU にアップロードする必要がある多くの新しい Bitmaps が描画されたこと意味します。
286
287
288      </li>
289
290      <li>同期フェーズについての詳細は、<a href="https://www.youtube.com/watch?v=VzYkVL1n4M8&amp;index=24&amp;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&amp;index=27&amp;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&gt;adb shell dumpsys gfxinfo &lt;PACKAGE_NAME&gt; 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