PC パソコン

Android Studio「Must be one of: … [WrongConstant]」が正しいネスト@IntDef定数で出る場合の解決方法

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)
}

モジュール全体で検査を無効化すると、本当に不正な整数値を見逃します。抑制は値を確認した行だけに限定してください。

確認方法

  1. 解決されたAGPが9.2.0以降か確認する
  2. ./gradlew clean lintを実行する
  3. 正しい定数の警告が消えたことを確認する
  4. 試験的に一覧外の値を渡し、本物のWrongConstantは検出されることを確認する

注意点

  • @IntRangeやリソース型アノテーションの類似エラーは別原因の場合があります。
  • 独自Lintプラグインによる診断は、そのプラグイン側の更新が必要なことがあります。
  • 過去のalpha版へ上げる必要はなく、現在利用できる安定版9.2.0以降を選べます。

まとめ

正しいネスト@IntDef定数でMust be one of: … [WrongConstant]が出る場合、AGP 9系Lintの既知問題が疑われます。値を確認したうえでAGP 9.2.0以降へ更新し、GradleのLintタスクで再検証してください。更新までの抑制は確認済み箇所だけに限定します。

参照した公式情報