<NME> build.gradle
<BEF> // first of all the buildscript block, then the plugins block
buildscript {
    repositories {
        google()
    }
    dependencies {
        // these dependencies are used by gradle plugins, not by our projects

        // Android gradle plugin
        classpath 'com.android.tools.build:gradle:4.2.2'

        // un-mocking of portable Android classes
        classpath 'com.github.bjoernq:unmockplugin:0.7.9'

        // monitor our application method limit
        //noinspection GradleDependency - see https://github.com/cgeo/cgeo/issues/9208
        classpath 'com.getkeepsafe.dexcount:dexcount-gradle-plugin:1.0.3'
    }
}

plugins {
    // IDEA tasks for the project, see https://docs.gradle.org/current/userguide/idea_plugin.html
    id 'idea'

    // check for updates of gradle plugin dependencies
    id 'com.github.ben-manes.versions' version '0.42.0'
    id 'se.ascp.gradle.gradle-versions-filter' version "0.1.16"

    // use SpotBugs instead of FindBugs, see https://plugins.gradle.org/plugin/com.github.spotbugs
    id 'com.github.spotbugs' version '4.7.6'

    // adds gradle tasks 'tiTree' (print a task dependency graph), 'tiOrder' (display the execution queue),
    // 'tiJson' (export as a JSON file), see https://gitlab.com/barfuin/gradle-taskinfo
    // they need cmdline parameter, e.g. gradlew tiTree assembleBasicDebug
    id 'org.barfuin.gradle.taskinfo' version '1.4.0'
}

/*
 * Just run this script using "gradlew", and it will show you typical examples of how to use it.
 */

defaultTasks 'cgeoHelp'

tasks.register('cgeoHelp') {
    group = 'cgeo'
    description = 'Displays help for building cgeo.'
    doLast {
        println ''
        println 'These are some of the available commands for building cgeo.'
        println ''
        println 'cleaning all generated artifacts:'
        println '    gradlew clean'
        println ''
        println 'build:'
        println '    gradlew assembleDebug'
        println ''
        println 'install on connected device/emulator:'
        println '    gradlew installBasicDebug'
        println ''
        println 'run app on connected device/emulator:'
        println '    gradlew runBasicDebug'
        println ''
        println 'instrumentation tests on connected device/emulator:'
        println '    gradlew connectedBasicDebugAndroidTest'
        println ''
        println 'pure unit tests WITHOUT device'
        println '    gradlew testBasicDebugUnitTest'
        println ''
        println 'all unit tests (pure and instrumentation)'
        println '    gradlew testDebug'
        println ''
        println 'check project dependencies for updates:'
        println '    gradlew dependencies main:dependencies'
		classpath 'com.github.ben-manes:gradle-versions-plugin:0.14.0'
	
		// Android gradle plugin
        classpath 'com.android.tools.build:gradle:2.2.3'
    
		// Android annotation processor
        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
        println 'Available build types are: debug, nightly (requires an env var named NB), ' +
                'rc (requires an env var named RC), release.'
    }
}

// filter out non release version updates and other updates we cannot use
allprojects {
    configurations {
        all {
            resolutionStrategy {
                componentSelection {
                    all { ComponentSelection selection ->
                        if (['alpha', 'beta', 'rc', 'cr', 'm', 'pr'].any { qualifier -> selection.candidate.version.contains(qualifier)}) {
                            selection.reject('Release candidate')
                        }

                        // see https://assertj.github.io/doc/#assertj-core-android
                        // AssertJ Core 3.x is compatible with Android API Level 26+, except for soft assertions and assumptions.
                        // AssertJ Core 2.x is Android compatible with Android API Level 26+ and API Level < 26 except for Path assertions.
                        if (selection.candidate.group == 'org.assertj' && selection.candidate.module == 'assertj-core' && selection.candidate.version.substring(0,1).toInteger() > 2) {
                            selection.reject("assertj 3.x or higher requires Java 7 SE classes not available in Android")
                        }

                        // Apache Commons IO 2.6 fails in FileUtils.deleteDirectory()
                        // (uses java.nio.file.Path - which is first contained in Android API26)
                        if (selection.candidate.group == 'commons-io' && selection.candidate.module == 'commons-io' && selection.candidate.version.substring(0,1).toInteger()*10+selection.candidate.version.substring(2,3).toInteger() > 25) {
                            selection.reject("Apache Commons IO 2.6 calls methods not available in the Android runtime untli API26.")
                        }
                    }
                }
                // new versions of checkstyle use guava 27, which has troublesome dependencies: https://groups.google.com/forum/#!topic/guava-announce/Km82fZG68Sw
                force 'com.google.guava:guava:26.0-jre'

                // force this version because of conflict to our resolutionStrategy from lint-gradle
                // TODO check necessity after every gradle update (gradlew :main:lintBasicDebug)
                force 'com.android.tools.build:aapt2-proto:4.2.2-7147631'
            }
        }
    }
}

/*
 * common configuration for the Java projects
 */
subprojects {
    repositories {
        mavenCentral()
        // Android Support libraries are now in an online Maven repository
        google()
        // integrate as last one - for versions by commit ID
        maven {
            url 'https://jitpack.io'
        }
    }

    // disable warning of annotation processor about annotation types with no registered processor (like @NonNull)
    tasks.withType(JavaCompile) {
        options.compilerArgs << "-Xlint:-processing"
    }

    idea.module {
        downloadJavadoc = true
        downloadSources = true
    }
}

/*
 * Make sure that we use the source distribution when updating the wrapper from the command line.
 */
tasks.named('wrapper') {
    distributionType = Wrapper.DistributionType.ALL
}

/*
 * Configuration for dependencyUpdates, see https://github.com/ben-manes/gradle-versions-plugin
 * common configuration for the Java projects
 */

ext.buildToolsVersion = "23.0.3"
ext.minSdkVersion = 14

subprojects {

<MSG> update to android-gradle 2.3

This is the most recent version of the gradle build support for Android.
It also requires updating SDK build to 25.0 or better. So it seems
reasonable to take the latest version of SDK build.

If you see local warnings, please also upgrade Android Studio itself to
2.3.

This change probably requires Jenkins nodes to be upgraded.
<DFF> @@ -74,7 +74,7 @@ buildscript {
 		classpath 'com.github.ben-manes:gradle-versions-plugin:0.14.0'
 	
 		// Android gradle plugin
-        classpath 'com.android.tools.build:gradle:2.2.3'
+        classpath 'com.android.tools.build:gradle:2.3.0'
     
 		// Android annotation processor
         classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
@@ -156,7 +156,7 @@ buildScan {
  * common configuration for the Java projects
  */
 
-ext.buildToolsVersion = "23.0.3"
+ext.buildToolsVersion = "25.0.2" // android-gradle 2.3 requires at least 25.0
 ext.minSdkVersion = 14
 
 subprojects {

update to android-gradle 2.3