最適化のトラブルシューティング

R8 の最適化によってアプリのコードが更新されるため、アプリが想定どおりに機能していることを確認するために、アプリの動作を厳密にテストすることが重要です。予期しない動作が発生した場合は、このページをガイドとして使用し、最適化後に発生する可能性のある問題をトラブルシューティングしてください。

トラブルシューティングを行う際は、次の状況に焦点を当てます。

  • 最適化のしすぎによるアプリのクラッシュ: R8 がコードを最適化しすぎたため、アプリがクラッシュします。
  • 最適化が不明確または不十分: R8 がアプリを想定どおりに最適化しなかった場合や、最適化についてさらに説明が必要な場合。

アプリがクラッシュする

R8 で最適化した後にアプリがクラッシュした場合、通常はリフレクションの破損が原因です。破損したリフレクションを特定するには、次のガイドラインを使用します。

  • 例外が発生した場合は、通常、示されたクラス、メソッド、フィールドがリフレクションで使用されていることを意味します。これらの例外は通常、ClassNotFoundExceptionNoSuchMethodExceptionNoSuchFieldExceptionNoClassDefFoundErrorNoSuchMethodErrorNoSuchFieldError のいずれかです。
  • 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 で問題を解決できない場合は、バグを報告してください。