/** * Downloads all android-all-instrumented dependencies and copies them to the mavenLocal() repository * * Once applied to your gradle project, can be executed with ./gradlew robolectricSdkDownload */ import java.nio.file.Files // The general idea of this was borrowed from https://gist.github.com/xian/05c4f27da6d4156b9827842217c2cd5c // I then modified it heavily to allow easier addition of new SDK versions // The full implementation is from https://gist.github.com/simtel12/13ff3e57c37e78e468502b51ebb0f4f2 // List from: https://github.com/robolectric/robolectric/blob/master/robolectric/src/main/java/org/robolectric/plugins/DefaultSdkProvider.java // This list will need to be updated for new Android SDK versions that come out. // Only the versions currently used in AnkiDroid Robolectric tests are active, the rest are commented out // To update these versions, open a terminal in the Anki-Android directory and perform the following steps: // 1. Run `rm -r ~/.m2` to delete the .m2 directory in your home directory. // 2. Run `./gradlew jacocoUnitTestReport` to run all unit tests. // 3. Run `find ~/.m2 -type d -name '*-robolectric-*'`. // 4. Update the lines below to match the output from `find`. def robolectricAndroidSdkVersions = [ // [androidVersion: "6.0.1_r3", frameworkSdkBuildVersion: "r1"], // [androidVersion: "7.0.0_r1", frameworkSdkBuildVersion: "r1"], // [androidVersion: "7.1.0_r7", frameworkSdkBuildVersion: "r1"], // [androidVersion: "8.0.0_r4", frameworkSdkBuildVersion: "r1"], // [androidVersion: "8.1.0", frameworkSdkBuildVersion: "4611349"], [androidVersion: "9", frameworkSdkBuildVersion: "4913185-2"], [androidVersion: "10", frameworkSdkBuildVersion: "5803371"], [androidVersion: "11", frameworkSdkBuildVersion: "6757853"], // [androidVersion: "12", frameworkSdkBuildVersion: "7732740"], // [androidVersion: "12.1", frameworkSdkBuildVersion: "8229987"], [androidVersion: "13", frameworkSdkBuildVersion: "9030017"], [androidVersion: "14", frameworkSdkBuildVersion: "10818077"], ] // Base, public task - will be displayed in ./gradlew robolectricDownloader:tasks tasks.register('robolectricSdkDownload') { group = "Dependencies" description = "Downloads all robolectric SDK dependencies into mavenLocal, for use with offline robolectric" } // Generate the configuration and actual copy tasks. robolectricAndroidSdkVersions.forEach { robolectricSdkVersion -> def version = "${robolectricSdkVersion['androidVersion']}-robolectric-${robolectricSdkVersion['frameworkSdkBuildVersion']}-i4" // Creating a configuration with a dependency allows Gradle to manage the actual resolution of // the jar file def sdkConfig = configurations.create(version) dependencies.add(version, "org.robolectric:android-all-instrumented:${version}") def mavenLocalFile = new File(this.repositories.mavenLocal().url) def mavenRobolectric = new File(mavenLocalFile, "org/robolectric/android-all-instrumented/${version}") // Copying all files downloaded for the created configuration into maven local. tasks.register("robolectricSdkDownload-${version}", Copy) { from sdkConfig into mavenRobolectric doLast { ArtifactResolutionResult result = dependencies.createArtifactResolutionQuery() .forModule("org.robolectric", "android-all-instrumented", version) .withArtifacts(MavenModule, MavenPomArtifact) .execute() for(component in result.resolvedComponents) { def componentId = component.id if(componentId instanceof ModuleComponentIdentifier) { File pomFile = component.getArtifacts(MavenPomArtifact)[0].file File dest = new File(mavenRobolectric, pomFile.name) if (!dest.exists()) { Files.copy(pomFile.toPath(), dest.toPath()) } } } } } robolectricSdkDownload.configure { dependsOn "robolectricSdkDownload-${version}" } }