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"的扩展程序

        时间:2024-04-13
      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"的扩展程序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

                  上一篇:构建错误-Ionic Cordova 对 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>
                1. <tfoot id='OP8ZW'></tfoot><legend id='OP8ZW'><style id='OP8ZW'><dir id='OP8ZW'><q id='OP8ZW'></q></dir></style></legend>