R8 の最適化によってアプリのコードが更新されるため、アプリが想定どおりに機能していることを確認するために、アプリの動作を厳密にテストすることが重要です。予期しない動作が発生した場合は、このページをガイドとして使用し、最適化後に発生する可能性のある問題をトラブルシューティングしてください。
トラブルシューティングを行う際は、次の状況に焦点を当てます。
- 最適化のしすぎによるアプリのクラッシュ: R8 がコードを最適化しすぎたため、アプリがクラッシュします。
- 最適化が不明確または不十分: R8 がアプリを想定どおりに最適化しなかった場合や、最適化についてさらに説明が必要な場合。
アプリがクラッシュする
R8 で最適化した後にアプリがクラッシュした場合、通常はリフレクションの破損が原因です。破損したリフレクションを特定するには、次のガイドラインを使用します。
- 例外が発生した場合は、通常、示されたクラス、メソッド、フィールドがリフレクションで使用されていることを意味します。これらの例外は通常、
ClassNotFoundException、NoSuchMethodException、NoSuchFieldException、NoClassDefFoundError、NoSuchMethodError、NoSuchFieldErrorのいずれかです。 import kotlin.reflect.*またはimport java.lang.reflect.*でリフレクションを参照するコードが表示されます。- クラス コンストラクタが
Something::class.constructorsのように使用されていることがわかります。 Class.forName(...)が表示されます。
解決策: 保持ルールを追加します。
最適化が不明確または不十分
ルールはアプリと含まれているライブラリの両方から適用されるため、適用されたルールについてさらに明確な説明が必要になることや、最適化されるはずだったコードの特定のセクションが R8 によって保持された理由の説明が必要になることがあります。
適用されるルールに関する曖昧さ: 含まれているライブラリのルールもアプリに適用され、これらのライブラリのグローバル オプションもアプリに伝播されるため、どのルールが適用されるかわからない場合があります。
解決策: R8 がプロジェクトのビルド時に適用するすべてのルールのレポートを表示して、どのルールが適用されているかを確認します。このレポートは
./app/build/outputs/mapping/configuration.txtで確認できます。このレポートには、R8 の構成に使用されたすべてのライブラリとモジュールからマージされたすべてのルールが含まれており、非効率的なルールを特定するために使用できます。コードが多すぎる: R8 の最適化により、削除されるはずのコードが保持されることがあります。
解決策: 構成オプション
-whyareyoukeepingを使用して、コードが保持された理由を把握します。出力には、保持されたコードからアプリのエントリ ポイントの 1 つへのパスが含まれます。詳細については、-whyareyoukeepingをご覧ください。元のスタック トレースを理解するのが困難になる: R8 はさまざまな方法でコードを変更するため、スタック トレースが元のコードを参照しなくなります。たとえば、行番号やクラス名、メソッド名などが変更される可能性があります。
解決策: Android Studio Otter 3 Feature Drop と AGP 9.0 以降では、Logcat がスタック トレースを自動的に難読化解除します。ただし、以前のバージョンの Android Studio を使用している場合は、元のスタック トレースを手動で復元する必要があります。元のスタック トレースを復元するには、コマンドライン ツール パッケージにバンドルされている
retraceコマンドライン ツールを使用します。retraceを使用するには、マッピング ファイルとスタック トレース ファイルのパスを指定してコマンドを実行します。マッピング ファイル(mapping.txt)は、Android App Bundle(AAB)に自動的にバンドルされます。詳しくは、retrace のドキュメントと、クラッシュのスタック トレースを難読化解除する方法に関する Google Play Console ヘルプセンターの記事をご覧ください。Play と Firebase Crashlytics を使用する場合は、サービスがアプリユーザーから収集したクラッシュを含むmapping.txtファイルを使用します。次のコマンドは、プロジェクトのルートからretraceを実行する方法を示しています。$ANDROID_HOME/cmdline-tools/latest/bin/retrace app/build/outputs/mapping/$releaseVariant/mapping.txt trace.txt
バグを報告する
R8 で問題を解決できない場合は、バグを報告してください。