Skip to content

Namespace not specifiedエラーの解決方法

重要

このエラーはAndroid Gradle Plugin (AGP) 8.0以降でnamespaceが明示的に定義されていない場合に発生します。2023年後半以降のAndroid Studioアップデートでは必須対応となっています。

問題の根本原因

最新のGradle(8.0+)とAndroid Gradle Plugin(AGP 8.0+)を使用する場合、以下のエラーがビルド時に発生します:

Namespace not specified. Please specify a namespace in the module's build.gradle file like so:

android {
    namespace 'com.example.namespace'
}

エラーメッセージが示す通り、モジュールレベルのbuild.gradleファイルにnamespaceが定義されていないことが主な原因です。

背景知識

  • Android Gradle Plugin 8.0以降、マニフェストのpackage属性よりbuild.gradlenamespaceが優先されるよう変更
  • Flutterプロジェクトでは特に、Androidネイティブモジュールの設定が必要
  • 依存関係にあるサードパーティライブラリもnamespaceを定義していない場合、同様のエラーが発生

基本的な解決方法:アプリケーションモジュールへのnamespace追加

android/app/build.gradleファイルを開き、androidブロック内にnamespaceを追加します:

groovy
android {
    namespace "com.example.xxxxx"  // 実際のパッケージ名に変更
    
    // 既存の設定はそのまま維持
    compileSdkVersion flutter.compileSdkVersion
    // ... その他の設定
}

パッケージ名の決め方

namespaceの値は通常、マニフェストファイルに記載されているpackage属性またはdefaultConfig内のapplicationIdと一致させます:

groovy
defaultConfig {
    applicationId "com.example.xxxxx"
}

依存ライブラリでエラーが発生する場合の対処法

サードパーティライブラリ(特に古いバージョンのもの)がnamespaceを定義していない場合、プロジェクト全体に対してデフォルトnamespaceを設定します。

android/build.gradleファイルに以下を追加:

groovy
subprojects {
    afterEvaluate { project ->
        if (project.hasProperty('android')) {
            project.android {
                if (namespace == null) {
                    namespace project.group  // グループ名をnamespaceとして使用
                    // または明示的に指定: namespace 'com.example.library'
                }
            }
        }
    }
}

注意点

この設定は依存ライブラリのビルド問題を解決しますが、各モジュールに適切なnamespaceが設定されていることがベストプラクティスです。

補助的なトラブルシューティング

1. 非推奨パッケージの更新・削除

pubspec.yamlで非推奨(discontinued)とマークされているパッケージを使用している場合、エラーの原因になることがあります:

bash
flutter pub outdated  # 非推奨パッケージを確認
flutter pub upgrade   # パッケージを更新

2. Flutterプロジェクトの完全再生成

設定変更後のビルドが不安定な場合、プロジェクトを再生成:

bash
flutter clean        # ビルドキャッシュの削除
flutter pub get      # 依存関係の再取得
flutter create .     # プロジェクトファイルの再生成

3. マニフェストのpackage属性移行 (オプション)

従来のAndroidManifest.xmlpackage属性から移行する場合:

xml
<manifest 
    xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.oldpackage"> <!-- この値をnamespace設定に流用可能 -->

AGPアップグレードアシスタント(公式ドキュメント)で自動移行も可能です。

推奨される完全な設定例

android/app/build.gradleの完全なサンプル:

groovy
android {
    compileSdkVersion flutter.compileSdkVersion
    ndkVersion flutter.ndkVersion

    namespace "com.example.xxxxx"  // 必須設定

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

    defaultConfig {
        applicationId "com.example.xxxxx"  // namespaceと一致が望ましい
        minSdkVersion flutter.minSdkVersion
        targetSdkVersion flutter.targetSdkVersion
        versionCode flutterVersionCode.toInteger()
        versionName flutterVersionName
    }

    buildTypes {
        release {
            signingConfig signingConfigs.debug
        }
    }
}

::: success 確認ポイント

  • namespaceモジュールレベルのbuild.gradle(app/build.gradle) に設定されているか
  • プロジェクトレベルの設定(android/build.gradle)にsubprojectsブロックが必要かどうか
  • Flutter パッケージの依存関係が最新版であるか :::

よくあるケース別解決フロー

  1. シンプルなアプリの場合 → アプリのbuild.gradlenamespaceを追加
  2. サードパーティライブラリ使用時 → プロジェクトのbuild.gradlesubprojects設定を追加
  3. エラーが解決しない場合
    • flutter cleanでキャッシュ削除
    • ${applicationName}などの変数がマニフェストにないか確認
    • AGPアップグレードアシスタントを実行