Julia Pak
Julia Pak

Reputation: 743

flutter firebase app not running on Android: Namespace not specified

I keep getting an error when trying to run on an Android Simulator. I have firebasecore and Square in app payments in this app. This is the error:

FAILURE: Build failed with an exception.

* What went wrong:
A problem occurred configuring project ':package_info_plus'.
> 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'
     }

     If the package attribute is specified in the source AndroidManifest.xml, it can be migrated automatically to the namespace value in the build.gradle file using the AGP Upgrade Assistant; please refer to https://developer.android.com/studio/build/agp-upgrade-assistant for more information.

* Try:
> Run with --stacktrace option to get the stack trace.
> Run with --info or --debug option to get more log output.
> Run with --scan to get full insights.

* Get more help at https://help.gradle.org

BUILD FAILED in 4s

This is what I have done so far:

This is my gradlewrapper.properties file

distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.1.1-bin.zip

This is my Android level build.gradle file:

buildscript {
    ext.kotlin_version = '1.7.10'
    repositories {
        google()
        mavenCentral()
    }

    dependencies {
        classpath("com.android.tools.build:gradle:8.0.0")
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        classpath "com.google.gms:google-services:4.3.15"
    }
}

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

rootProject.buildDir = '../build'
subprojects {
    project.buildDir = "${rootProject.buildDir}/${project.name}"
}
subprojects {
    project.evaluationDependsOn(':app')
}

tasks.register("clean", Delete) {
    delete rootProject.buildDir
}

Here is my App level build.gradle file

def localProperties = new Properties()
def localPropertiesFile = rootProject.file('local.properties')
if (localPropertiesFile.exists()) {
    localPropertiesFile.withReader('UTF-8') { reader ->
        localProperties.load(reader)
    }
}

def flutterRoot = localProperties.getProperty('flutter.sdk')
if (flutterRoot == null) {
    throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.")
}

def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
if (flutterVersionCode == null) {
    flutterVersionCode = '1'
}

def flutterVersionName = localProperties.getProperty('flutter.versionName')
if (flutterVersionName == null) {
    flutterVersionName = '1.0'
}

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'com.google.gms.google-services'
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"

//I added this here for signingConfig
   def keystoreProperties = new Properties()
   def keystorePropertiesFile = rootProject.file('key.properties')
   if (keystorePropertiesFile.exists()) {
       keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
   }

android {
    compileSdkVersion 33
    ndkVersion flutter.ndkVersion

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

    kotlinOptions {
        jvmTarget = '1.8'
    }

    sourceSets {
        main.java.srcDirs += 'src/main/kotlin'
    }

    defaultConfig {
        // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
        applicationId "com.juliapak.coffeesociety"
        // You can update the following values to match your application needs.
        // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration.
        minSdkVersion 28
        targetSdkVersion 33
        versionCode flutterVersionCode.toInteger()
        versionName flutterVersionName
    }

   //added for signing app
      signingConfigs {
       release {
           keyAlias keystoreProperties['keyAlias']
           keyPassword keystoreProperties['keyPassword']
           storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null
           storePassword keystoreProperties['storePassword']
       }
   }
   buildTypes {
       release {
           signingConfig signingConfigs.release
       }
   }
  namespace 'com.juliapak.coffeesociety'
}

flutter {
    source '../..'
}

dependencies {
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
    implementation platform('com.google.firebase:firebase-bom:32.0.0')
    implementation 'com.google.firebase:firebase-analytics'
    }

I have tried switching distributionUrl=https\://services.gradle.org/distributions/gradle-8.1.1-bin.zip to 7.6.1 but it did not work either. As you can see I've also assigned a namespace. What do you recommend I do?

Upvotes: 14

Views: 26894

Answers (5)

Fadzli Razali
Fadzli Razali

Reputation: 165

This breaking changes really eat up our time a lot. In fact, most flutter libraries still not supporting namespaces & AGP 8.0 yet. Need to modified & fork out.

Even the AGP assistance doesn't help much.

I hope Google team will improve this further for smooth migration & reduce the complexity.

Upvotes: 2

Abdur Rafay Saleem
Abdur Rafay Saleem

Reputation: 875

There is a problem with the above most-voted answer: https://stackoverflow.com/a/76364984/13973939

Problem

Many packages are still using package= definition inside their AndroidManifest.xml so if you add namespace directly it will give error for all those packages to remove the package= property, which obviously is not feasible.

Solution

If you are using Gradle v8.x.x above then you have two options. Either:

  1. [RECOMMENDED] Downgrade your gradle to v7.x.x something. Not all packages support v8 at the moment so you can upgrade it later.
  2. If for any reason you don't want to downgrade. You can add the following subprojects script. NOTE: Using subprojects is a workaround and not a good practice. If not absolutely required I would suggest doing option 1.

Add this to your android/build.gradle file:

subprojects {
    project.buildDir = "${rootProject.buildDir}/${project.name}"
}
// The below script
subprojects {
   afterEvaluate { project ->
        if (project.hasProperty('android')) {
            project.android {
                if (namespace == null) {
                    namespace project.group
                }
            }
        }
    }
}
// till here
subprojects {
    project.evaluationDependsOn(':app')
}

This will add the namespace to only any packages that can support it.

Upvotes: 33

ryandra
ryandra

Reputation: 340

I have similar problem with you, the namespace already added in build.gradle (:app) but error still appear.

I resolve it by downgrade just the Android Gridle Plugin Version 8.1.2 to 7.4.2.

Before, my version is Android Gradle Plugin Version : 8.1.2 and Gradle Version : 8.4

Open your project in android studio:

  1. file > project structure
  2. menu side choose 'Project'
  3. on Android Gradle Plugin Version, click white small button on the right side or shortkey shift + enter
  4. will popup extract variable, change 'value' to 7.4.2
  5. ok > apply then, ok

Upvotes: 0

Filipe Freitas
Filipe Freitas

Reputation: 404

from experimentation, the problem is that 'namespace' needs to be specified in all modules, which includes ones from flutter packages..

coincidentally, i also had the same problem with package_info_plus.

with this SO thread, i managed to fix this specific error by adding this in the global build.grade:

subprojects{
    afterEvaluate {
        android {
            namespace 'add your namespace here'
        }
    }
}

Upvotes: 22

Camillo bucciarelli
Camillo bucciarelli

Reputation: 352

The problem can be the version of Gradle, not all package support version 8.x.x yet.

I suggest you stay on version 7.

Upvotes: 5

Related Questions