1. <tfoot id='vFY7T'></tfoot>
    2. <small id='vFY7T'></small><noframes id='vFY7T'>

        • <bdo id='vFY7T'></bdo><ul id='vFY7T'></ul>
        <i id='vFY7T'><tr id='vFY7T'><dt id='vFY7T'><q id='vFY7T'><span id='vFY7T'><b id='vFY7T'><form id='vFY7T'><ins id='vFY7T'></ins><ul id='vFY7T'></ul><sub id='vFY7T'></sub></form><legend id='vFY7T'></legend><bdo id='vFY7T'><pre id='vFY7T'><center id='vFY7T'></center></pre></bdo></b><th id='vFY7T'></th></span></q></dt></tr></i><div id='vFY7T'><tfoot id='vFY7T'></tfoot><dl id='vFY7T'><fieldset id='vFY7T'></fieldset></dl></div>
      1. <legend id='vFY7T'><style id='vFY7T'><dir id='vFY7T'><q id='vFY7T'></q></dir></style></legend>
      2. 无法在 gradle 同步上添加名称为“googleServices"的扩展程序

        Cannot add extension with name #39;googleServices#39; on gradle sync(无法在 gradle 同步上添加名称为“googleServices的扩展程序)
      3. <tfoot id='i5vpl'></tfoot>

      4. <i id='i5vpl'><tr id='i5vpl'><dt id='i5vpl'><q id='i5vpl'><span id='i5vpl'><b id='i5vpl'><form id='i5vpl'><ins id='i5vpl'></ins><ul id='i5vpl'></ul><sub id='i5vpl'></sub></form><legend id='i5vpl'></legend><bdo id='i5vpl'><pre id='i5vpl'><center id='i5vpl'></center></pre></bdo></b><th id='i5vpl'></th></span></q></dt></tr></i><div id='i5vpl'><tfoot id='i5vpl'></tfoot><dl id='i5vpl'><fieldset id='i5vpl'></fieldset></dl></div>

          <bdo id='i5vpl'></bdo><ul id='i5vpl'></ul>
            <tbody id='i5vpl'></tbody>
          <legend id='i5vpl'><style id='i5vpl'><dir id='i5vpl'><q id='i5vpl'></q></dir></style></legend>

            • <small id='i5vpl'></small><noframes id='i5vpl'>

                  本文介绍了无法在 gradle 同步上添加名称为“googleServices"的扩展程序的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

                  问题描述

                  我正在使用 ionic 并构建了一个应用程序,该应用程序使用 cordova-plugin-firebase 进行消息传递和分析插件.

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

                  当我为 Android 构建这个应用程序时,我去了 android studio 进行测试,但 gradle 没有同步.首先,我收到一个错误找不到 ID 为 'com.google.gms.google-services' 的插件.".

                  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.".

                  为了解决这个问题,我将依赖项classpath 'com.google.gms:google-services:4.0.2'"放在/app/gradle.build 的 buildscript 中.

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

                  现在我收到此错误:

                  无法添加名称为googleServices"的扩展程序,因为已使用该名称注册了一个扩展程序.

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

                  有人有同样的错误吗?

                  感谢大家的帮助.

                  这是 gradle.build

                  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'
                  

                  推荐答案

                  我评论第16行

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

                  关于 cordova-support-google-services/appname-build.gradle

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

                  及其编译

                  这篇关于无法在 gradle 同步上添加名称为“googleServices"的扩展程序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

                  本站部分内容来源互联网,如果有图片或者内容侵犯了您的权益,请联系我们,我们会在确认后第一时间进行删除!

                  相关文档推荐

                  Sqlite database not copied from asset folder Android(Sqlite 数据库未从资产文件夹 Android 复制)
                  SQLite Database Copy Appears Corrupted When Generated by Device and not Emulator(SQLite 数据库副本在由设备而不是模拟器生成时出现损坏)
                  Android file copy(安卓文件拷贝)
                  Android how to detect Copy event of Edittext in android(Android如何在android中检测Edittext的Copy事件)
                  Android copy image from gallery folder onto SD Card alternative folder(Android将图像从图库文件夹复制到SD卡替代文件夹)
                  Is there a tool to find unused resources in an Android project?(是否有工具可以在 Android 项目中查找未使用的资源?)

                  <small id='OP8ZW'></small><noframes id='OP8ZW'>

                  • <bdo id='OP8ZW'></bdo><ul id='OP8ZW'></ul>
                    <i id='OP8ZW'><tr id='OP8ZW'><dt id='OP8ZW'><q id='OP8ZW'><span id='OP8ZW'><b id='OP8ZW'><form id='OP8ZW'><ins id='OP8ZW'></ins><ul id='OP8ZW'></ul><sub id='OP8ZW'></sub></form><legend id='OP8ZW'></legend><bdo id='OP8ZW'><pre id='OP8ZW'><center id='OP8ZW'></center></pre></bdo></b><th id='OP8ZW'></th></span></q></dt></tr></i><div id='OP8ZW'><tfoot id='OP8ZW'></tfoot><dl id='OP8ZW'><fieldset id='OP8ZW'></fieldset></dl></div>

                    <tfoot id='OP8ZW'></tfoot>
                      <legend id='OP8ZW'><style id='OP8ZW'><dir id='OP8ZW'><q id='OP8ZW'></q></dir></style></legend>

                              <tbody id='OP8ZW'></tbody>