Skip to content

BuildConfigフィールドのカスタム設定によるビルドエラーの解決

問題の発生条件

Android Studio Flamingo以降(AGP 8.0+)で以下のエラーが発生する場合:

Build Type 'release' contains custom BuildConfig fields, but the feature is disabled.

このエラーは、カスタムBuildConfigフィールドを使用しているのに、モジュールで機能が無効になっている場合に発生します。

🛠️ 推奨解決策:モジュールごとの設定

各モジュールのbuild.gradleファイルに次の設定を追加します:

kotlin
android {
    buildFeatures {
        buildConfig = true  // BuildConfig機能を明示的に有効化
    }
}

🔧 代替解決策(マルチモジュールプロジェクト)

サブプロジェクトを含む場合はルートのbuild.gradleに設定:

kotlin
subprojects {
    afterEvaluate { project ->
        if (project.hasProperty('android')) {
            project.android {
                buildFeatures {
                    if (buildConfig == null) {
                        buildConfig true  // 未設定の場合のみ有効化
                    }
                }
            }
        }
    }
}

⚠️ 非推奨な方法(避けるべき)

gradle.propertiesでのグローバル設定はAGP 9.0で削除予定のため推奨されません:

properties
# 非推奨!将来的に動作しなくなる
android.defaults.buildfeatures.buildconfig=true

🚀 Android Studioの組み込みツール

以下の手順で自動移行可能(Android Studio Jellyfish 2023.3.1以降):

  1. プロジェクトツリーでプロジェクトルートを選択
  2. メニューから Refactor > Migrate Build Config to Gradle Build Files を実行

💡 カスタムBuildConfigフィールドの新設定例

kotlin
import com.android.build.api.variant.BuildConfigField

androidComponents {
    onVariants {
        it.buildConfigFields.put(
            "BUILD_TIME", 
            BuildConfigField("String", "\"${System.currentTimeMillis()}\"", "ビルド時刻")
        )
    }
}
kotlin
val buildDate = Date(BuildConfig.BUILD_TIME.toLong())
println("APKビルド時刻: $buildDate")

なぜこの設定が必要か?

AGP 8.0から:

  1. buildConfigFieldはデフォルトで無効化されました
  2. 従来のgradle.properties設定は非推奨に
  3. モジュール単位での明示的有効化が必須となりました

ベストプラクティス

  • プロジェクト全体設定よりモジュール単位の設定を優先
  • 新しいandroidComponentsAPIでカスタムフィールドを定義
  • 非推奨API使用時はAndroid Studioの移行ツールを活用

この設定変更により、カスタムBuildConfigフィールドを安全に利用しつつ、将来のAGPバージョンアップにも対応できます。