PC パソコン

Android Studio「ClassNotFoundException: Didn’t find class ‘com.android.tools.r8.RecordTag’」の原因と解決方法

Android Gradle Plugin(AGP)9.2.0へ更新した後、アプリの起動時や特定処理の実行時に「java.lang.ClassNotFoundException: Didn’t find class ‘com.android.tools.r8.RecordTag’」が発生することがあります。

Googleの公式リリースノートでは、この問題がAGP 9.2.1の修正項目として明記されています。AGP 9.2.0固有の不具合に該当する場合、ProGuardルールやアプリコードを変更するより、AGPを9.2.1以降へ更新するのが基本的な解決方法です。

表示されるエラー

java.lang.ClassNotFoundException:
Didn't find class "com.android.tools.r8.RecordTag"

スタックトレースには、DEX、クラスローダー、R8/D8、Java Recordを使用するライブラリなどが含まれる場合があります。アプリのソースコード内でRecordTagを直接参照していなくても発生します。

原因

com.android.tools.r8.RecordTagは、R8/D8がJava Recordとの互換処理で利用する内部的なクラスです。この例外は、実行時に必要とされたクラスが生成済みDEX内に存在しないことを示します。

特にAGP 9.2.0への更新後に初めて発生した場合は、アプリ側のクラス名の間違いではなく、AGPに同梱されたビルドツール側の回帰不具合である可能性が高いです。GoogleはIssue #504996348をAGP 9.2.1の修正済み問題として掲載しています。

このエラーだけを理由に、com.android.tools.r8.RecordTagという空クラスをアプリ内へ自作しないでください。R8の内部実装と衝突し、別の実行時不具合を招く可能性があります。

解決方法1:AGP 9.2.1以降へ更新する

AGP 9.2.0を使用している場合は、まず9.2.1以降へ更新します。

plugins {
    id("com.android.application") version "9.2.1" apply false
    id("com.android.library") version "9.2.1" apply false
}

Version Catalogを使う場合は、gradle/libs.versions.tomlを更新します。

[versions]
agp = "9.2.1"

[plugins]
android-application = {
    id = "com.android.application",
    version.ref = "agp"
}
android-library = {
    id = "com.android.library",
    version.ref = "agp"
}

AGP 9.2系の公式互換条件はGradle 9.4.1、JDK 17です。AGPだけを更新せず、Gradle WrapperとAndroid StudioのGradle JDKも確認してください。

解決方法2:クリーンビルドとアプリの再インストール

AGPを更新した後は、AGP 9.2.0で作られた中間生成物や端末上の旧APKを残さないようにします。

./gradlew --stop
./gradlew clean
./gradlew :app:assembleDebug --refresh-dependencies

次に、端末またはエミュレータから旧アプリをアンインストールして、修正版でビルドしたAPKを再インストールします。Instant Run相当の差分配置や古いDEXが残っている可能性を切り分けられます。

解決方法3:すぐ更新できない場合はAGPを戻す

プラグイン互換性などの理由でAGP 9.2.1へ更新できない場合は、一時的に問題発生前のAGP 9.1.1などへ戻す方法があります。

plugins {
    id("com.android.application") version "9.1.1" apply false
}

AGPを戻すときは、そのバージョンに対応するGradle Wrapperへも戻してください。AGPとGradleの非対応な組み合わせを使うと、別のSyncエラーが発生します。

特定ライブラリでのみ発生する場合の確認

AGP 9.2.1以降でも例外が残る場合は、Java Recordを含む依存ライブラリや、独自にR8/D8を呼び出すプラグインが古い可能性があります。

  1. ./gradlew :app:dependenciesで依存関係を確認します。
  2. 最近更新したライブラリを一つずつ切り分けます。
  3. 独自R8バージョンをbuildscriptで強制していないか確認します。
  4. 問題ライブラリの最新版とAndroid対応状況を確認します。
./gradlew :app:dependencies
./gradlew :app:assembleRelease --stacktrace --info

ProGuardルールを追加すべきか

AGP 9.2.0固有の問題であれば、keepルールの追加は第一選択ではありません。まずAGP 9.2.1以降で再ビルドしてください。

修正版でもReleaseビルドだけで発生する場合は、mapping.txt、missing_rules.txt、R8の警告を確認し、実際に不足しているアプリまたはライブラリのクラスに対してのみルールを追加します。根拠なくR8全体や広いパッケージをkeepすると、APKサイズや最適化へ悪影響が出ます。

修正確認の手順

  1. AGPが9.2.1以降になっていることを確認します。
  2. Gradle WrapperがAGPの互換表に合っていることを確認します。
  3. clean後にAPKまたはApp Bundleを新規作成します。
  4. 端末から旧アプリを削除して再インストールします。
  5. DebugとReleaseの両方で、例外が発生していた操作を再現します。

注意点

Android Studioの「Invalidate Caches」だけでは、AGP 9.2.0に含まれる不具合そのものは修正されません。キャッシュ操作は更新後の古い生成物を除去する補助作業として行ってください。

また、「Gradle 9.2.0」という表現がAGP 9.2.0を指して使われることがあります。確認すべきなのはcom.android.applicationまたはcom.android.libraryプラグインのバージョンです。

まとめ

「Didn’t find class ‘com.android.tools.r8.RecordTag’」がAGP 9.2.0への更新後に発生した場合、AGP 9.2.1で公式に修正された既知問題である可能性があります。AGP 9.2.1以降へ更新し、クリーンビルドとアプリの再インストールを行ってください。修正版へ移れない場合は、AGP 9.1.1への一時的なロールバックが現実的です。

参考:Android Gradle Plugin 9.2 release notes/Google Issue Tracker #504996348