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を見据え、一時的な抑制より設定の移行を優先します。
