Skip to content

Commit

Permalink
Upgrade to Android Gradle Plugin 3.5.3 and Gradle 5.4.1.
Browse files Browse the repository at this point in the history
Gradle's API for dependency transforms changed.
Apply RoboJavaModulePlugin in a more idiomatic way.
  • Loading branch information
Christian Williams committed Mar 3, 2020
1 parent 6ef72d2 commit d92f6f0
Show file tree
Hide file tree
Showing 29 changed files with 299 additions and 272 deletions.
5 changes: 2 additions & 3 deletions annotations/build.gradle
@@ -1,6 +1,5 @@
new RoboJavaModulePlugin(
deploy: true
).apply(project)
apply plugin: org.robolectric.gradle.RoboJavaModulePlugin
apply plugin: org.robolectric.gradle.DeployedRoboJavaModulePlugin

dependencies {
compileOnly "com.google.code.findbugs:jsr305:3.0.2"
Expand Down
2 changes: 1 addition & 1 deletion build.gradle
Expand Up @@ -9,7 +9,7 @@ buildscript {

dependencies {
gradle
classpath 'com.android.tools.build:gradle:3.3.1'
classpath 'com.android.tools.build:gradle:3.5.3'
classpath 'net.ltgt.gradle:gradle-errorprone-plugin:0.6'
classpath 'com.netflix.nebula:gradle-aggregate-javadocs-plugin:2.2.1'
classpath 'ch.raffael.pegdown-doclet:pegdown-doclet:1.3'
Expand Down
2 changes: 1 addition & 1 deletion buildSrc/build.gradle
Expand Up @@ -11,5 +11,5 @@ dependencies {
implementation localGroovy()

implementation "org.ow2.asm:asm-tree:7.0"
implementation 'com.android.tools.build:gradle:3.3.1'
implementation 'com.android.tools.build:gradle:3.5.3'
}
191 changes: 0 additions & 191 deletions buildSrc/src/main/groovy/RoboJavaModulePlugin.groovy

This file was deleted.

70 changes: 49 additions & 21 deletions buildSrc/src/main/groovy/org/robolectric/gradle/AarDepsPlugin.java
@@ -1,32 +1,37 @@
package org.robolectric.gradle;

import static org.gradle.api.internal.artifacts.ArtifactAttributes.ARTIFACT_FORMAT;

import com.android.build.gradle.internal.dependency.ExtractAarTransform;
import com.google.common.base.Joiner;
import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.gradle.api.Action;
import org.gradle.api.Plugin;
import org.gradle.api.Project;
import org.gradle.api.Task;
import org.gradle.api.artifacts.transform.TransformOutputs;
import org.gradle.api.file.FileCollection;
import org.gradle.api.tasks.compile.JavaCompile;
import org.jetbrains.annotations.NotNull;

import javax.inject.Inject;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicReference;

import static org.gradle.api.internal.artifacts.ArtifactAttributes.ARTIFACT_FORMAT;

/** Resolve aar dependencies into jars for non-Android projects. */
/**
* Resolve aar dependencies into jars for non-Android projects.
*/
public class AarDepsPlugin implements Plugin<Project> {
@Override
public void apply(Project project) {
project
.getDependencies()
.registerTransform(
reg -> {
reg.getFrom().attribute(ARTIFACT_FORMAT, "aar");
reg.getTo().attribute(ARTIFACT_FORMAT, "jar");
reg.artifactTransform(ClassesJarExtractor.class);
});
.registerTransform(ClassesJarExtractor.class, reg -> {
reg.getParameters().getProjectName().set(project.getName());
reg.getFrom().attribute(ARTIFACT_FORMAT, "aar");
reg.getTo().attribute(ARTIFACT_FORMAT, "jar");
});

project.afterEvaluate(
p ->
Expand Down Expand Up @@ -72,15 +77,38 @@ private List<File> findAarFiles(FileCollection files) {
return bad;
}

static class ClassesJarExtractor extends ExtractAarTransform {
public static abstract class ClassesJarExtractor extends ExtractAarTransform {
@Inject
public ClassesJarExtractor() {
}

@Override
public List<File> transform(File input) {
List<File> out = super.transform(input);
File classesJar = new File(out.get(0), "jars/classes.jar");
// jar needs a quasi-unique name or IntelliJ Gradle/Android plugins get confused...
File renamed = new File(classesJar.getParent(), input.getName().replace(".aar", ".jar"));
classesJar.renameTo(renamed);
return Collections.singletonList(renamed);
public void transform(@NotNull TransformOutputs outputs) {
AtomicReference<File> classesJarFile = new AtomicReference<>();
AtomicReference<File> outJarFile = new AtomicReference<>();
super.transform(new TransformOutputs() {
// This is the one that ExtractAarTransform calls.
@Override
public File dir(Object o) {
// ExtractAarTransform needs a place to extract the AAR. We don't really need to
// register this as an output, but it'd be tricky to avoid it.
File dir = outputs.dir(o);

// Also, register our jar file. Its name needs to be quasi-unique or
// IntelliJ Gradle/Android plugins get confused.
classesJarFile.set(new File(new File(dir, "jars"), "classes.jar"));
outJarFile.set(new File(new File(dir, "jars"), o + ".jar"));
outputs.file(o + "/jars/" + o + ".jar");
return outputs.dir(o);
}

@Override
public File file(Object o) {
throw new IllegalStateException("shouldn't be called");
}
});

classesJarFile.get().renameTo(outJarFile.get());
}
}
}

0 comments on commit d92f6f0

Please sign in to comment.