Perfetto とは
Android 端末のシステム全体のプロファイリングを行うには、Perfetto というツールを使用します。 システム全体の動作を調査する場合、従来は Systrace を使っていましたが、Android 10 (Q) 以降は、より洗練された Perfetto で分析を行うことができます。
Android には Perfetto 用のトレースデーモンと、トレースデータを取得するための perfetto
コマンドが標準搭載されています。
取得したトレースデータは、Perfetto の Web アプリ (Perfetto UI) から読み込んで、グラフィカルな UI で分析を行うことができます。 開発 PC と Android 端末が Bluetooth や USB 接続されていれば、Perfetto UI から直接トレースデータを取得することができます。
Perfetto デーモンの有効化
(この設定は、Android 10 (Q) の端末でのみ必要です。Android 11 (R) 以降は必要ありません)
perfetto
コマンドでトレースを開始するには、Android 端末上で Perfetto デーモンを起動しておく必要があります。
次のようにシステムプロパティを設定すれば、Perfetto デーモンが起動します。
$ adb shell setprop persist.traced.enable 1
これは persist
プレフィックスの付いたプロパティなので、設定が不揮発メモリに保存されます。
Android 端末を再起動したときに設定しなおす必要はありません。
正しく Perfetto デーモンが起動していれば、次のような Logcat ログが出力されます。
$ adb logcat -s perfetto
--------- beginning of main
03-09 21:38:37.139 21766 21766 I perfetto: probes.cc:56 Starting /system/bin/traced_probes service
03-09 21:38:37.140 21765 21765 W perfetto: service.cc:65 Started traced, listening on /dev/socket/traced_producer /dev/socket/traced_consumer
03-09 21:38:37.141 21766 21766 I perfetto: probes_producer.cc:88 Connected to the service
Perfetto トレースデータの取得
次のように Android 端末上の perfetto
コマンドを実行すると、トレース結果が /data/misc/perfetto-traces/trace
ファイルとして出力されます。
出力先は -o (--out)
オプションで変更できますが、SELinux のセキュリティ制限のため、/data/misc/perfetto-traces
ディレクトリしか指定できないようになっています(errno: 13, Permission denied
が発生します)。
$ adb shell perfetto --config :test --out /data/misc/perfetto-traces/trace
--config :test
というオプションは、perfetto
コマンドにハードコードされたテスト設定を使用することを示しています(参考: Perfetto trace config)。
トレースファイルは下記のようにローカル PC へダウンロードできます。
$ adb pull /data/misc/perfetto-traces/trace
あるいは、
$ adb shell cat /data/misc/perfetto-traces/trace > ~/trace
以下のようにして、ディレクトリごとダウンロードすることもできます。
$ adb pull /data/misc/perfetto-traces
取得したトレースファイルを Perfetto UI のサイト で開けば、グラフィカルに分析を行うことができます。
Perfetto のトレース設定
perfetto
コマンドを実行するときにパラメーターを指定することで、計測時間や取得するデータのカスタマイズを行えます。
設定方法は大きく分けて、下記の 2 通りの方法があります。
- lightweight mode
-t/--time
などの個々のパラメーターを 1 つずつ設定する方法。従来のsystrace
と同様の指定 (atrace、ftrace) を行うだけでよければこの方法が使えます。- normal mode
-c/--config
オプションでコンフィグファイルを指定する方法。lightweight mode より詳細なトレース設定を行うことができます。
参考: perfetto コマンドのコマンドラインオプション。
lightweight mode(個別パラメーターで指定する方法)
perfetto
コマンドを実行するときに、次のようなオプションを使って、トレース方法を設定する方法です。
adb shell perfetto [--time TIMESPEC]
[--buffer SIZE]
[--size SIZE]
[ATRACE_CAT | FTRACE_GROUP/FTRACE_NAME]...
-t/--time TIMESPEC
… トレース時間。使える単位はs
、m
、h
(デフォルト:10s
)。-b/--buffer SIZE
… リングバッファサイズ。使える単位はmb
、gb
(デフォルト:32mb
)。-s/--size SIZE
… 最大ファイルサイズ。使える単位はmb
、gb
(デフォルトはリングバッファサイズ?)。ATRACE_CAT
… トレースする atrace カテゴリ(例:am wm gfx view
など)を指定。参考: Tracing categories(実装)FTRACE_GROUP/FTRACE_NAME
… トレースする ftrace グループ(カーネル系のトレース)(例:sched/sched_switch
、sched/*
)
normal mode(コンフィグファイルで指定する方法)
perfetto
用の設定をコンフィグファイルの形で保存しておけば、--config
オプションでそのファイル名を指定するだけで毎回同じ設定でトレースできます。
perfetto
コマンドはデバイス上で実行する都合上、コンフィグファイルはデバイス上に作成しなければいけないことに注意してください。
ただ、ファイル名として -
を指定すると標準入力から設定テキストを流し込むことができるので、これを使えばローカル PC 上のコンフィグファイルの内容をそのまま渡せます。
$ cat config.pbtx | adb shell perfetto -o /data/misc/perfetto-traces/trace --txt -c -
Windows の場合は cat
を type
に置き換えてください。
下記はコンフィグファイルの記述例です。
このようなテキスト形式のコンフィグファイルを指定する場合は、-c/--config
オプションに加えて、--txt
オプションも同時に指定する必要があります。
(応用)簡単にトレース取得できるようスクリプト化
下記のバッチファイルを実行すると、perfetto-20210309-213055.pb
のようなタイムスタンプ入りのトレースファイルを作成し、ローカル PC にダウンロードします。
トレースの設定は、先頭部分の DURATION
変数や ATRACE
変数である程度柔軟にカスタマイズできます。
perfetto デーモンが起動していない場合は、設定のヒントを表示して終了するようにしています。