PC パソコン

Android Studio「DefaultAndroidLibrarySourceSet_Decorated cannot be cast to AndroidLibrarySourceSet」の解決方法

Androidライブラリモジュールでandroid.sourceSetsをKotlin DSLから設定すると、Gradleの構成段階でDefaultAndroidLibrarySourceSet_Decorated cannot be cast to AndroidLibrarySourceSetが発生することがあります。これはAGP 9.2.0で入った型の不整合による既知の回帰で、アプリモジュールではなくcom.android.libraryを適用したモジュールが対象です。GoogleはIssue #550220873として修正し、Android Studio Rabbit 1 Canary 3の修正一覧に掲載しています。

代表的なエラーログ

java.lang.ClassCastException:
class com.android.build.gradle.internal.api.DefaultAndroidLibrarySourceSet_Decorated
cannot be cast to class com.android.build.gradle.api.AndroidLibrarySourceSet

* Where:
Build file '<project>/lib/build.gradle.kts' line: 6

* What went wrong:
class com.android.build.gradle.internal.api.DefaultAndroidLibrarySourceSet_Decorated
cannot be cast to class com.android.build.gradle.api.AndroidLibrarySourceSet

./gradlew :lib:help --stacktraceのような、ビルドを実行しない構成確認だけでも失敗します。--no-configuration-cacheを付けても解消しないことが公式Issueの再現報告で確認されています。

原因

AGPのLibraryExtension.getSourceSets()が、従来パッケージのcom.android.build.gradle.api.AndroidLibrarySourceSetを要素型として公開している一方、実行時のDefaultAndroidLibrarySourceSetは新しいcom.android.build.api.dsl.AndroidLibrarySourceSetを実装しています。Kotlin DSLがassetsなどのメンバーへ触れる際に従来型へのキャストを生成するため、JVM上の名目的な型不一致でClassCastExceptionになります。

発生条件:com.android.libraryモジュールで、getter経由のandroid.sourceSets.named(...).configureを使用

確認された影響版:AGP 9.2.0、9.2.1、9.3.1、9.5.0-alpha02

正常確認版:AGP 9.0.1、9.1.1

公式修正掲載:Android Studio Rabbit 1 | 2026.2.1 Canary 3(同梱AGP 9.5.0-alpha03)

推奨する解決方法

1. Rabbit 1 Canary 3/AGP 9.5.0-alpha03以降へ更新する

公式修正が含まれるAndroid Studio Rabbit 1 Canary 3以降と、対応するAGPへ更新します。Android StudioとAGPの互換性を確認し、まず別ブランチまたはCIでGradle Syncとビルドを検証してください。

plugins {
    id("com.android.library") version "9.5.0-alpha03" apply false
}

より新しい版を使う場合は、その版の公式修正一覧と互換性情報を確認してください。プレビュー版を本番プロジェクトへ即時導入できない場合は、次の公式Issue記載の回避策を使用できます。

2. getterではなくKotlinブロック形式を使う

問題が起きる書き方は、型が不整合なgetterを経由します。

android.sourceSets.named("main").configure {
    assets.setSrcDirs(listOf("src/other/assets"))
}

公式Issueで示された回避策は、次のようにsourceSetsのKotlinブロックオーバーロードを経由する方法です。

android.sourceSets {
    named("main").configure {
        assets.setSrcDirs(listOf("src/other/assets"))
    }
}

このブロックは新しいDSLパッケージの型を使用するため、誤った従来型へのキャストを避けられます。

代替策

  • AGP 9.1.1へ一時的に戻す:公式Issueの再現結果では9.1.1以前は正常です。ただし、他の修正やcompileSdk要件との互換性を確認し、恒久対応ではなく一時固定として扱ってください。
  • 問題の設定を別APIへ移す:特定のソースディレクトリだけが目的なら、修正版へ移行するまでKotlinブロック形式に限定します。
  • getByName("main")への置換だけでは直らない:失敗原因は検索方法ではなくコンテナの要素型なので、namedからgetByNameへ変えるだけでは回避できません。

修正確認

./gradlew :lib:help --stacktrace
./gradlew :lib:assembleDebug
./gradlew :app:assembleDebug

まずライブラリモジュールの構成が通ることを確認し、続いてライブラリとアプリ双方をビルドします。Gradle Syncが成功するだけでなく、設定したassetsなどのソースディレクトリが成果物へ含まれていることも確認してください。

注意点

  • この問題はユーザーコードの明示的なキャストミスではなく、AGPの公開getterと実装型の不整合です。無関係なキャスト追加で抑え込まないでください。
  • 同じスクリプトでもcom.android.applicationモジュールは成功するため、アプリ側だけの確認では修正判定になりません。
  • Rabbit 1 Canary 3はプレビュー版です。安定版への取り込み状況は、利用する版の公式修正一覧で確認してください。

まとめ

DefaultAndroidLibrarySourceSet_Decorated cannot be cast to AndroidLibrarySourceSetは、AGP 9.2.0以降の一部バージョンで発生するライブラリ用SourceSetの型不整合です。推奨対応はRabbit 1 Canary 3/AGP 9.5.0-alpha03以降への更新です。すぐに更新できない場合は、getter形式を避けてandroid.sourceSets { ... }ブロックを使うと、公式Issueで確認された不整合経路を回避できます。

参照した公式情報