PC パソコン

Android Studio Lint「UnsupportedClassVersionError: class file version 65.0」の解決方法

Java 21でコンパイルした独自LintチェックをAndroidプロジェクトから読み込むと、Lintタスクが「UnsupportedClassVersionError」や「class file version 65.0」を伴って失敗することがあります。Googleは「Android Lint fails with custom lint checks compiled to Java 21 bytecode」をIssue #314101896として追跡し、Android Gradle Plugin(AGP)9.2.0で修正済みとしています。

代表的なエラーログ

Execution failed for task ':app:lintAnalyzeDebug'.
> A failure occurred while executing lint
  java.lang.UnsupportedClassVersionError:
  com/example/lint/CustomIssueRegistry has been compiled by a more
  recent version of the Java Runtime (class file version 65.0)

実際のクラス名やLintタスク名は異なります。Java 21のクラスファイル番号は65であり、スタックトレースが独自LintのIssueRegistryやDetectorを示す点が識別材料です。

原因

アプリ本体ではなく、lintChecksや公開済みLintルールJARとして読み込まれるカスタムチェックがJava 21バイトコードで作られているとき、旧Lint統合がそのクラスを正しく読み込めず失敗する既知問題です。GoogleのAGP 9.2.0リリースノートはIssue #314101896をLint Integrationの修正済み項目に掲載しています。

対象バージョン: 公式情報で確認できる修正版はAGP 9.2.0です。問題が最初に導入されたAGPバージョンは公開リリースノートに明記されていないため、旧版すべてが影響を受けるとは断定できません。

発生条件

  • 独自Lintモジュールまたは依存JARをJava 21のバイトコードでコンパイルしている
  • そのルールをlintChecksまたはライブラリのLint JARとして読み込む
  • Issue #314101896の修正を含まないAGP/Lint統合を使用している

推奨する解決手順

  1. 失敗しているJARを特定します。
    ./gradlew :app:lintDebug --stacktrace

    スタックトレースで最初に現れる自作または外部Lintクラスを確認します。

  2. AGP 9.2.0以降へ更新します。 AGP 9.2の互換表に合わせ、Gradle Wrapperは9.4.1以上、Gradle JVMはJDK 17を使用します。
  3. 既存デーモンを停止して再実行します。
    ./gradlew --stop
    ./gradlew clean
    ./gradlew :app:lintDebug --stacktrace
  4. CIでも同じバージョンを確認します。 ./gradlew --versionとバージョンカタログ、プラグイン宣言を照合します。

更新できない場合の代替策

AGPをすぐ更新できない場合は、カスタムLintモジュールの出力をJava 17に下げて再公開します。

java {
    toolchain {
        languageVersion.set(JavaLanguageVersion.of(17))
    }
}

tasks.withType<JavaCompile>().configureEach {
    options.release.set(17)
}

Kotlinを含む場合も、Java 17相当のJVMターゲットへ揃えてください。これは互換性のための回避策であり、公式に確認された製品側の修正はAGP 9.2.0です。

確認方法

  • :app:lintDebugとRelease向けLintが完了する
  • CIでも同じLintルールを読み込める
  • ログからUnsupportedClassVersionErrorとclass file version 65.0が消える
  • Lintレポートに独自ルールの検出結果が含まれ、単にルールが読み飛ばされていない

注意点

Gradleを動かすJDK、アプリのsourceCompatibility、LintルールJARのバイトコードは別の設定です。AGP 9.2の公式JDK要件は17ですが、この修正はJava 21バイトコードで作られたカスタムLintチェックの読み込みを対象にしています。アプリ全体を無条件にJava 21へ変更する必要はありません。

まとめ

独自Lintが「class file version 65.0」で失敗する場合は、Java 21で作られたLint JARと旧Lint統合の組み合わせを確認してください。第一選択はAGP 9.2.0以降への更新です。更新できない間はLintモジュールをJava 17向けに再コンパイルし、ローカルとCIの両方で検証します。

参照した公式情報