R8 の最適化によってアプリのコードが更新されるため、アプリが想定どおりに機能していることを確認するには、アプリの動作を十分に テストすることが重要です。予期しない動作が発生した場合は、このページをガイドとして、最適化後の潜在的な問題をトラブルシューティングしてください。最適化のトラブルシューティングに使用できる ルールについて詳しくは、 ルールを使用して最適化のトラブルシューティングを行うをご覧ください。
トラブルシューティングを行う際は、次の状況に注目してください。
- 最適化が過剰でアプリがクラッシュする: R8 がコードを最適化しすぎたためにアプリがクラッシュします。
- 最適化が不明確または不十分: R8 がアプリを想定どおりに 最適化しなかった場合や、最適化についてさらに説明が必要な場合。
アプリがクラッシュする
R8 で最適化を行った後にアプリがクラッシュした場合は、通常、リフレクションが破損していることが原因です。リフレクションの破損を特定するには、次のガイドラインを使用します。
- 示されたクラス、メソッド、フィールドがリフレクションを介して使用されていることを示す例外が発生します。これらの例外は通常、
ClassNotFoundException、NoSuchMethodException、NoSuchFieldException、NoClassDefFoundError、NoSuchMethodError、NoSuchFieldErrorのいずれかです。 import kotlin.reflect.*またはimport java.lang.reflect.*を使用してリフレクションを参照するコードが表示されます。- クラス コンストラクタが
Something::class.constructorsのように使用されていることがわかります。 Class.forName(...)が表示されます。
解決策: keep ルールを追加します。
独自コードでリフレクションを実行する場合は、keep ルールを追加する代わりに、 Jetpack Keep アノテーションでそのコードにアノテーションを付けることができます。Jetpack Keep lint チェックでは、アノテーションが付けられていない他のリフレクション呼び出しにもフラグが立てられるため、同様のクラッシュを防ぐことができます。
最適化が不明確または不十分
ルールはアプリと含まれているライブラリの両方から適用されるため、適用されるルールについてさらに明確にする必要がある場合や、最適化されるはずのコードの特定のセクションが 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 ヘルプセンターの記事をご覧ください。Google Play と Firebase Crashlytics を使用する場合は、アプリユーザーからサービスが収集したクラッシュでmapping.txtファイルを使用します。次のコマンドは、プロジェクトのルートからretraceを実行する方法を示しています。$ANDROID_HOME/cmdline-tools/latest/bin/retrace app/build/outputs/mapping/$releaseVariant/mapping.txt trace.txt
バグを報告する
R8 で問題を解決できない場合は、バグを報告してください。