PC パソコン

Android Studio「Dynamic feature and app flavor dimensions do not match」の解決方法

Android Gradle Plugin(AGP)9.4へ更新した後、Dynamic Featureを含むプロジェクトで「Dynamic feature and app flavor dimensions do not match」など、アプリとFeatureのFlavor構成が一致しないことを示す診断が出る場合があります。AGP 9.4では両モジュール間のFlavor Dimensionを1対1で対応させる検査が追加されました。この記事では、設定の差分を特定し、安全に揃える手順を解説します。

代表的なエラー

Dynamic feature and app flavor dimensions do not match
The dynamic feature module must have the same flavor dimensions as the base application module.

実際の文言や警告・エラーの扱いはAGPの版や構成により異なりますが、「base appとdynamic featureのdimension/flavorが一致しない」という内容が判断材料です。

原因

Dynamic FeatureはベースアプリのVariantに組み込まれるため、両者のFlavor Dimensionと各Product Flavorが対応している必要があります。ベースアプリにだけtierがある、同じFlavorを別のDimensionへ割り当てている、Feature側に不要なDimensionが残っている、といった差が原因になります。

GoogleのAGP 9.4リリースノートでは、Dynamic FeatureとAndroidアプリの間で厳密な1対1のFlavor Dimension parityを検査すると説明されています。AGP 9.4では問題を報告し、AGP 10ではエラーになる予定です。単なるキャッシュ破損ではありません。

発生条件・対象バージョン

  • AGP 9.4以降を使用している
  • ベースアプリがcom.android.application、Featureがcom.android.dynamic-featureを使用している
  • 両モジュールのflavorDimensionsまたはproductFlavorsが1対1で対応していない

AGP 9.4で検査が導入されたため、以前から存在した不整合がアップデート後に初めて表面化することがあります。これは特定パッチで修正される不具合ではなく、ビルド設定を移行する必要がある互換性変更です。

推奨する解決手順

1. 全モジュールのFlavor設定を比較する

./gradlew :app:tasks --all
./gradlew :feature:tasks --all

app/build.gradle(.kts)と各Dynamic Featureの設定を並べ、Dimension名、Flavor名、割り当て先を確認します。

2. ベースアプリとFeatureを同じ構成にする

// app/build.gradle.kts と feature/build.gradle.kts
android {
    flavorDimensions += listOf("environment", "tier")
    productFlavors {
        create("dev") { dimension = "environment" }
        create("prod") { dimension = "environment" }
        create("free") { dimension = "tier" }
        create("paid") { dimension = "tier" }
    }
}

名前だけでなく、各Flavorのdimensionも一致させます。複数のDynamic Featureがある場合はすべて確認してください。

3. 不要なFlavorを整理する

Feature側で独自の配信条件が必要な場合でも、ビルドVariantのFlavor構成を勝手に増減させるのではなく、Play Feature Deliveryの配信条件など目的に合う仕組みを検討します。

4. Syncと全Variantのビルドを行う

./gradlew clean
./gradlew assemble
./gradlew bundle

通常使うVariantだけでなく、CIで組み立てるVariantも確認します。

代替策

すぐに全構成を揃えられない場合、AGP 9.4リリースノートに記載されたVariant APIの一時的なオプトアウトが利用できるか、使用中の正確な9.4.x版の公式資料で確認してください。ただしAGP 10では厳格化されるため、恒久策は1対1の構成へ移行することです。AGPを以前の版へ戻す方法も短期的な切り分けに限り、セキュリティ修正や他の互換条件を確認してください。

確認方法

  • Gradle Syncで不一致の診断が消える
  • assembleとbundleが成功する
  • 期待するapp/featureのVariant組み合わせだけが生成される
  • Play ConsoleへアップロードするBundleにFeatureが正しく含まれる

注意点

missingDimensionStrategyはライブラリ依存のVariant選択に使う設定であり、ベースアプリとDynamic Featureの1対1 parityを置き換える万能な回避策ではありません。また、キャッシュ削除だけでは設定不一致は直りません。Convention Pluginや共通関数でFlavor定義を共有すると、再発を防ぎやすくなります。

まとめ

この診断は、AGP 9.4がDynamic FeatureとベースアプリのFlavor Dimension不一致を検出したものです。両モジュールのDimension名、Flavor名、割り当てを1対1で揃え、全Variantを再ビルドしてください。AGP 10を見据え、一時的な抑制より設定の移行を優先します。

公式情報