Cannot add extension with name 'googleServices' on gradle sync

14,351

Solution 1

I comment line 16

//apply plugin: com.google.gms.googleservices.GoogleServicesPlugin

on cordova-support-google-services/appname-build.gradle

and its compile

Solution 2

I solved this problem by

I comment

apply plugin: com.google.gms.googleservices.GoogleServicesPlugin

in platforms/android/cordova-plugin-fcm-with-dependecy-updated/peerform-FCMPlugin.gradle

Ionic version: 4 Date: Dec 12 2019

Solution 3

Adding the next line to the bottom of my build.gradle worked for me:

com.google.gms.googleservices.GoogleServicesPlugin.config.disableVersionCheck = true

Note: if the Google services plugin version is above 4.3.0 it should be:

googleServices.disableVersionCheck = true

Solution 4

To create a Firebase project:

1 Create a Firebase project in the Firebase console, if you don't already have one. Click Add project. If you already have an existing Google project associated with your mobile app, select it from the Project name drop down menu. Otherwise, enter a project name to create a new project.

2 Edit your Project ID. Your project is given a unique ID automatically, and it's used in publicly visible Firebase features such as database URLs and your Firebase Hosting subdomain. You can change it now if you want to use a specific subdomain.

  1. Follow the remaining setup steps and click Create project (or Add Firebase if you're using an existing project) to begin provisioning resources for your project. This typically takes a few minutes. When the process completes, you'll be taken to the project overview.

Now that you have a project, you can add your Android app to it:

  1. Click Add Firebase to your Android app and follow the setup steps. If you're importing an existing Google project, this may happen automatically and you can just download the config file.

  2. When prompted, enter your app's package name. It's important to enter the package name your app is using; this can only be set when you add an app to your Firebase project.

  3. During the process, you'll download a google-services.json file. You can download this file again at any time.

  4. After you add the initialization code, run your app to send verification to the Firebase console that you've successfully installed Firebase. Note: If you have multiple build variants with different package names defined, each app must be added to your project in Firebase console.

Add the SDK If you would like to integrate the Firebase libraries into one of your own projects, you need to perform a few basic tasks to prepare your Android Studio project. You may have already done this as part of adding Firebase to your app.

First, add rules to your root-level build.gradle file, to include the google-services plugin and the Google's Maven repository:

    buildscript {
        // ...
        dependencies {
            // ...
            classpath 'com.google.gms:google-services:4.1.0' // google-services plugin
        }
    }

allprojects {
    // ...
    repositories {
        // ...
        google() // Google's Maven repository
    }
}

Then, in your module Gradle file (usually the app/build.gradle), add the apply plugin line at the bottom of the file to enable the Gradle plugin:

apply plugin: 'com.android.application'

android {
  // ...
}

dependencies {
  // ...
  implementation 'com.google.firebase:firebase-core:16.0.3'

  // Getting a "Could not find" error? Make sure you have
  // added the Google maven respository to your root build.gradle
}

// ADD THIS AT THE BOTTOM

apply plugin: 'com.google.gms.google-services'

You should also add the dependencies for the Firebase SDKs you want to use. We recommend starting with com.google.firebase:firebase-core, which provides Google Analytics for Firebase functionality.

Or you can check complete documentation here

Share:
14,351
Admin
Author by

Admin

Updated on June 16, 2022

Comments

  • Admin
    Admin almost 2 years

    I'm working with ionic and I build an application that uses cordova-plugin-firebase for messaging and the analytics plugin too.

    When I build this app for Android, I went to android studio to test, but gradle isn't syncing. First I got an error "Plugin with id 'com.google.gms.google-services' not found.".

    To solve this I put the dependency "classpath 'com.google.gms:google-services:4.0.2'" inside buildscript on the /app/gradle.build.

    Now I get this error:

    Cannot add extension with name 'googleServices', as there is an extension already registered with that name.

    Does someone have the same error?

    Thank you all for your help.

    This is gradle.build

    apply plugin: 'com.android.application'
    
    buildscript {
        repositories {
            mavenCentral()
            jcenter()
            maven {
                url "https://maven.google.com"
            }
        }
    
        dependencies {
            classpath 'com.android.tools.build:gradle:3.0.1'
        }
    }
    
    // Allow plugins to declare Maven dependencies via build-extras.gradle.
    allprojects {
        repositories {
            mavenCentral();
            jcenter()
        }
    }
    
    task wrapper(type: Wrapper) {
        gradleVersion = '4.1.0'
    }
    
    // Configuration properties. Set these via environment variables, build-extras.gradle, or gradle.properties.
    // Refer to: http://www.gradle.org/docs/current/userguide/tutorial_this_and_that.html
    ext {
        apply from: '../CordovaLib/cordova.gradle'
        // The value for android.compileSdkVersion.
        if (!project.hasProperty('cdvCompileSdkVersion')) {
            cdvCompileSdkVersion = null;
        }
        // The value for android.buildToolsVersion.
        if (!project.hasProperty('cdvBuildToolsVersion')) {
            cdvBuildToolsVersion = null;
        }
        // Sets the versionCode to the given value.
        if (!project.hasProperty('cdvVersionCode')) {
            cdvVersionCode = null
        }
        // Sets the minSdkVersion to the given value.
        if (!project.hasProperty('cdvMinSdkVersion')) {
            cdvMinSdkVersion = null
        }
        // Whether to build architecture-specific APKs.
        if (!project.hasProperty('cdvBuildMultipleApks')) {
            cdvBuildMultipleApks = null
        }
        // Whether to append a 0 "abi digit" to versionCode when only a single APK is build 
        if (!project.hasProperty('cdvVersionCodeForceAbiDigit')) {
            cdvVersionCodeForceAbiDigit = null
        }
        // .properties files to use for release signing.
        if (!project.hasProperty('cdvReleaseSigningPropertiesFile')) {
            cdvReleaseSigningPropertiesFile = null
        }
        // .properties files to use for debug signing.
        if (!project.hasProperty('cdvDebugSigningPropertiesFile')) {
            cdvDebugSigningPropertiesFile = null
        }
        // Set by build.js script.
        if (!project.hasProperty('cdvBuildArch')) {
            cdvBuildArch = null
        }
    
        // Plugin gradle extensions can append to this to have code run at the end.
        cdvPluginPostBuildExtras = []
    }
    
    // PLUGIN GRADLE EXTENSIONS START
    apply from: "../cordova-plugin-appsflyer-sdk/academybeautyclub-cordovaAF.gradle"
    apply from: "../cordova-plugin-firebase/academybeautyclub-build.gradle"
    apply from: "../cordova-support-google-services/academybeautyclub-build.gradle"
    // PLUGIN GRADLE EXTENSIONS END
    
    def hasBuildExtras = file('build-extras.gradle').exists()
    if (hasBuildExtras) {
        apply from: 'build-extras.gradle'
    }
    
    // Set property defaults after extension .gradle files.
    if (ext.cdvCompileSdkVersion == null) {
        ext.cdvCompileSdkVersion = privateHelpers.getProjectTarget()
        //ext.cdvCompileSdkVersion = project.ext.defaultCompileSdkVersion
    }
    if (ext.cdvBuildToolsVersion == null) {
        ext.cdvBuildToolsVersion = privateHelpers.findLatestInstalledBuildTools()
        //ext.cdvBuildToolsVersion = project.ext.defaultBuildToolsVersion
    }
    if (ext.cdvDebugSigningPropertiesFile == null && file('../debug-signing.properties').exists()) {
        ext.cdvDebugSigningPropertiesFile = '../debug-signing.properties'
    }
    if (ext.cdvReleaseSigningPropertiesFile == null && file('../release-signing.properties').exists()) {
        ext.cdvReleaseSigningPropertiesFile = '../release-signing.properties'
    }
    
    // Cast to appropriate types.
    ext.cdvBuildMultipleApks = cdvBuildMultipleApks == null ? false : cdvBuildMultipleApks.toBoolean();
    ext.cdvVersionCodeForceAbiDigit = cdvVersionCodeForceAbiDigit == null ? false : cdvVersionCodeForceAbiDigit.toBoolean();
    ext.cdvMinSdkVersion = cdvMinSdkVersion == null ? null : defaultMinSdkVersion
    ext.cdvVersionCode = cdvVersionCode == null ? null : Integer.parseInt('' + cdvVersionCode)
    
    def computeBuildTargetName(debugBuild) {
        def ret = 'assemble'
        if (cdvBuildMultipleApks && cdvBuildArch) {
            def arch = cdvBuildArch == 'arm' ? 'armv7' : cdvBuildArch
            ret += '' + arch.toUpperCase().charAt(0) + arch.substring(1);
        }
        return ret + (debugBuild ? 'Debug' : 'Release')
    }
    
    // Make cdvBuild a task that depends on the debug/arch-sepecific task.
    task cdvBuildDebug
    cdvBuildDebug.dependsOn {
        return computeBuildTargetName(true)
    }
    
    task cdvBuildRelease
    cdvBuildRelease.dependsOn {
        return computeBuildTargetName(false)
    }
    
    task cdvPrintProps << {
        println('cdvCompileSdkVersion=' + cdvCompileSdkVersion)
        println('cdvBuildToolsVersion=' + cdvBuildToolsVersion)
        println('cdvVersionCode=' + cdvVersionCode)
        println('cdvVersionCodeForceAbiDigit=' + cdvVersionCodeForceAbiDigit)
        println('cdvMinSdkVersion=' + cdvMinSdkVersion)
        println('cdvBuildMultipleApks=' + cdvBuildMultipleApks)
        println('cdvReleaseSigningPropertiesFile=' + cdvReleaseSigningPropertiesFile)
        println('cdvDebugSigningPropertiesFile=' + cdvDebugSigningPropertiesFile)
        println('cdvBuildArch=' + cdvBuildArch)
        println('computedVersionCode=' + android.defaultConfig.versionCode)
        android.productFlavors.each { flavor ->
            println('computed' + flavor.name.capitalize() + 'VersionCode=' + flavor.versionCode)
        }
    }
    
    android {
    
        defaultConfig {
            versionCode cdvVersionCode ?: new BigInteger("" + privateHelpers.extractIntFromManifest("versionCode"))
            applicationId privateHelpers.extractStringFromManifest("package")
    
            if (cdvMinSdkVersion != null) {
                minSdkVersion cdvMinSdkVersion
            }
        }
    
        lintOptions {
          abortOnError false;
        }
    
        compileSdkVersion cdvCompileSdkVersion
        buildToolsVersion cdvBuildToolsVersion
    
        //This code exists for Crosswalk and other Native APIs.
        //By default, we multiply the existing version code in the Android Manifest by 10 and 
        //add a number for each architecture.  If you are not using Crosswalk or SQLite, you can
        //ignore this chunk of code, and your version codes will be respected.
    
        if (Boolean.valueOf(cdvBuildMultipleApks)) {
            flavorDimensions "default"
    
            productFlavors {
                armeabi {
                    versionCode defaultConfig.versionCode*10 + 1
                    ndk {
                        abiFilters = ["armeabi"]
                    }
                }
                armv7 {
                    versionCode defaultConfig.versionCode*10 + 2
                    ndk {
                        abiFilters = ["armeabi-v7a"]
                    }
                }
                arm64 {
                    versionCode defaultConfig.versionCode*10 + 3
                    ndk {
                        abiFilters = ["arm64-v8a"]
                    }
                }
                x86 {
                    versionCode defaultConfig.versionCode*10 + 4
                    ndk {
                        abiFilters = ["x86"]
                    }
                }
                x86_64 {
                    versionCode defaultConfig.versionCode*10 + 5
                    ndk {
                        abiFilters = ["x86_64"]
                    }
                }
            }
        } else if (Boolean.valueOf(cdvVersionCodeForceAbiDigit)) {
            // This provides compatibility to the default logic for versionCode before cordova-android 5.2.0
            defaultConfig {
                versionCode defaultConfig.versionCode*10
            }
        }
    
        compileOptions {
            sourceCompatibility JavaVersion.VERSION_1_8
            targetCompatibility JavaVersion.VERSION_1_8
        }
    
        if (cdvReleaseSigningPropertiesFile) {
            signingConfigs {
                release {
                    // These must be set or Gradle will complain (even if they are overridden).
                    keyAlias = ""
                    keyPassword = "__unset" // And these must be set to non-empty in order to have the signing step added to the task graph.
                    storeFile = null
                    storePassword = "__unset"
                }
            }
            buildTypes {
                release {
                    signingConfig signingConfigs.release
                }
            }
            addSigningProps(cdvReleaseSigningPropertiesFile, signingConfigs.release)
        }
        if (cdvDebugSigningPropertiesFile) {
            addSigningProps(cdvDebugSigningPropertiesFile, signingConfigs.debug)
        }
    }
    
    /*
     * WARNING: Cordova Lib and platform scripts do management inside of this code here,
     * if you are adding the dependencies manually, do so outside the comments, otherwise
     * the Cordova tools will overwrite them
     */
    
    
    dependencies {
        implementation fileTree(dir: 'libs', include: '*.jar')
        // SUB-PROJECT DEPENDENCIES START
        implementation(project(path: ":CordovaLib"))
        compile "com.google.android.gms:play-services-tagmanager:+"
        //compile "com.google.firebase:firebase-core:+"
        compile "com.google.firebase:firebase-messaging:+"
        compile "com.google.firebase:firebase-config:+"
        compile "com.google.firebase:firebase-perf:+"
        compile "com.google.firebase:firebase-core:16.0.3"
        // SUB-PROJECT DEPENDENCIES END
    }
    
    def promptForReleaseKeyPassword() {
        if (!cdvReleaseSigningPropertiesFile) {
            return;
        }
        if ('__unset'.equals(android.signingConfigs.release.storePassword)) {
            android.signingConfigs.release.storePassword = privateHelpers.promptForPassword('Enter key store password: ')
        }
        if ('__unset'.equals(android.signingConfigs.release.keyPassword)) {
            android.signingConfigs.release.keyPassword = privateHelpers.promptForPassword('Enter key password: ');
        }
    }
    
    gradle.taskGraph.whenReady { taskGraph ->
        taskGraph.getAllTasks().each() { task ->
          if(['validateReleaseSigning', 'validateSigningRelease', 'validateSigningArmv7Release', 'validateSigningX76Release'].contains(task.name)) {
             promptForReleaseKeyPassword()
          }
        }
    }
    
    def addSigningProps(propsFilePath, signingConfig) {
        def propsFile = file(propsFilePath)
        def props = new Properties()
        propsFile.withReader { reader ->
            props.load(reader)
        }
    
        def storeFile = new File(props.get('key.store') ?: privateHelpers.ensureValueExists(propsFilePath, props, 'storeFile'))
        if (!storeFile.isAbsolute()) {
            storeFile = RelativePath.parse(true, storeFile.toString()).getFile(propsFile.getParentFile())
        }
        if (!storeFile.exists()) {
            throw new FileNotFoundException('Keystore file does not exist: ' + storeFile.getAbsolutePath())
        }
        signingConfig.keyAlias = props.get('key.alias') ?: privateHelpers.ensureValueExists(propsFilePath, props, 'keyAlias')
        signingConfig.keyPassword = props.get('keyPassword', props.get('key.alias.password', signingConfig.keyPassword))
        signingConfig.storeFile = storeFile
        signingConfig.storePassword = props.get('storePassword', props.get('key.store.password', signingConfig.storePassword))
        def storeType = props.get('storeType', props.get('key.store.type', ''))
        if (!storeType) {
            def filename = storeFile.getName().toLowerCase();
            if (filename.endsWith('.p12') || filename.endsWith('.pfx')) {
                storeType = 'pkcs12'
            } else {
                storeType = signingConfig.storeType // "jks"
            }
        }
        signingConfig.storeType = storeType
    }
    
    for (def func : cdvPluginPostBuildExtras) {
        func()
    }
    
    // This can be defined within build-extras.gradle as:
    //     ext.postBuildExtras = { ... code here ... }
    if (hasProperty('postBuildExtras')) {
        postBuildExtras()
    }
    
    apply plugin: 'com.google.gms.google-services'
    
  • Admin
    Admin over 5 years
    This is all set before you posted, the error is somewhere elese