title: why doesn't task wrapper function work
body: <p>There are many good suggestions to how to fix gradle versions, but some of them are outdated or I just couldn't find the paths that were suggested. one solution did work for me is <strong>project>project structure>project>gradle version</strong>.</p>
  
  <p>Here I can change it to the supported version, and successfully builds the project. </p>
  
  <p>A small error in the the javascript code, so a change is made to it. <code>Ionic build android</code>, now something wrong occurrs here. <code>Minimum supprted Gradle version is 2.14.1. Current version is 2.13.</code>.</p>
  
  <p>But in the <strong>project/platforms/android/build.gradle</strong></p>
  
  <p><code>task wrapper(type: Wrapper){
     gradleVersion = '2.14.1'
  }</code></p>
  
  <p>and from this <a href="https://docs.gradle.org/current/userguide/gradle_wrapper.html" rel="noreferrer">link</a>, it suggests that this is the way set your gradle wrapper. </p>
  
  <p>So I am expecting in <strong>project/platforms/android/gradle/wrapper/gradle-wrapper.properties</strong> to have <code>distributionUrl=http\://services.gradle.org/distributions/gradle-2.14.1-all.zip</code>, instead this is what it has <code>distributionUrl=http\://services.gradle.org/distributions/gradle-2.13-all.zip</code>.</p>
  
  <p>Can't make direct change to this file <strong>project/platforms/android/gradle/wrapper/gradle-wrapper.properties</strong>, because after each build it will revert back to <code>gradle-2.13-all.zip</code>.</p>
  
  <p>What is going on here? can't find anything that explain why it keeps on changing the <code>distributionUrl=http\://services.gradle.org/distributions/gradle-2.13-all.zip</code>. Would anyone be kindly explain this please? Maybe something very stupid that I have missed. Thank you.</p>
  
  <p><strong>Links that I have looked at</strong></p>
  
  <p><a href="https://stackoverflow.com/questions/34814368/gradle-version-2-10-is-required-error">&quot;Gradle Version 2.10 is required.&quot; Error</a></p>
  
  <p><a href="https://stackoverflow.com/questions/17727645/how-to-update-gradle-in-android-studio">How to update gradle in android studio</a></p>
  
  <p><a href="https://stackoverflow.com/questions/29874564/ionic-build-android-error-when-download-gradle">ionic build android error when download gradle</a></p>
  
  <p><strong>gradle code</strong></p>
  
  <pre><code>apply plugin: 'com.android.application'
  
  buildscript {
      repositories {
          mavenCentral()
          jcenter()
      }
  
      // Switch the Android Gradle plugin version 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:2.2.1'
      }
  }
  
  // Allow plugins to declare Maven dependencies via build-extras.gradle.
  allprojects {
      repositories {
          mavenCentral();
          jcenter();
      }
  }
  
  task wrapper(type: Wrapper) {
      gradleVersion = '2.14.1'
  }
  
  // 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-badge/simplelogin777664-badge.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 {
      if (cdvMinSdkVersion != null) {
        minSdkVersion cdvMinSdkVersion
      }
      minSdkVersion 16
      targetSdkVersion 23
    }
    lintOptions {
      abortOnError false;
    }
    compileSdkVersion 23
    buildToolsVersion '21.1.2'
    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_7
      targetCompatibility JavaVersion.VERSION_1_7
    }
    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)
    }
    productFlavors {
    }
  }
  
  dependencies {
    compile fileTree(include: '*.jar', dir: 'libs')
    // SUB-PROJECT DEPENDENCIES START
      debugCompile project(path: "CordovaLib", configuration: "debug")
      releaseCompile project(path: "CordovaLib", configuration: "release")
      compile "com.android.support:support-v4:+"
      // 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 (task.name == 'validateReleaseSigning') {
              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>
  
  <p><strong>Update</strong></p>
  
  <p>'gradlew wrapper throws error, because certain wrapper doesn't exist under maven and the sub <code>build.gradle</code> uses it to download <code>2.14.1.prom</code> and <code>2.14.1.jar</code>. <a href="https://stackoverflow.com/questions/39000831/android-studio-graddle-2-1-3-issue">This link will explain it.</a></p>
  
  <p><strong>Found problem</strong></p>
  
  <p>The problem why it keeps on changing back to <code>2.13-all.zip</code> is because of this line, <code>var distributionUrl = process.env['CORDOVA_ANDROID_GRADLE_DISTRIBUTION_URL'] || 'http\\://services.gradle.org/distributions/gradle-2.13-all.zip';</code> in the <code>[project name]/platforms/android/cordova/lib/builders/GradleBuilder.js</code> instead of <code>~/android/lib/GradleBuilder.js</code>. (Line 164) </p>