PC パソコン

Android Studio「java.lang.String is not an interface」の解決方法【matchingFallbacks】

Android StudioでmatchingFallbacksを設定したAndroidプロジェクトを同期すると、「java.lang.String is not an interface」でGradle Syncが失敗することがあります。Googleはこの問題をIssue #486826364として追跡し、Android Gradle Plugin(AGP)9.4.0-alpha02で修正しました。安定版ではAGP 9.4.0以降に修正が含まれます。

代表的なエラーログ

FAILURE: Build failed with an exception.

* What went wrong:
A build operation failed.
> java.lang.String is not an interface
  java.lang.String is not an interface

Android Studio上では「Gradle project sync failed」と表示され、スタックトレースやIDEログにmatchingFallbacksのモデル取得処理が現れる場合があります。

原因

matchingFallbacksは、要求されたBuild TypeやProduct Flavorが依存先に存在しない場合に代替Variantを選ぶAGP DSLです。該当する既知問題では、このDSLを含むプロジェクトのモデルをAndroid Studioが同期する際、文字列値を誤った型として扱う経路に入り、java.lang.String is not an interfaceが発生しました。通常のJava/Kotlinソースコードの型エラーではありません。

バージョン情報: GoogleはIssue #486826364をAGP 9.4.0-alpha02の修正項目として掲載しています。現在は過去のalpha版ではなく、修正を含む安定版AGP 9.4.0以降を使用してください。公開情報では最初の影響版が明記されていません。

発生条件

  • AndroidのBuild TypeまたはProduct FlavorでmatchingFallbacksを使用している
  • Android StudioがAGPモデルを取得するGradle Sync時に失敗する
  • Issue #486826364の修正を含まない組み合わせを使用している

推奨する解決手順

  1. DSLの記述を確認します。
    android {
        buildTypes {
            create("staging") {
                matchingFallbacks += listOf("debug", "release")
            }
        }
    }

    Kotlin DSLではリストとして指定し、文字列1個を想定外の型へ代入していないか確認します。

  2. AGP 9.4.0以降へ更新します。 application、library、dynamic-featureなど全AndroidモジュールのAGPバージョンを揃えます。
  3. 互換条件を揃えます。 AGP 9.4.0の公式条件はGradle 9.6.0、JDK 17、SDK Build Tools 36.0.0です。
  4. デーモンを停止して再同期します。
    ./gradlew --stop
    ./gradlew help --stacktrace

    その後Android Studioで「Sync Project with Gradle Files」を実行します。

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

更新までの間は、問題が発生しないことを確認済みのAGP/Android Studioの組み合わせへ一時的に戻す方法があります。また、依存元と依存先で同名のBuild Typeを用意できる場合はmatchingFallbacks自体を不要にできます。

単にキャッシュを削除しても製品側の型処理は修正されません。DSLの誤記を除外したうえで、バージョン更新または既知の正常版への切り戻しを行ってください。

確認方法

  • Gradle Syncが「BUILD SUCCESSFUL」で完了する
  • ./gradlew help --stacktraceで同じ例外が出ない
  • stagingなど対象Variantを実際にビルドできる
  • 依存先では指定した順序でFallback Variantが選択される

注意点

matchingFallbacksの順序には意味があります。例外を消すためだけに候補を入れ替えると、意図しないDebug/Release依存物が選ばれる可能性があります。また、同じメッセージはAndroid以外のツールでも発生するため、Issue #486826364に該当するのはAndroid StudioのSyncとmatchingFallbacksが結び付く場合です。

まとめ

Gradle Sync中の「java.lang.String is not an interface」がmatchingFallbacks利用時に発生する場合、AGPの既知問題が該当する可能性があります。DSLがリスト形式で正しいことを確認し、修正を含む安定版AGP 9.4.0以降とGradle 9.6.0、JDK 17へ揃えて再同期してください。

参照した公式情報