Android 12 で導入された Android ビルドシステムは、Automatic Feedback-Directed Optimization(AutoFDO)を使用するブループリント ビルドルールのあるネイティブ Android モジュールの最適化をサポートしています。AutoFDO とは、サンプリングベースの最適化手法です。AutoFDO はシステム バイナリの実行時の動作をキャプチャし、コンパイラにおけるパフォーマンスの最適化の改善を可能にするだけでなく、バイナリサイズを削減します。Android では X86、X86_64、ARM、ARM64 デバイスのプロファイル収集に対応していますが、プロファイルはアーキテクチャ間で共有できます。
AutoFDO はインストルメンテーション ベースのプロファイルに基づく最適化(PGO)の後継となります。
他のインストルメンテーション ベースのプロファイルと比べて、AutoFDO にはさらに以下のような利点があります。
目立たないデータ収集: ビルドルールを変更せずに、開発デバイスやユーザー デバイスから AutoFDO プロファイルを収集できます。
実際の使用状況の提示: ユーザー デバイスからプロファイルが収集される場合、AutoFDO は実際の使用動作を示します。それに対して、インストルメンテーション PGO は合成された収集用ワークロードを示しているのにすぎません。実際の使用状況に完全に一致する収集用ワークロードを作成するのは、一般に簡単ではありません。
AOSP には、パフォーマンスが重要なプロジェクト用に通常、AutoFDO プロファイルが用意されています。このプロファイルは、スマートフォンやタブレットから収集されたもので、一般的な使用パターンを示しています。プロファイルは toolchain/pgo-profiles/sampling
にあります。AOSP ではデフォルトで AFDO が有効になっています。
ブループリント ビルドルールで AutoFDO を有効にする
ブループリント ビルドルールで AutoFDO を有効にするには、共有ライブラリまたはバイナリルールに afdo: true
を追加します。
プロファイルを収集する
AOSP とともに事前に提供されるプロファイルは、以下のような特定のシナリオには対応していません。
- 追加の AutoFDO プロジェクトが含まれる場合
- ローカルに変更されたコードがある場合
- 固有の使用パターンがシステムに関連付けられている場合
こうしたシナリオのいずれかに該当する場合は、開発デバイスまたはユーザー デバイスから直接プロファイルを収集する必要があります。
AutoFDO プロファイルを収集するように ARM デバイスを準備する方法について詳しくは、AutoFDO の ETM データを収集するをご覧ください。
バックグラウンドでの自動プロファイル収集を有効にして、その処理とアップロードを行う方法について詳しくは、Profcollect をご覧ください。
AutoFDO プロファイルを分析する
Android は標準の LLVM AutoFDO プロファイルを使用します。AFDO プロファイルは LLVM の llvm-profdata
ツールを使用して読み取れます。afdo_summary.sh
スクリプト(toolchain/pgo-profiles/scripts/afdo_summary.sh
)は AutoFDO プロファイルに従って、最も頻繁に実行される関数を自動的に生成します。