Skip to content

Commit

Permalink
Remove DownloadJarTask
Browse files Browse the repository at this point in the history
  • Loading branch information
tylerbwong committed Nov 12, 2020
1 parent 461cd06 commit 65f139d
Show file tree
Hide file tree
Showing 26 changed files with 149 additions and 102 deletions.
10 changes: 2 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,7 @@
[![CI](https://github.com/tylerbwong/metalava-gradle/workflows/CI/badge.svg)](https://github.com/tylerbwong/metalava-gradle/actions?query=workflow%3ACI)
[![Gradle Plugin Portal](https://img.shields.io/maven-metadata/v/https/plugins.gradle.org/m2/me/tylerbwong/gradle/metalava/me.tylerbwong.gradle.metalava.gradle.plugin/maven-metadata.xml.svg?colorB=007ec6&label=Gradle%20Plugin%20Portal)](https://plugins.gradle.org/plugin/me.tylerbwong.gradle.metalava)

A Gradle plugin for [Metalava](https://android.googlesource.com/platform/tools/metalava/), AOSP's tool for API metadata extraction and compatibility tracking. This plugin is currently in active development and does not yet fully support all of Metalava's features. Currently it is only capable of generating API signature descriptor files.

### How it Works
This Gradle plugin serves as a wrapper for invoking the Metalava JAR directly. It will first download the JAR if needed from [here](https://storage.googleapis.com/android-ci/metalava-full-1.3.0-SNAPSHOT.jar) if no local JAR is found and then run it using the passed in arguments from `MetalavaExtension`.
A Gradle plugin for [Metalava](https://android.googlesource.com/platform/tools/metalava/), AOSP's tool for API metadata extraction and compatibility tracking. This plugin is currently in active development and does not yet fully support all of Metalava's features. Currently, it is only capable of generating API signature descriptor files.

### Supported Plugins

Expand Down Expand Up @@ -59,10 +56,7 @@ apply plugin: "me.tylerbwong.gradle.metalava"

### Usage

Applying this plugin to a given module will generate two tasks:

1. `downloadMetalavaJar` - Downloads and caches the Metalava JAR in the root project's build folder if one does not exist at the same location already.
2. `metalavaSignature` - Executes the Metalava JAR with the following arguments configured in `MetalavaExtension`. If no custom JAR location is provided, it will use the result of the download task.
Run `./gradlew metalavaSignature` to generate signature descriptor files for each module the plugin is applied to.

The plugin can also be configured using the `metalava` extension block

Expand Down
2 changes: 1 addition & 1 deletion build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ buildscript {
dependencies {
classpath("com.android.tools.build:gradle:4.2.0-alpha16")
classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.4.10")
classpath("me.tylerbwong.gradle:metalava-gradle:0.1.0-alpha05")
classpath("me.tylerbwong.gradle:metalava-gradle:0.1.0-alpha06")
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ package me.tylerbwong.gradle.metalava {

public enum Documentation {
method public String toString();
method public static me.tylerbwong.gradle.metalava.Documentation valueOf(String name);
method public static me.tylerbwong.gradle.metalava.Documentation[] values();
enum_constant public static final me.tylerbwong.gradle.metalava.Documentation HIDDEN;
enum_constant public static final me.tylerbwong.gradle.metalava.Documentation PACKAGE;
enum_constant public static final me.tylerbwong.gradle.metalava.Documentation PRIVATE;
Expand All @@ -12,13 +14,17 @@ package me.tylerbwong.gradle.metalava {

public enum Format {
method public String toString();
method public static me.tylerbwong.gradle.metalava.Format valueOf(String name);
method public static me.tylerbwong.gradle.metalava.Format[] values();
enum_constant public static final me.tylerbwong.gradle.metalava.Format V1;
enum_constant public static final me.tylerbwong.gradle.metalava.Format V2;
enum_constant public static final me.tylerbwong.gradle.metalava.Format V3;
}

public enum Signature {
method public String toString();
method public static me.tylerbwong.gradle.metalava.Signature valueOf(String name);
method public static me.tylerbwong.gradle.metalava.Signature[] values();
enum_constant public static final me.tylerbwong.gradle.metalava.Signature API;
enum_constant public static final me.tylerbwong.gradle.metalava.Signature DEX_API;
enum_constant public static final me.tylerbwong.gradle.metalava.Signature DEX_API_MAPPING;
Expand All @@ -44,6 +50,7 @@ package me.tylerbwong.gradle.metalava.extension {
method public final boolean getShouldOutputDefaultValues();
method public final boolean getShouldOutputKotlinNulls();
method public final me.tylerbwong.gradle.metalava.Signature getSignature();
method public final String getVersion();
method public final void setDocumentation(me.tylerbwong.gradle.metalava.Documentation p);
method public final void setFilename(String p);
method public final void setFormat(me.tylerbwong.gradle.metalava.Format p);
Expand All @@ -54,6 +61,7 @@ package me.tylerbwong.gradle.metalava.extension {
method public final void setShouldOutputDefaultValues(boolean p);
method public final void setShouldOutputKotlinNulls(boolean p);
method public final void setSignature(me.tylerbwong.gradle.metalava.Signature p);
method public final void setVersion(String p);
property public final me.tylerbwong.gradle.metalava.Documentation documentation;
property public final String filename;
property public final me.tylerbwong.gradle.metalava.Format format;
Expand All @@ -65,6 +73,7 @@ package me.tylerbwong.gradle.metalava.extension {
property public final boolean shouldOutputDefaultValues;
property public final boolean shouldOutputKotlinNulls;
property public final me.tylerbwong.gradle.metalava.Signature signature;
property public final String version;
}

}
Expand Down
89 changes: 89 additions & 0 deletions plugin/api/0.1.0-alpha07-SNAPSHOT.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
// Signature format: 3.0
package me.tylerbwong.gradle.metalava {

public enum Documentation {
method public String toString();
method public static me.tylerbwong.gradle.metalava.Documentation valueOf(String name);
method public static me.tylerbwong.gradle.metalava.Documentation[] values();
enum_constant public static final me.tylerbwong.gradle.metalava.Documentation HIDDEN;
enum_constant public static final me.tylerbwong.gradle.metalava.Documentation PACKAGE;
enum_constant public static final me.tylerbwong.gradle.metalava.Documentation PRIVATE;
enum_constant public static final me.tylerbwong.gradle.metalava.Documentation PROTECTED;
enum_constant public static final me.tylerbwong.gradle.metalava.Documentation PUBLIC;
}

public enum Format {
method public String toString();
method public static me.tylerbwong.gradle.metalava.Format valueOf(String name);
method public static me.tylerbwong.gradle.metalava.Format[] values();
enum_constant public static final me.tylerbwong.gradle.metalava.Format V1;
enum_constant public static final me.tylerbwong.gradle.metalava.Format V2;
enum_constant public static final me.tylerbwong.gradle.metalava.Format V3;
}

public enum Signature {
method public String toString();
method public static me.tylerbwong.gradle.metalava.Signature valueOf(String name);
method public static me.tylerbwong.gradle.metalava.Signature[] values();
enum_constant public static final me.tylerbwong.gradle.metalava.Signature API;
enum_constant public static final me.tylerbwong.gradle.metalava.Signature DEX_API;
enum_constant public static final me.tylerbwong.gradle.metalava.Signature DEX_API_MAPPING;
enum_constant public static final me.tylerbwong.gradle.metalava.Signature PRIVATE_API;
enum_constant public static final me.tylerbwong.gradle.metalava.Signature PRIVATE_DEX_API;
enum_constant public static final me.tylerbwong.gradle.metalava.Signature REMOVED_API;
}

}

package me.tylerbwong.gradle.metalava.extension {

public class MetalavaExtension {
ctor public MetalavaExtension();
method public final me.tylerbwong.gradle.metalava.Documentation getDocumentation();
method public final String getFilename();
method public final me.tylerbwong.gradle.metalava.Format getFormat();
method public final java.util.Set<java.lang.String> getHideAnnotations();
method public final org.gradle.api.JavaVersion getJavaSourceLevel();
method public final String? getMetalavaJarPath();
method public final boolean getShouldIncludeSignatureVersion();
method public final boolean getShouldOmitCommonPackages();
method public final boolean getShouldOutputDefaultValues();
method public final boolean getShouldOutputKotlinNulls();
method public final me.tylerbwong.gradle.metalava.Signature getSignature();
method public final String getVersion();
method public final void setDocumentation(me.tylerbwong.gradle.metalava.Documentation p);
method public final void setFilename(String p);
method public final void setFormat(me.tylerbwong.gradle.metalava.Format p);
method public final void setJavaSourceLevel(org.gradle.api.JavaVersion p);
method public final void setMetalavaJarPath(String? p);
method public final void setShouldIncludeSignatureVersion(boolean p);
method public final void setShouldOmitCommonPackages(boolean p);
method public final void setShouldOutputDefaultValues(boolean p);
method public final void setShouldOutputKotlinNulls(boolean p);
method public final void setSignature(me.tylerbwong.gradle.metalava.Signature p);
method public final void setVersion(String p);
property public final me.tylerbwong.gradle.metalava.Documentation documentation;
property public final String filename;
property public final me.tylerbwong.gradle.metalava.Format format;
property public final java.util.Set<java.lang.String> hideAnnotations;
property public final org.gradle.api.JavaVersion javaSourceLevel;
property public final String? metalavaJarPath;
property public final boolean shouldIncludeSignatureVersion;
property public final boolean shouldOmitCommonPackages;
property public final boolean shouldOutputDefaultValues;
property public final boolean shouldOutputKotlinNulls;
property public final me.tylerbwong.gradle.metalava.Signature signature;
property public final String version;
}

}

package me.tylerbwong.gradle.metalava.plugin {

public final class MetalavaPlugin implements org.gradle.api.Plugin<org.gradle.api.Project> {
ctor public MetalavaPlugin();
method public void apply(org.gradle.api.Project target);
}

}

2 changes: 1 addition & 1 deletion plugin/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ plugins {
}

group = "me.tylerbwong.gradle"
version = "0.1.0-alpha06-SNAPSHOT"
version = "0.1.0-alpha07-SNAPSHOT"

gradlePlugin {
plugins {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,4 +30,4 @@ enum class Documentation(private val flagValue: String) {
HIDDEN("--hidden");

override fun toString(): String = flagValue
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,4 @@ enum class Format(private val format: String) {
V3("v3");

override fun toString(): String = format
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -35,4 +35,4 @@ enum class Signature(private val signature: String) {
REMOVED_API("--removed-api");

override fun toString(): String = signature
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,12 @@ import org.gradle.api.JavaVersion

open class MetalavaExtension {
/**
* A custom Metalava JAR location path to use instead of downloading.
* The version of Metalava to use.
*/
var version = "1.0.0-alpha01"

/**
* A custom Metalava JAR location path to use instead of the embedded dependency.
*/
var metalavaJarPath: String? = null

Expand Down Expand Up @@ -67,4 +72,4 @@ open class MetalavaExtension {
* Treat any elements annotated with the given annotation as hidden.
*/
val hideAnnotations = mutableSetOf<String>()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,21 +3,17 @@ package me.tylerbwong.gradle.metalava.plugin
import me.tylerbwong.gradle.metalava.Module
import me.tylerbwong.gradle.metalava.Module.Companion.module
import me.tylerbwong.gradle.metalava.extension.MetalavaExtension
import me.tylerbwong.gradle.task.DownloadTask
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.api.file.FileCollection
import org.gradle.api.tasks.JavaExec
import org.gradle.api.tasks.TaskProvider
import org.gradle.kotlin.dsl.repositories
import java.io.File
import java.util.Locale

/**
* This plugin will register two tasks on modules that it is applied to.
*
* 1. downloadMetalavaJar - Downloads and caches the Metalava JAR in the root project's build folder if one does not
* exist at the same location already.
* 2. metalavaSignature - Executes the Metalava JAR with the following arguments configured in [MetalavaExtension]. If
* no custom JAR location is provided, it will use the result of the download task.
* This plugin will register a helper task `metalavaSignature` on modules that it is applied to. The task runs Metalava
* with the following arguments configured in [MetalavaExtension].
*/
class MetalavaPlugin : Plugin<Project> {

Expand All @@ -27,36 +23,18 @@ class MetalavaPlugin : Plugin<Project> {
with(target) {
val extension = extensions.create("metalava", MetalavaExtension::class.java)
afterEvaluate {
val downloadMetalavaJarTaskProvider = registerDownloadMetalavaJarTask()
registerMetalavaSignatureTask(extension, module, downloadMetalavaJarTaskProvider)
registerMetalavaSignatureTask(extension, module)
}
}
}

private fun Project.registerDownloadMetalavaJarTask(): TaskProvider<DownloadTask> {
return tasks.register(
"downloadMetalavaJar",
DownloadTask::class.java
) {
description = "Downloads a Metalava JAR to the root project build folder."
url.set("https://storage.googleapis.com/android-ci/metalava-full-1.3.0-SNAPSHOT.jar")
output.set(layout.buildDirectory.file("${rootProject.buildDir}/metalava/metalava.jar"))
}
}

private fun Project.registerMetalavaSignatureTask(
extension: MetalavaExtension,
module: Module,
downloadMetalavaJarTaskProvider: TaskProvider<DownloadTask>
) {
private fun Project.registerMetalavaSignatureTask(extension: MetalavaExtension, module: Module) {
tasks.register("metalavaSignature", JavaExec::class.java) {
group = "documentation"
description = "Generates a Metalava signature descriptor file."
@Suppress("UnstableApiUsage")
classpath(
extension.metalavaJarPath?.let { files(it) }
?: downloadMetalavaJarTaskProvider.flatMap { it.output.asFile }
)
main = "com.android.tools.metalava.Driver"
classpath(extension.metalavaJarPath?.let { files(it) } ?: getMetalavaClasspath(extension.version))

val fullClasspath = (module.bootClasspath + module.compileClasspath).joinToString(":")
val sources = file("src").walk()
.maxDepth(2)
Expand Down Expand Up @@ -96,4 +74,17 @@ class MetalavaPlugin : Plugin<Project> {
setArgs(args)
}
}

private fun Project.getMetalavaClasspath(version: String): FileCollection {
repositories {
google()
}
val configuration = configurations.maybeCreate("metalava").apply {
val dependency = this@getMetalavaClasspath.dependencies.create(
"com.android.tools.metalava:metalava:$version"
)
dependencies.add(dependency)
}
return files(configuration)
}
}
41 changes: 0 additions & 41 deletions plugin/src/main/kotlin/me/tylerbwong/gradle/task/DownloadTask.kt

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,4 @@ package me.tylerbwong.gradle.metalava.sample

internal class SampleInternalApi {
val internalApiProperty: String = ""
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,4 @@ package me.tylerbwong.gradle.metalava.sample
interface SamplePublicApi {
val publicApiProperty: String
fun publicApiFunction()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,4 @@ package me.tylerbwong.gradle.metalava.sample

internal class SampleInternalApi {
val internalApiProperty: String = ""
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,4 @@ public abstract class SampleJavaPublicApi {
public static int publicStaticIntFunction(int value) {
return value;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,4 @@ interface SamplePublicApi {
val publicApiProperty: String
val publicApiNullableProperty: String?
fun publicApiFunction()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,4 @@ package me.tylerbwong.gradle.metalava.sample

internal class SampleInternalApi {
val internalApiProperty: String = ""
}
}
Loading

0 comments on commit 65f139d

Please sign in to comment.