アプリのCPU使用率の最適化には、ユーザーエクスペリエンス
CPUプロファイラーを使用して、アプリとの対話中にアプリのCPU使用率とスレッドアクティビティをリアルタイムで検査したり、記録されたメソッ
CPUプロファイラーが記録して表示する特定の種類の情報は、選択した記録構成によって決定されます。
- システムトレース:アプリがシステムリソー
-
メソッドと関数のトレース:アプリプロセスの各スレッドについて、どのメソッド(Java)または関数(C/C++)が一定期間にわたって実行され、各メソッドま メソッドトレースと関数トレースを使用して、呼び出し元と呼び出し元を識別することもできます。 呼び出し元は、別のmethodor関数を呼び出すメソッドまたは関数であり、呼び出し先は別のメソッドまたは関数によって呼び出されるメソッドまたは関数で この情報を使用して、リソースの多い特定のタスクを頻繁に呼び出すメソッドまたは関数を特定し、不要な作業を避けるためにアプリのコードを最適化
メソッドトレースを記録するときは、sampledまたはinstrumentedrecordingを選択できます。 機能トレースを記録するときは、サンプル記録のみを使用できます。
これらの各トレースオプションの使用と選択の詳細については、記録設定を選択してください。
CPUプロファイラの概要
CPUプロファイラを開くには、次の手順に従います。
-
ビュー>>をクリックします。
展開ターゲットの選択ダイアログでプロンプトが表示された場合は、プロファイリング用にアプリを展開するデバイスを選択します。 Usb経由でデバイスを接続したが、デバイスが表示されない場合は、USBデバッグが有効になっていることを確認してください。
-
cpuタイムラインの任意の場所をクリックして、CPUプロファイラを開きます。CPUプロファイラーを開くと、アプリのCPUusageとthreadアクティビティの表示がすぐに開始されます。 図1のようなものが表示されます。
図1。 CPUプロファイラのタイムライン。
図1に示すように、CPUプロファイラーの既定のビューには、次のタイムラインが含まれています。
- Event timeline: ライフサイクルのさまざまな状態に遷移するアプリのアクティビティを表示し、画面の回転イベントを含むデバイスとのユーザーの操作を示します。 Android7.1(APIレベル25)以下を実行しているデバイスでイベントタイムラインを有効にする方法については、”高度なプロファイリングの有効化”を参照
- CPUタイムライン:アプリのリアルタイムのCPU使用率を、使用可能なCPU時間の合計に対する割合で表示し、アプリが使用しているスレッドの合計数 タイムラインには、他のプロセス(システムプロセスや他のアプリなど)のCPU使用率も表示されるため、アプリの使用率と比較できます。 タイムラインの横軸に沿ってマウスを移動することで、CPU使用率の履歴データを調べることができます。
- Thread activity timeline:アプリプロセスに属する各スレッドを一覧表示し、以下の色を使用してタイムラインに沿ってアクティビティを示します。 トレースを記録した後、このタイムラインからスレッドを選択して、トレースペインでそのデータを検査できます。
- 緑:スレッドがアクティブであるか、CPUを使用する準備ができています。 つまり、runningまたはrunnable状態にあります。
- 黄色:スレッドはアクティブですが、ディスクやネットワークI/OなどのI/O操作で作業を完了する前に待機しています。
- Gray:スレッドはスリープ状態であり、CPU時間を消費していません。 これは、スレッドがまだ利用できないリソースへのアクセスを必要とする場合に発生することがあります。 スレッドが自発的にスリープ状態になるか、必要なリソースが使用可能になるまでカーネルがスレッドをスリープ状態にします。 CPUプロファイラは、Android StudioとAndroidプラットフォームがアプリプロセスに追加するスレッドのCPU使用率も報告します。
JDWP
Profile Saver
Studio:VMStats
Studio:Perfa
Studio:Perfa
Profile Saver
。Studio:Heartbeat
(ただし、スレッドアクティビティタイムラインに表示される正確な名前は異なる場合があります)。 Android Studioはこのデータを報告するため、スレッドのアクティビティとCPU使用率がアプリのコードによって実際に発生したことを識別できます。
トレースの記録
トレースの記録を開始するには、CPUプロファイラの上または下のドロップダウンメニューから記録設定を選択し、記録をクリッ
図2。 CPUプロファイラには、記録の状態、期間、およびタイプが表示されます。
アプリと対話し、完了したら停止をクリックします。 図3のとおり、プロファイラーはトレースペインにトレース情報を自動的に表示します。
図3。 Amethod traceを記録した後のCPUプロファイラ。
- 選択された範囲:トレースペインで検査する記録された時間の部分を決定します。 トレースを最初に記録すると、CPUプロファイラはCPUタイムライン内の記録の全体の長さを自動的に選択します。 記録された時間範囲の一部のみのトレースデータを検査するには、強調表示された領域のエッジをドラッグします。
- インタラクションセクション:ユーザーとのインタラクションとアプリライフサイクルイベントをタイムラインに沿って表示します。
- Threadsセクション:スレッド状態のアクティビティ(実行中、スリープ中など)を表示します。 タイムラインに沿ったすべてのスレッドのチャート(またはシステムトレースのトレースイベントチャート)を呼び出
- マウスとキーボードのショートカットを使用してタイムラインを移動します。
- スレッド名をダブルクリックするか、スレッドが選択されている間にEnterキーを押して、スレッドを展開または折りたたんでください。
- スレッドを選択して、分析ペインに追加情報を表示します。 複数のスレッドを選択するには、ShiftキーまたはCtrlキー(Macの場合はコマンド)を押したままにします。
- メソッド呼び出し(またはシステムトレースのトレースイベント)を選択して、分析ペインに追加情報を表示します。
- 分析ペイン: 選択した時間範囲とスレッドまたはメソッド呼び出しのトレースデータを表示します。 このペインでは、各スタックトレースの表示方法(分析タブを使用)と実行時間の測定方法(時間参照ドロップダウンメニューを使用)を選択できます。
- 分析ペインのタブ:トレースの詳細を表示する方法を選択します。 各オプションの詳細については、”トレースの検査”を参照してください。
- Time reference menu:各コールのタイミング情報の測定方法を決定するには、次のいずれかを選択します(Sample/Trace Javaメソッドでのみサポートされています)。
- Wall clock time: タイミング情報は、実際の経過時間を表します。
- スレッド時間:タイミング情報は、スレッドがCPUリソースを消費していないときの実際の経過時間からその時間の任意の部分を差し引いたものを表 任意の呼び出しに対して、そのスレッド時間は常にその壁時計時間以下です。 スレッド時間を使用すると、特定のメソッドまたは関数によってスレッドの実際のCPU使用率がどのくらい消費されるかをよりよく理解できます。
- Filter:関数、メソッド、クラス、またはパッケージ名でトレースデータをフィルタリングします。 たとえば、特定のコールに関連するトレースデータをすばやく識別する場合は、[検索search]フィールドに名前を入力します。 炎グラフタブでは、検索クエリに一致する呼び出し、パッケージ、またはクラスを含む呼び出しスタックが強調されます。 トップダウンタブとボトムアップタブでは、これらのコールスタックが他のトレース結果よりも優先されます。 検索フィールドの横にある適切なボックスをオンにすることで、次のオプションを有効にすることもできます。
- Regex:検索に正規表現を含めるには、このオ
- 大文字と小文字の一致:検索で大文字と小文字が区別される場合は、このオプションを使用します。
ヒント:スレッドのタイムラインを調べるときに、次のショートカットを使用できます。- ズームイン:Wを押すか、Ctrl(MacではCommand)を押しながらマウスホイール
- ズームアウト:Sを押すか、Ctrlキーを押しながらマウスホイールを後方にスクロールします(Macではコマンド)。
- Pan left:スペースを保持しながらAを押すか、マウスを右にドラッグします。
- Pan right:Dを押すか、スペースを保持しながらマウスを左にドラッグします。
- スレッドを展開または折りたたむ:スレッド名をダブルクリックするか、スレッドが選択されている間にEnterキーを押します。
記録設定の選択
トレース情報の記録を開始する前に、キャプチャするプロファイリング情報に適したrecordingconfigurationを選択します。
- サンプルJavaメソッ プロファイラーは、キャプチャされたデータのセットを比較して、アプリのJavaベースのコード実行に関するタイミングとリソース使用状況の情報を導
サンプルベースのトレースの固有の問題は、呼び出し履歴のキャプチャ後にアプリがメソッドに入り、次のキャプチャ前にメソッドを終了すると、そのメ このような短いライフサイクルを持つトレースメソッドに興味がある場合は、インストルメントトレースを使用する必要があります。
- Trace Java Methods:実行時にアプリを計測し、各メソッド呼び出しの開始時と終了時のタイムスタンプを記録します。 タイムスタンプが収集され、比較されて、タイミング情報やCPU使用率などのメソッドトレースデータが生成されます。
各メソッドのインストルメントに関連するオーバーヘッドは、実行時のパフォーマンスに影響し、プロファイリングデータに影響する可能性があるこ さらに、アプリが短時間で多数のメソッドを実行すると、プロファイラーがファイルサイズの制限をすぐに超え、それ以上のトレースデータを記録できな
- サンプルC/C++関数:アプリのネイティブスレッドのサンプルトレースをキャプチャします。 この設定を使用するには、Android8.0(APIレベル26)以上を実行しているデバイスにアプリをデプロイする必要があります。
内部的には、この構成は
simpleperf
を使用してアプリのネイティブコードをトレースします。 特定のデバイスCpuのサンプリングやサンプリング時間の指定など、simpleperf
simpleperf
- システムコールのトレース:アプリがシステムリソースとどのように相互作用するかを調べることができるきめ細かな詳細をキャプチャします。 スレッドの状態の正確なタイミングと期間を検査し、すべてのコアでCPUのボトルネックがどこにあるかを視覚化し、分析するカスタムトレースイベントを追加することができます。 このような情報は、パフォーマンスの問題をトラブルシューティングする際に重要になる可能性があります。 この設定を使用するには、Android7.0(APIレベル24)以上を実行しているデバイスにアプリをデプロイする必要があります。
このトレース構成を使用すると、コードをインストルメントすることにより、プロファイラのタイムラインで重要なコードルーチンを視覚的にマーク C/C++コードを計測するには、
trace.h
によって提供されるネイティブトレースAPIを使用します。 Javaコードを計測するには、Trace
systrace
systrace
コマンドラインユーティリティを使用して、CPUプロファイラーで提供されているオプション以外のオプションを指定できます。systrace
によって提供される追加のシステムレベルのデータは、ネイティブシステムプロセスを検査し、フレームのドロップまたは遅延のトラブルシューティングに役立ちます。 Android9(APIレベル28)以上を実行しているデバイスでは、System Tracingというシステムアプリを使用して、デバイス上のシステムトレースを記録できます。
録画設定の作成、編集、または表示
CPU RecordingConfigurationsダイアログで録画設定を作成、編集、および表示します。
既存の録画設定の設定を表示するには、CPU録画設定ダイアログの左ペインでそれを選択します。新しい録画設定を作成するには、次の手順を実行します。
- ダイアログの左上にある追加をクリックします。 これにより、somedefault設定を使用して新しい構成が作成されます。
- 設定に名前を付けます。
- トレース技術を選択します。
- サンプリングされた記録構成の場合は、サンプリング間隔をマイクロ秒(μ s)で指定します。 この値は、アプリの呼び出し履歴の各サンプル間の時間を表します。 指定する間隔が短いほど、記録されたデータのファイルサイズ制限が速くなります。
- 接続されたデバイスに書き込まれた記録されたデータのファイルサイズの制限をメガバイト(MB)単位で指定します。 記録を停止すると、AndroidStudioはこのデータを解析し、プロファイラウィンドウに表示します。 そのため、制限を増やして大量のデータを記録すると、Android Studioはファイルの解析にかなり時間がかかり、応答しなくなる可能性があります。注:Android8.0(APIレベル26)以上を実行している接続されたデバイスを使用する場合、トレースデータのファイルサイズに制限はなく、thisvalueは無視されます。 しかし、あなたはまだどのくらいのデータについて注意する必要がありますデバイスは、各記録の後に収集します—Android Studioは、大規模なトレースファイルを たとえば、サンプリング間隔が短いsampledtraceまたはインストルメントトレースのいずれかを記録している場合、短時間で多くのメソッドをappcallsしながら、大きな変更を受け入れ、他の設定への変更を続行するには、[適用]をクリックします。 適用されたすべての変更を受け入れてダイアログを閉じるには、okをクリックします。デバッグAPIを使用してCPUアクティビティを記録する
Debug
APIを使用すると、CPUプロファイラーでCPUアクティビティの記録を開始アプリがstartMethodTracing(String tracePath)
を呼び出すとCPUプロファイラーが記録を開始し、アプリがstopMethodTracing()
を呼び出すとCPUプロファイラーが記録を停止します。 このAPIを使用してトリガーされたCPUアクティビティを記録しながら、CPUプロファイラーはアクティブなCPU記録設定としてsdebug APIを表示します。Debug
APIを使用してCPUアクティビティの記録を制御するには、android8.0(APIレベル26)以上を実行しているデバイスにインス重要:
Debug
APIは、CPUプロファイラのグラフィカルユーザーインターフェイスのボタンやappstartupでの自動記録の記録設定の設定など、CPUactivityの記録を開始および停止するための他の手段とは別に使用されることを意図しています。バッファサイズの制限が8MBであるため、
startMethodTracing(String tracePath)
Debug
APIのstartMethodTracing(String tracePath)
メソッドは、手動で記録を開始/停止するのが難しい短い間隔やシナリオ用に設計されています。 長時間の録画の場合は、Android Studioのprofiler UIを使用します。詳細については、アプリをインストルメントしてトレースログを生成します。
アプリの起動中にCPUアクティビティを記録
アプリの起動中にCPUアクティビティを自動的に記録を開始するには、次の手順を実行します。
- 実行を選択>構成を編集します。
- プロファイリングタブで、起動時にmethodtraceの記録を開始するの横にあるチェックボックスをオンにします。
- メニューからCPUの記録設定を選択します。
- [適用]をクリックします。Android8.0(APIレベル26)以上を実行しているデバイスにアプリをデプロイするには、Run>プロファイルを選択します。CPUプロファイラでCPUアクティビティを記録した後、データasa
.trace
ファイルをエクスポートして、他のユーザーと共有したり、後で検査しCPUタイムラインからトレースファイルをエクスポートするには、次の操作を行います:
- CPUタイムラインで、エクスポートする記録されたメソッドトレースまたはシステムトレースを右クリックします。
- メニューからトレースのエクスポートを選択します。
- ファイルを保存する場所を参照し、ファイル名を指定してokをクリックします。
sessionsペインからトレースファイルをエクスポートするには、次の操作を行います。
- Sessionsペインで、エクスポートする記録されたトレースを右クリックします。
- セッションエントリの右側にある”メソッドトレースのエクスポート”または”システムトレースのエクスポート”ボタンをクリックします。
- ファイルを保存する場所を参照し、ファイル名を指定してokをクリックします。APIまたはCPUプロファイラで作成された
.trace
ファイルをインポートできます。トレースファイルをインポートするには、プロファイラのセッションペインでStart new profiler sessionをクリックし、ファイルからロードを選択します。
インポートされたトレースは、CPUプロファイラーで直接キャプチャされたトレースと同様に、次の例外を除いて、cpuプロファイラーで検査できます:
- CPUアクティビティは、CPUタイムラインに沿って表されません(システムトレースを除く)。
- Threadsセクションのタイムラインには、実行、待機、スリープなどのスレッド状態は表示されません(システムトレースを除く)。
トレースの検査
CPUプロファイラのトレースビューには、記録されたトレースからの情報を表示するいくつかの方法があります。
メソッドトレースと関数トレースの場合は、解析ペインからスレッドのタイムラインと炎チャート、トップダウン、ボトムアップの各タブでコールチャートを直接表示することができます。 システムトレースの場合は、スレッドタイムラインでトレースイベントを直接表示し、Analysispaneからflameチャート、トップダウン、ボトムアップタブを表示できます。
マウスとキーボードのショートカットは、コールチャートやトレースイベントの容易なナビゲーションのために利用可能です。
コールチャートを使用したトレースの検査
コールチャートは、メソッドtraceまたは関数traceのグラフィカルな表現を提供します。 System Apiへの呼び出しはオレンジ色で表示され、アプリ自身のメソッドへの呼び出しはオレンジ色で表示され、サードパーティApi(Java言語Apiを含む)への呼び出しは青で表示されます。 図4は、コールチャートの例を示し、特定のメソッドまたは関数の自己時間、子時間、および合計時間の概念を示しています。 これらの概念の詳細については、トップダウンとボトムアップを使用してトレースを検出する方法のセクションで学ぶことができます。
図4。 メソッドDのself、children、およびtotal timeを説明するコールチャートの例。
Tip: メソッドまたは関数のソースコードをジャンプするには、メソッドまたは関数を右クリックして[ソースにジャンプ]を選択します。 これは、分析ペインのいずれかのタブから機能します。
Flame Chartタブを使用してトレースを検査する
Flame Chartタブには、identicalコールスタックを集計する逆コールチャートが用意されています。 つまり、同じ呼び出し元のシーケンスを共有する同一のメソッドまたは関数が収集され、aflameチャートでは(acallチャートに示すように、複数の短いバーとして表示されるのではなく)一つの長いバーとして表されます。 これにより、どのメソッドや関数がほとんどの時間を消費するかを簡単に確認できます。 ただし、これは、水平軸がatimelineを表すのではなく、各メソッドorfunctionが実行するのにかかる相対的な時間を示すことも意味します。
この概念を説明するために、図5のコールチャートを考えてみましょう。 メソッドDがB(B1、B2、およびB3)を複数呼び出し、Bへのそれらの呼び出しの一部がC(C1およびC3)を呼び出します。
図5。 複数のメソッドcallsthatを持つコールチャートは、発信者の共通のシーケンスを共有しています。
B1、B2、およびB3は同じ発信者のシーケンス(A→D→B)を共有するため、図6に示すように集約されます。 同様に、C1とC3は、発信者のシーケンス(A→D→B→C)が同じであるため集約されます。c2は、発信者のシーケンス(A→D→C)が異なるため、含まれていません。
図6. 同じコールスタックを共有する同一のメソッドを集約します。
集計されたコールは、図7に示すように、炎チャートを作成するために使用されます。Flameチャート内の任意の呼び出しでは、ほとんどのCPU時間を消費するcalleesが最初に表示されることに注意してください。
図7。 図5に示すcallchartのflameチャート表現。
トップダウンとボトムアップを使用してトレースを検査
トップダウンタブには、メソッドまたは関数ノードを展開すると、そのカレールが表示されるコールのリストが表示されます。 図8は、図4のcallchartのトップダウングラフを示しています。 グラフ内の各矢印は、呼び出し元から呼び出し先を指します。
図8に示すように、トップダウンタブのメソッドAのノードを展開すると、そのcallees、methods BおよびDが表示されます。 Flame charttabと同様に、トップダウンツリーは、同じ呼び出しスタックを共有する同一のメソッドのトレース情報を集約します。 つまり、Flame chartタブには、トップダウンタブのグラフィック表現が用意されています。
トップダウンタブには、各呼び出しに費やされたCPUtimeを説明するのに役立つ次の情報が表示されます(時間は、選択した範囲におけるthreadの合計時間のパーセンテージとしても表されます)。
- Self:メソッドDの図4に示すように、メソッドまたは関数呼び出しが独自のコードの実行に費やされた時間と、メソッドDの図4に示すように、メソッドまたは関数呼び出しが独自のコードの実行に費やされた時間。
- Children:メソッドまたは関数呼び出しが独自のコードの実行に費やされた時間。d.
- 合計:メソッドの自己と子の時間の合計。 これは、メソッドDの図4に示すように、アプリが呼び出しの実行に費やした合計時間を表します。
図8。 トップダウンの木。
図9. 図8の方法Cのボトムアップツリー。
ボトムアップタブには、関数ormethodのノードを展開するとその呼び出し元が表示される呼び出しのリストが表示されます。 図8に示す例のトレースを使用して、図9にメソッドCのボトムアップツリーを示します。 注BはCを2回呼び出しますが、bはbottom up treeのノードformethod Cを展開すると一度だけ表示されます。bはbottom up treeのノードformethod Cを展開すると、bはbottom up treeのノードformethod cを その後、Bのノードを展開すると、呼び出し元、メソッドA、およびdが表示されます。
ボトムアップタブは、メソッドまたは関数をCPU時間が最も(または少 各ノードを検査して、呼び出し元がそれらのメソッドまたは関数を呼び出すCPU時間が最も多いかどうかを判断できます。トップダウンツリーと比較して、abottom up treeの各メソッドまたは関数のタイミング情報は、各ツリー(トップノード)の上部にあるメソッドを参照しています。CPU時間は、記録中のスレッドの合計時間の割合としても表されます。 次の表は、トップノードとその呼び出し元(サブノード)のtiminginformationを解釈する方法を説明するのに役立ちます。th>
子供たち 合計 自己 子供たち 合計 ボトムアップツリー(トップノード)の上部にあるメソッドまたは関数 メソッドまたは関数が独自のコードを実行するのに費やした合計時間を表しま トップダウンツリーと比較して、このタイミング情報は、記録の期間にわたるこのメソッドまたは関数へのすべての呼び出しの合計を表します。 は、メソッドまたは関数がcalleesの実行に費やした合計時間を表し、独自のコードは表しません。 トップダウンツリーと比較すると、このタイミング情報は、このメソッドまたは関数のカレールへのすべての呼び出しの合計を記録の期間にわたって表 自己時間と子時間の合計。 呼び出し元(サブノード) 呼び出し元によって呼び出されたときの呼び出し先の合計自己時間を表します。 図9のボトムアップツリーを例として使用すると、メソッドBの自己時間は、Bによって呼び出されたときのメソッドCの各実行の自己時間の合計に等しくなります。 は、呼び出し元によって呼び出されたときの呼び出し先の子時間の合計を表します。 図9のボトムアップツリーを例として使用すると、メソッドBの子時間は、Bによって呼び出されたときにメソッドCの各実行の子時間の合計に等しく 注意: 特定の記録では、プロファイラーがファイルサイズの制限に達すると、Android Studioは新しいデータの収集を停止します(ただし、これは記録を停止しません)。 このタイプのトレースでは、サンプリングされたトレースと比較して、短い時間でより多くのデータが収集されるため、これは通常、制限されたトレースを実行するときにはるかに迅速に発生します。 制限に達した後に発生した記録のaperiodに検査時間を延長すると、トレースペインのタイミングデータは変更されません(新しいデータが使用できないため)。 さらに、トレースペインには、使用可能なデータがない記録の部分のみを選択すると、タイミング情報のNaNが表示されます。
システムトレースの検査
システムトレースを検査するときに、スレッドのタイムラインでトレースイベントを調べて、各スレッドで発生するイイベントの上にマウスポインタを置くと、イベントの名前と各状態で費やされた時間が表示されます。 イベントをクリックすると、分析ペインに詳細情報が表示されます。
CPUコアペイン(図10に示すように)には、すべてのコアでスケジュールされたスレッドアクティビティが表示されます。 スレッドアクティビティの上にマウスポインタを置くと、このコアがその特定の時間に実行されているwhichthreadが表示されます。
図10. レンダースレッドのCPUアクティビティおよびトレースイベントの表示。
システムトレース情報の検査の詳細については、
systrace
ドキュメントの”investigate UIパフォーマンスの問題”セクションを参照してください。フレームレンダリングデータの検査
アプリがmainthreadと
RenderThread
で各フレームをレンダリングするのにかかる時間を検査して、UI jankとlowframeratesを引き起こフレームレンダリングデータを表示するには、システムコールをトレースできるaconfigurationを使用してトレースを記録します。 トレースを記録した後、図11に示すように、表示セクションのフレームタイムラインの下にある各フレームに関する情報を探します。
図11. 16msisよりも長い時間がかかる各フレームは赤で表示されます。