Skip to content

namespace not specified

問題文

Android Gradle Plugin (AGP) 8.0.0 以降へアップグレード後に発生する Namespace not specified エラーは、主に以下の状況で発生します:

  1. AGP 8.0.0以上の導入時:ネームスペース定義が必須となったため
  2. 旧式プロジェクトの移行:AndroidManifest.xml の package 属性が build.gradle へ移行されていない
  3. サードパーティライブラリやプラグイン:未対応の依存関係が存在する場合(特にFlutter/Capacitorプロジェクト)

WARNING

Ionic/Capacitorプロジェクトで頻発:サードパーティプラグインがネームスペース未定義だとエラーが継続します。該当エラーメッセージ:

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

解決策

方法1:AGP Upgrade Assistantの使用(推奨)

Android Studio の組み込みツールで安全に移行:

  1. AndroidフォルダをAndroid Studioで開く
    Flutter/Capacitor プロジェクトの場合:プロジェクトルート/android を開く

  2. AGP Upgrade Assistantを実行
    AGP Upgrade Assistant 起動画面

    • ビルド終了後、右下ポップアップの Start AGP Upgrade Assistant をクリック
    • 指示に従い全手順を適用
  3. トップレベルの build.gradle を編集
    android/build.gradle に以下を追加:

groovy
buildscript {
    ext.kotlin_version = '1.9.0' // 最新版を推奨
    dependencies {
        classpath 'com.android.tools.build:gradle:8.1.2' // AGP 8.x
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}

allprojects {
    repositories {
        google()
        mavenCentral()
    }
    // エラー解決のコア部分
    subprojects {
        afterEvaluate { project ->
            if (project.hasProperty('android')) {
                project.android {
                    if (namespace == null) {
                        namespace project.group // 自動命名
                    }
                }
            }
        }
    }
}

方法2:手動でネームスペースを定義

個別のモジュール(app や プラグイン)に対して直接指定:

  1. モジュールの build.gradle を編集
    android ブロック内に namespace を追加:
groovy
android {
    namespace 'com.example.app' // 実際のパッケージ名に変更
    compileSdk 34
    // ... 既存の設定
}
  1. AndroidManifest.xml の修正
    package 属性を削除(AGP 8.x では不要):
diff
<manifest 
    xmlns:android="http://schemas.android.com/apk/res/android"
-   package="com.example.app">

方法3:プラグイン問題への対処

未更新プラグインが原因の場合のワークアラウンド:

  1. エラー発生プラグインを特定
    Sync エラーログで失敗モジュールをチェック: 同期エラーの例

  2. プラグインを更新
    以下のいずれかで対応:

    • プラグインの最新版に更新
    • 代替ライブラリを採用
    • メンテナーに修正を依頼

即時対応が必要な場合

暫定的な名前空間付与(一時的な解決策):

groovy
subprojects {
    afterEvaluate { project ->
        if (project.hasProperty('android') && project.android.namespace == null) {
            project.android.namespace "temp.${project.name.replace('-', '_')}"
        }
    }
}

解説

なぜこのエラーが発生するか

  • AGP 8.0の仕様変更: AndroidManifest.xmlpackage 属性が非推奨化され、build.gradlenamespace 定義が必須に
  • プラグインの互換性問題: 特に fluttertoast や一部 Capacitor プラグインが未対応であるケースが多い
  • キャッシュの影響: 古いビルドキャッシュが残りエラーが継続する場合あり

解決策の仕組み

groovy
subprojects {
    afterEvaluate {
        if (project.hasProperty('android') && android.namespace == null) {
            android.namespace = // 命名ロジック
        }
    }
}
  • サブプロジェクト評価後: 全依存モジュールの設定完了後にネームスペースが存在するかチェック
  • 動的命名: 未定義の場合に自動付与しビルドプロセスを継続
  • 後方互換性: AGP 7.x では無視されるため安全

備考

  • キャッシュクリアの重要性: 変更後に Build > Clean ProjectFile > Invalidate Caches / Restart を実行
  • 長期的な解決: サードパーティプラグインはネイティブ対応を要請
  • 検証済み環境:
    • Android Studio Flamingo 2022.2.1+
    • AGP 8.1.2
    • Flutter 3.13+, Capacitor 5+

非推奨な回避策

下記方法は一時的にエラーを隠蔽しますが、根本解決にはなりません:

  • gradle.propertiesandroid.defaults.buildfeatures.namespace=true を追加
  • AGP を 7.x にダウングレード