Skip to content

Flutterプロジェクトのnamespace未指定エラーの解決方法

問題の説明

Android StudioでFlutterプロジェクトのビルドを実行する際、以下のエラーが発生することがあります:

gradle
FAILURE: Build failed with an exception.

* What went wrong:
A problem occurred configuring project ':wakelock'.
> Could not create an instance of type com.android.build.api.variant.impl.LibraryVariantBuilderImpl.
   > Namespace not specified. Please specify a namespace in the module's build.gradle file like so:

     android {
         namespace 'com.example.namespace'
     }

問題の原因:

  • Android Gradle Plugin(AGP)のバージョン8以降で必須となったnamespace指定が不足
  • サードパーティライブラリ(特に:wakelockのようなFlutterプラグイン)でnamespaceが定義されていない
  • PC再フォーマット後の環境セットアップなどでAGPバージョンが自動更新された場合に発生

一般的な現象:

  • 以前は動作していたプロジェクトが突然エラーとなる
  • android/app/build.gradleにnamespaceを定義しても解決しない
  • エラーメッセージで:wakelockなどのライブラリ名が表示される

根本的な解決方法

プロジェクトレベルのbuild.gradleにnamespaceの強制指定コードを追加します。これにより使用している全ライブラリにnamespaceが適用されます。

解決策: Groovy DSL (build.gradle)

プロジェクトルートのandroid/build.gradleを開き、allprojectsブロック内に以下を追加:

groovy
allprojects {
    repositories {
        google()
        mavenCentral()
    }

    // ▼ このブロックを追加 ▼
    subprojects {
        afterEvaluate { project ->
            if (project.hasProperty('android')) {
                project.android {
                    if (namespace == null) {
                        namespace project.group
                    }
                }
            }
        }
    }
}

重要

このブロックは既存のrepositories宣言の直後に追加してください

解決策: Kotlin DSL (build.gradle.kts)

Kotlin DSLを使用している場合は次のコードを実装:

kotlin
allprojects {
    repositories {
        google()
        mavenCentral()
    }

    // ▼ Kotlin DSL用ソリューション ▼
    subprojects {
        afterEvaluate {
            if (plugins.hasPlugin("com.android.library")) {
                extensions.configure<com.android.build.gradle.LibraryExtension>("android") {
                    if (namespace == null) {
                        namespace = group.toString()
                    }
                }
            }
        }
    }
}
追加後の実行手順
  1. 変更を保存後、ターミナルで以下を実行:
bash
flutter clean
  1. Android Studioのキャッシュをクリア:
    File > Invalidate Caches / Restart...

  2. プロジェクトを再ビルド

代替解決方法

方法1: AGP(Android Gradle Plugin)のバージョンダウン

プロジェクト全体のAGPを7.x系に変更:

  1. android/gradle/wrapper/gradle-wrapper.propertiesを編集:

    properties
    distributionUrl=https://services.gradle.org/distributions/gradle-7.6.3-all.zip
  2. android/settings.gradleでプラグインのバージョン変更:

    gradle
    plugins {
        id "com.android.application" version "7.3.0" apply false
    }

方法2: 問題のあるプラグインの代替使用

:wakelockプラグインの場合)互換性のあるパッケージに切り替え:

yaml
dependencies:
  wakelock_plus: ^1.1.0  # 元のwakelockの代替

切り替え後に実行:

bash
flutter pub get

よくある関連エラーと対処法

AndroidManifest.xml エラー

flutter clean実行後に発生する場合:

xml
<!-- android/app/src/main/AndroidManifest.xml -->
<manifest 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">  <!-- tools名前空間を追加 -->
    
    <!-- ここにアプリの設定 -->
    
</manifest>

プラグイン設定の確認

ライブラリ開発者向け:各プラグインのbuild.gradleにnamespaceが定義されているか確認

groovy
android {
    namespace "com.example.plugin_name" // 必須
}

根本原因の技術的背景

Android Gradle Plugin 8.0からライブラリプロジェクトにもnamespace指定が必須化されました。多くのFlutterプラグインがこれに対応していないため発生するエラーです。今回紹介したソリューションは:

  1. すべてのサブプロジェクト(プラグイン含む)をスキャン
  2. namespaceが未定義の場合のみ自動設定
  3. 互換性のためにgroupプロパティ(package名)を流用

まとめ

対策適用ケースおすすめ度
subprojectsブロック追加既存プロジェクトを維持したい場合⭐️⭐️⭐️⭐️⭐️
AGPダウングレード緊急対応時⭐️⭐️⭐️
プラグインの差し替え特定プラグインが原因と判明時⭐️⭐️⭐️

最終的な推奨手順

  1. プロジェクトレベルのbuild.gradlesubprojectsブロックを追加
  2. flutter cleanを実行
  3. プロジェクトを再ビルド

これらの手順により、AGP 8.x環境下でもFlutterプロジェクトを円滑にビルドできるようになります。