Android StudioやGradle Lintで、@IntDefに含まれる正しい定数を渡しているのに、Must be one of: … [WrongConstant]と誤判定されることがあります。ネストした型に定数を置いたプロジェクトで発生するAGP 9系Lintの既知問題と、公式修正版、回避策を解説します。
代表的なログ
src/main/java/com/example/Sample.kt:42: Error:
Must be one of: Mode.NONE, Mode.BASIC, Mode.ADVANCED [WrongConstant]
原因
LintがネストされたクラスやKotlinオブジェクト内の@IntDef定数を正しく追跡できない不具合です。Google Issue Tracker #478779827で追跡され、AGP 9.2.0-alpha08で修正されました。安定版では修正を含むAGP 9.2.0以降を利用できます。
注意:すべてのWrongConstantが誤検出ではありません。渡した値がアノテーションの許可リスト内か、先に確認してください。
発生条件・対象バージョン
- 修正前のAGP 9系でLintを実行する
- 引数やプロパティを
@IntDefで制限している - 許可定数がネストしたクラス、インターフェース、オブジェクトにある
- 一覧内の定数にも
WrongConstantが付く
誤検出か確認する
object Mode {
const val NONE = 0
const val BASIC = 1
const val ADVANCED = 2
@IntDef(NONE, BASIC, ADVANCED)
@Retention(AnnotationRetention.SOURCE)
annotation class Value
}
fun configure(@Mode.Value mode: Int) { }
configure(Mode.BASIC)
Mode.BASICが定義済みなのに警告されるなら既知問題の条件に合います。一覧外の値や数値リテラルなら、本物のエラーである可能性があります。
推奨する解決手順
1. AGPを9.2.0以降へ更新する
plugins {
id("com.android.application") version "9.2.0" apply false
id("com.android.library") version "9.2.0" apply false
}
Version Catalogの場合は次のように更新します。
[versions]
agp = "9.2.0"
2. 互換性を揃える
AGP 9.2リリースノートを確認し、Gradle Wrapper、ビルドJDK、SDKを対応する組み合わせにします。Android Studio本体だけ更新しても、プロジェクトが古いAGPを固定していればGradle Lintは改善しません。
3. Lintを再実行する
./gradlew --stop
./gradlew clean lint
CIだけで発生する場合は、ローカルとCIのAGP・Gradle・JDKが一致するか確認します。
更新できない場合の代替策
- 定数をトップレベルまたは浅い構造へ一時的に移す
- 確認済みの誤検出箇所だけ
@SuppressLint("WrongConstant")を付ける - Lint baselineに既知の誤検出だけを登録する
@SuppressLint("WrongConstant")
fun applyKnownValidMode() {
configure(Mode.BASIC)
}
モジュール全体で検査を無効化すると、本当に不正な整数値を見逃します。抑制は値を確認した行だけに限定してください。
確認方法
- 解決されたAGPが9.2.0以降か確認する
./gradlew clean lintを実行する- 正しい定数の警告が消えたことを確認する
- 試験的に一覧外の値を渡し、本物の
WrongConstantは検出されることを確認する
注意点
@IntRangeやリソース型アノテーションの類似エラーは別原因の場合があります。- 独自Lintプラグインによる診断は、そのプラグイン側の更新が必要なことがあります。
- 過去のalpha版へ上げる必要はなく、現在利用できる安定版9.2.0以降を選べます。
まとめ
正しいネスト@IntDef定数でMust be one of: … [WrongConstant]が出る場合、AGP 9系Lintの既知問題が疑われます。値を確認したうえでAGP 9.2.0以降へ更新し、GradleのLintタスクで再検証してください。更新までの抑制は確認済み箇所だけに限定します。
