title: ionic3 error AndroidManifest.xml:53:66-112 requires a placeholder substitution but no value for <GOOGLE_MAPS_ANDROID_API_KEY> is provided?
body: <p>I got above error after build android in ionic3.</p>
  <pre><code>AndroidManifest.xml:53:66-112 requires a placeholder substitution but no value for &lt;GOOGLE_MAPS_ANDROID_API_KEY&gt; is provided
  </code></pre>
  <p>I tried each and everything but nothing is worked for me.i tried the below solution:</p>
  <blockquote>
  <p>1st solution from this link</p>
  <p><a href="https://stackoverflow.com/questions/43140059/add-toolsreplace-androidvalue-to-meta-data-element-at-androidmanifest">add &#39;tools:replace=&quot;Android:value&quot;&#39; to &lt;meta-data&gt; element at AndroidManifest</a> i have put below code in the build.gradle</p>
  </blockquote>
  <pre><code>configurations.all {
      resolutionStrategy.eachDependency { DependencyResolveDetails details -&gt;
          def requested = details.requested
          if (requested.group == 'com.android.support') {
              if (!requested.name.startsWith(&quot;multidex&quot;)) {
                  details.useVersion '25.3.0'
              }
          }
      }
  }
  </code></pre>
  <p>2nd tried:</p>
  <pre><code>&lt;manifest xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;
  package=&quot;com.winanainc&quot;
  android:versionCode=&quot;3&quot;
  android:versionName=&quot;1.2&quot;
  xmlns:tools=&quot;http://schemas.android.com/tools&quot;&gt;
  </code></pre>
  <p>Please tell me how to fix above error?</p>
  <p><div class="snippet" data-lang="js" data-hide="false" data-console="false" data-babel="false">
  <div class="snippet-code">
  <pre class="snippet-code-js lang-js prettyprint-override"><code>//Project.properties file
  target=android-26
  android.library.reference.1=CordovaLib
  cordova.system.library.1=com.squareup.okhttp3:okhttp-urlconnection:3.10.0
  cordova.system.library.2=com.android.support:support-v4:24.1.1+
  cordova.system.library.3=com.android.support:support-v4:27+
  cordova.system.library.4=com.android.support:support-v4:25.+
  cordova.system.library.5=com.android.support:appcompat-v7:25.+
  cordova.gradle.include.1=cordova-plugin-firebase/managment-build.gradle
  cordova.system.library.6=com.google.android.gms:play-services-tagmanager:16.+
  cordova.system.library.7=com.google.firebase:firebase-core:11.+
  cordova.system.library.8=com.google.firebase:firebase-messaging:11.+
  cordova.system.library.9=com.google.firebase:firebase-config:11.+
  cordova.system.library.10=com.google.firebase:firebase-perf:11.+
  cordova.gradle.include.2=cordova-plugin-mauron85-background-geolocation/managment-dependencies.gradle
  # cordova.system.library.14=com.google.android.gms:play-services-location:16.+
  cordova.system.library.11=com.android.support:support-v4:26+
  cordova.system.library.12=com.android.support:appcompat-v7:26+
  cordova.gradle.include.3=cordova-plugin-telerik-imagepicker/managment-ignorelinterrors.gradle
  # cordova.system.library.17=com.google.android.gms:play-services-location:16.+
  cordova.system.library.13=com.android.support:appcompat-v7:23+
  cordova.gradle.include.4=cordova-plugin-telerik-imagepicker/managment-androidtarget.gradle
  cordova.system.library.14=com.android.support:support-v4:26.+
  cordova.system.library.15=com.android.support:appcompat-v7:26.+
  cordova.system.library.16=com.google.android.gms:play-services-maps:11.+
  cordova.system.library.17=com.google.android.gms:play-services-location:11.+
  cordova.system.library.18=com.google.android.gms:play-services-location:15.+
  
  
  
  
  //build.gradle file
  apply plugin: 'com.android.application'
  
  buildscript {
      repositories {
          jcenter()
          maven { url 'https://maven.fabric.io/public' } // Fabrics Maven repository from cordova-plugin-firebase
          maven {
              url "https://maven.google.com"
          }
      }
  
      // Switch the Android Gradle plugin version-compatibilityon requirement depending on the
      // installed version of Gradle. This dependency is documented at
      // http://tools.android.com/tech-docs/new-build-system/version-compatibility
      // and https://issues.apache.org/jira/browse/CB-8143
      dependencies {
          classpath 'com.android.tools.build:gradle:3.0.0'
          classpath 'com.google.gms:google-services:4.1.0' // google-services dependency from cordova-plugin-firebase
          classpath 'io.fabric.tools:gradle:1.25.4' // fabric dependency from cordova-plugin-firebase
      }
  }
  
  // Allow plugins to declare Maven dependencies via build-extras.gradle.
  allprojects {
      repositories {
          jcenter()
          google() // Google's Maven repository from cordova-plugin-firebase
          maven {
              url "https://maven.google.com"
          }
      }
  }
  
  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
      }
      // .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-firebase/managment-build.gradle"
  apply from: "cordova-plugin-mauron85-background-geolocation/managment-dependencies.gradle"
  apply from: "cordova-plugin-telerik-imagepicker/managment-ignorelinterrors.gradle"
  apply from: "cordova-plugin-telerik-imagepicker/managment-androidtarget.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()
  }
  if (ext.cdvBuildToolsVersion == null) {
      ext.cdvBuildToolsVersion = privateHelpers.findLatestInstalledBuildTools()
  }
  if (ext.cdvDebugSigningPropertiesFile == null &amp;&amp; file('debug-signing.properties').exists()) {
      ext.cdvDebugSigningPropertiesFile = 'debug-signing.properties'
  }
  if (ext.cdvReleaseSigningPropertiesFile == null &amp;&amp; file('release-signing.properties').exists()) {
      ext.cdvReleaseSigningPropertiesFile = 'release-signing.properties'
  }
  
  // Cast to appropriate types.
  ext.cdvBuildMultipleApks = cdvBuildMultipleApks == null ? false : cdvBuildMultipleApks.toBoolean();
  ext.cdvMinSdkVersion = cdvMinSdkVersion == null ? null : Integer.parseInt('' + cdvMinSdkVersion)
  ext.cdvVersionCode = cdvVersionCode == null ? null : Integer.parseInt('' + cdvVersionCode)
  
  def computeBuildTargetName(debugBuild) {
      def ret = 'assemble'
      if (cdvBuildMultipleApks &amp;&amp; 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 &lt;&lt; {
      println('cdvCompileSdkVersion=' + cdvCompileSdkVersion)
      println('cdvBuildToolsVersion=' + cdvBuildToolsVersion)
      println('cdvVersionCode=' + cdvVersionCode)
      println('cdvMinSdkVersion=' + cdvMinSdkVersion)
      println('cdvBuildMultipleApks=' + cdvBuildMultipleApks)
      println('cdvReleaseSigningPropertiesFile=' + cdvReleaseSigningPropertiesFile)
      println('cdvDebugSigningPropertiesFile=' + cdvDebugSigningPropertiesFile)
      println('cdvBuildArch=' + cdvBuildArch)
      println('computedVersionCode=' + android.defaultConfig.versionCode)
      android.productFlavors.each { flavor -&gt;
          println('computed' + flavor.name.capitalize() + 'VersionCode=' + flavor.versionCode)
      }
  }
  
  android {
      sourceSets {
          main {
              manifest.srcFile 'AndroidManifest.xml'
              java.srcDirs = ['src']
              resources.srcDirs = ['src']
              aidl.srcDirs = ['src']
              renderscript.srcDirs = ['src']
              res.srcDirs = ['res']
              assets.srcDirs = ['assets']
              jniLibs.srcDirs = ['libs']
          }
      }
  
      defaultConfig {
          versionCode cdvVersionCode ?: new BigInteger("" + privateHelpers.extractIntFromManifest("versionCode"))
          applicationId privateHelpers.extractStringFromManifest("package")
  
          if (cdvMinSdkVersion != null) {
              minSdkVersion cdvMinSdkVersion
          }
      }
      
      lintOptions {
        abortOnError false;
      }
  
      compileSdkVersion cdvCompileSdkVersion
      buildToolsVersion cdvBuildToolsVersion
  
      if (Boolean.valueOf(cdvBuildMultipleApks)) {
          productFlavors {
              armv7 {
                  versionCode defaultConfig.versionCode*10 + 2
                  ndk {
                      abiFilters "armeabi-v7a", ""
                  }
              }
              x86 {
                  versionCode defaultConfig.versionCode*10 + 4
                  ndk {
                      abiFilters "x86", ""
                  }
              }
              all {
                  ndk {
                      abiFilters "all", ""
                  }
              }
          }
      }
      /*
  
      ELSE NOTHING! DON'T MESS WITH THE VERSION CODE IF YOU DON'T HAVE TO!
  
      else if (!cdvVersionCode) {
        def minSdkVersion = cdvMinSdkVersion ?: privateHelpers.extractIntFromManifest("minSdkVersion")
        // Vary versionCode by the two most common API levels:
        // 14 is ICS, which is the lowest API level for many apps.
        // 20 is Lollipop, which is the lowest API level for the updatable system webview.
        if (minSdkVersion &gt;= 20) {
          defaultConfig.versionCode += 9
        } else if (minSdkVersion &gt;= 14) {
          defaultConfig.versionCode += 8
        }
      }
      */
  
      compileOptions {
          sourceCompatibility JavaVersion.VERSION_1_6
          targetCompatibility JavaVersion.VERSION_1_6
      }
  
      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)
      }
  }
  
  dependencies {
      implementation fileTree(dir: 'libs', include: '*.jar')
      // SUB-PROJECT DEPENDENCIES START
      implementation(project(path: "CordovaLib"))
      compile "com.squareup.okhttp3:okhttp-urlconnection:3.10.0"
      compile "com.android.support:support-v4:24.1.1+"
      compile "com.android.support:support-v4:27+"
      compile "com.android.support:support-v4:25.+"
      compile "com.android.support:appcompat-v7:25.+"
      compile "com.google.android.gms:play-services-tagmanager:16.+"
      compile "com.google.firebase:firebase-core:11.+"
      compile "com.google.firebase:firebase-messaging:11.+"
      compile "com.google.firebase:firebase-config:11.+"
      compile "com.google.firebase:firebase-perf:11.+"
      compile "com.android.support:support-v4:26+"
      compile "com.android.support:appcompat-v7:26+"
      compile "com.android.support:appcompat-v7:23+"
      compile "com.android.support:support-v4:26.+"
      compile "com.android.support:appcompat-v7:26.+"
      compile "com.google.android.gms:play-services-maps:11.+"
      compile "com.google.android.gms:play-services-location:11.+"
      compile "com.google.android.gms:play-services-location:15.+"
      // 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 -&gt;
      taskGraph.getAllTasks().each() { task -&gt;
          if (['validateReleaseSigning', 'validateSigningRelease', 'validateSigningArmv7Release', 'validateSigningX86Release'].contains(task.name)) {
              promptForReleaseKeyPassword()
          }
      }
  }
  
  def addSigningProps(propsFilePath, signingConfig) {
      def propsFile = file(propsFilePath)
      def props = new Properties()
      propsFile.withReader { reader -&gt;
          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()
  }</code></pre>
  </div>
  </div>
  </p>