Skip to content

Commit 6c72014

Browse files
authored
Update metalava api.txt, fix metalava task. (#1049)
* Update metalava api.txt, fix metalava task. * Update api.txt * Cleanup * Update buildSrc/src/main/groovy/com/google/firebase/gradle/plugins/FirebaseLibraryPlugin.java Co-Authored-By: Rodrigo Lazo <[email protected]> * Address review feedback.
1 parent 00956bc commit 6c72014

File tree

26 files changed

+752
-374
lines changed

26 files changed

+752
-374
lines changed

buildSrc/src/main/groovy/com/google/firebase/gradle/plugins/FirebaseLibraryPlugin.java

Lines changed: 76 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,9 @@
2727
import java.nio.file.Paths;
2828
import org.gradle.api.Plugin;
2929
import org.gradle.api.Project;
30+
import org.gradle.api.attributes.Attribute;
31+
import org.gradle.api.file.FileCollection;
32+
import org.gradle.api.tasks.TaskProvider;
3033
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile;
3134

3235
public class FirebaseLibraryPlugin implements Plugin<Project> {
@@ -101,55 +104,80 @@ private static void setupApiInformationAnalysis(Project project, LibraryExtensio
101104
task -> {
102105
task.setOutputFile(metalavaOutputJarFile);
103106
});
104-
project
105-
.getTasks()
106-
.register(
107-
"apiInformation",
108-
ApiInformationTask.class,
109-
task -> {
110-
task.setApiTxt(project.file("api.txt"));
111-
task.setMetalavaJarPath(metalavaOutputJarFile.getAbsolutePath());
112-
task.setSourceSet(mainSourceSet);
113-
task.setOutputFile(outputFile);
114-
task.setBaselineFile(project.file("baseline.txt"));
115-
task.setOutputApiFile(outputApiFile);
116-
if (project.hasProperty("updateBaseline")) {
117-
task.setUpdateBaseline(true);
118-
} else {
119-
task.setUpdateBaseline(false);
120-
}
121-
task.dependsOn("getMetalavaJar");
122-
});
123-
124-
project
125-
.getTasks()
126-
.register(
127-
"generateApiTxtFile",
128-
GenerateApiTxtFileTask.class,
129-
task -> {
130-
task.setApiTxt(project.file("api.txt"));
131-
task.setMetalavaJarPath(metalavaOutputJarFile.getAbsolutePath());
132-
task.setSourceSet(mainSourceSet);
133-
task.setBaselineFile(project.file("baseline.txt"));
134-
if (project.hasProperty("updateBaseline")) {
135-
task.setUpdateBaseline(true);
136-
} else {
137-
task.setUpdateBaseline(false);
107+
File apiTxt =
108+
project.file("api.txt").exists()
109+
? project.file("api.txt")
110+
: project.file(project.getRootDir() + "/empty-api.txt");
111+
TaskProvider<ApiInformationTask> apiInfo =
112+
project
113+
.getTasks()
114+
.register(
115+
"apiInformation",
116+
ApiInformationTask.class,
117+
task -> {
118+
task.setApiTxt(apiTxt);
119+
task.setMetalavaJarPath(metalavaOutputJarFile.getAbsolutePath());
120+
task.setSourceSet(mainSourceSet);
121+
task.setOutputFile(outputFile);
122+
task.setBaselineFile(project.file("baseline.txt"));
123+
task.setOutputApiFile(outputApiFile);
124+
if (project.hasProperty("updateBaseline")) {
125+
task.setUpdateBaseline(true);
126+
} else {
127+
task.setUpdateBaseline(false);
128+
}
129+
task.dependsOn("getMetalavaJar");
130+
});
131+
132+
TaskProvider<GenerateApiTxtFileTask> generateApiTxt =
133+
project
134+
.getTasks()
135+
.register(
136+
"generateApiTxtFile",
137+
GenerateApiTxtFileTask.class,
138+
task -> {
139+
task.setApiTxt(project.file("api.txt"));
140+
task.setMetalavaJarPath(metalavaOutputJarFile.getAbsolutePath());
141+
task.setSourceSet(mainSourceSet);
142+
task.setBaselineFile(project.file("baseline.txt"));
143+
task.setUpdateBaseline(project.hasProperty("updateBaseline"));
144+
task.dependsOn("getMetalavaJar");
145+
});
146+
147+
TaskProvider<GenerateStubsTask> docStubs =
148+
project
149+
.getTasks()
150+
.register(
151+
"docStubs",
152+
GenerateStubsTask.class,
153+
task -> {
154+
task.setMetalavaJarPath(metalavaOutputJarFile.getAbsolutePath());
155+
task.setOutputDir(new File(project.getBuildDir(), "doc-stubs"));
156+
task.dependsOn("getMetalavaJar");
157+
158+
task.setSourceSet(mainSourceSet);
159+
});
160+
161+
android
162+
.getLibraryVariants()
163+
.all(
164+
v -> {
165+
if (v.getName().equals("release")) {
166+
FileCollection jars =
167+
v.getCompileConfiguration()
168+
.getIncoming()
169+
.artifactView(
170+
config ->
171+
config.attributes(
172+
container ->
173+
container.attribute(
174+
Attribute.of("artifactType", String.class), "jar")))
175+
.getArtifacts()
176+
.getArtifactFiles();
177+
apiInfo.configure(t -> t.setClassPath(jars));
178+
generateApiTxt.configure(t -> t.setClassPath(jars));
179+
docStubs.configure(t -> t.setClassPath(jars));
138180
}
139-
task.dependsOn("getMetalavaJar");
140-
});
141-
142-
project
143-
.getTasks()
144-
.register(
145-
"docStubs",
146-
GenerateStubsTask.class,
147-
task -> {
148-
task.setMetalavaJarPath(metalavaOutputJarFile.getAbsolutePath());
149-
task.setOutputDir(new File(project.getBuildDir(), "doc-stubs"));
150-
task.dependsOn("getMetalavaJar");
151-
152-
task.setSourceSet(mainSourceSet);
153181
});
154182
}
155183

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
// Copyright 2019 Google LLC
2+
//
3+
// Licensed under the Apache License, Version 2.0 (the "License");
4+
// you may not use this file except in compliance with the License.
5+
// You may obtain a copy of the License at
6+
//
7+
// http://www.apache.org/licenses/LICENSE-2.0
8+
//
9+
// Unless required by applicable law or agreed to in writing, software
10+
// distributed under the License is distributed on an "AS IS" BASIS,
11+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
// See the License for the specific language governing permissions and
13+
// limitations under the License.
14+
15+
package com.google.firebase.gradle.plugins;
16+
17+
import com.android.build.gradle.LibraryExtension;
18+
import java.io.File;
19+
import java.io.FileInputStream;
20+
import java.io.IOException;
21+
import java.util.Properties;
22+
import org.gradle.api.GradleException;
23+
import org.gradle.api.Project;
24+
25+
public final class SdkUtil {
26+
public static File getSdkDir(Project project) {
27+
Properties properties = new Properties();
28+
File localProperties = project.getRootProject().file("local.properties");
29+
if (localProperties.exists()) {
30+
try (FileInputStream fis = new FileInputStream(localProperties)) {
31+
properties.load(fis);
32+
} catch (IOException ex) {
33+
throw new GradleException("Could not load local.properties", ex);
34+
}
35+
}
36+
37+
String sdkDir = properties.getProperty("sdk.dir");
38+
if (sdkDir != null) {
39+
return project.file(sdkDir);
40+
}
41+
String androidHome = System.getenv("ANDROID_HOME");
42+
if (androidHome == null) {
43+
throw new GradleException("No sdk.dir or ANDROID_HOME set.");
44+
}
45+
return project.file(androidHome);
46+
}
47+
48+
public static File getAndroidJar(Project project) {
49+
LibraryExtension android = project.getExtensions().findByType(LibraryExtension.class);
50+
if (android == null) {
51+
throw new GradleException("Project " + project.getPath() + " is not an android library.");
52+
}
53+
return new File(
54+
getSdkDir(project),
55+
String.format("/platforms/%s/android.jar", android.getCompileSdkVersion()));
56+
}
57+
}

buildSrc/src/main/groovy/com/google/firebase/gradle/plugins/apiinfo/ApiInformationTask.java

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,17 +15,25 @@
1515
package com.google.firebase.gradle.plugins.apiinfo;
1616

1717
import com.android.build.gradle.api.AndroidSourceSet;
18+
import com.google.firebase.gradle.plugins.SdkUtil;
19+
1820
import java.io.File;
1921
import java.io.FileNotFoundException;
2022
import java.io.FileOutputStream;
2123
import java.util.ArrayList;
2224
import java.util.Arrays;
2325
import java.util.List;
2426
import java.util.stream.Collectors;
27+
import java.util.stream.Stream;
28+
import java.util.stream.StreamSupport;
29+
2530
import org.gradle.api.DefaultTask;
2631
import org.gradle.api.GradleException;
32+
import org.gradle.api.artifacts.Configuration;
33+
import org.gradle.api.file.FileCollection;
2734
import org.gradle.api.tasks.Input;
2835
import org.gradle.api.tasks.InputFile;
36+
import org.gradle.api.tasks.InputFiles;
2937
import org.gradle.api.tasks.OutputFile;
3038
import org.gradle.api.tasks.TaskAction;
3139

@@ -43,6 +51,9 @@ public abstract class ApiInformationTask extends DefaultTask {
4351

4452
abstract AndroidSourceSet getSourceSet();
4553

54+
@InputFiles
55+
abstract FileCollection getClassPath();
56+
4657
@OutputFile
4758
abstract File getBaselineFile();
4859

@@ -57,6 +68,8 @@ public abstract class ApiInformationTask extends DefaultTask {
5768

5869
public abstract void setSourceSet(AndroidSourceSet value);
5970

71+
public abstract void setClassPath(FileCollection value);
72+
6073
public abstract void setBaselineFile(File value);
6174

6275
public abstract void setUpdateBaseline(boolean value);
@@ -76,6 +89,19 @@ void execute() {
7689
.filter(File::exists)
7790
.map(File::getAbsolutePath)
7891
.collect(Collectors.joining(":"));
92+
if (sourcePath.isEmpty()) {
93+
getLogger()
94+
.warn(
95+
"Project {} has no sources in main source set, skipping...", getProject().getPath());
96+
return;
97+
}
98+
99+
String classPath =
100+
Stream.concat(
101+
getClassPath().getFiles().stream(), Stream.of(SdkUtil.getAndroidJar(getProject())))
102+
.map(File::getAbsolutePath)
103+
.collect(Collectors.joining(":"));
104+
79105
File outputFileDir = getOutputFile().getParentFile();
80106
if (!outputFileDir.exists()) {
81107
outputFileDir.mkdirs();
@@ -89,8 +115,11 @@ void execute() {
89115
spec.setArgs(
90116
Arrays.asList(
91117
getMetalavaJarPath(),
118+
"--no-banner",
92119
"--source-path",
93120
sourcePath,
121+
"--classpath",
122+
classPath,
94123
"--api",
95124
getOutputApiFile().getAbsolutePath(),
96125
"--format=v2"));
@@ -104,13 +133,13 @@ void execute() {
104133
new ArrayList<>(
105134
Arrays.asList(
106135
getMetalavaJarPath(),
136+
"--no-banner",
107137
"--source-files",
108138
getOutputApiFile().getAbsolutePath(),
109139
"--check-compatibility:api:current",
110140
getApiTxt().getAbsolutePath(),
111141
"--format=v2",
112-
"--no-color",
113-
"--delete-empty-baselines"));
142+
"--no-color"));
114143
if (getUpdateBaseline()) {
115144
args.addAll(
116145
Arrays.asList("--update-baseline", getBaselineFile().getAbsolutePath()));

buildSrc/src/main/groovy/com/google/firebase/gradle/plugins/apiinfo/GenerateApiTxtFileTask.java

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,19 @@
1515
package com.google.firebase.gradle.plugins.apiinfo;
1616

1717
import com.android.build.gradle.api.AndroidSourceSet;
18+
import com.google.firebase.gradle.plugins.SdkUtil;
19+
1820
import java.io.File;
1921
import java.util.ArrayList;
2022
import java.util.Arrays;
2123
import java.util.List;
2224
import java.util.stream.Collectors;
25+
import java.util.stream.Stream;
26+
2327
import org.gradle.api.DefaultTask;
28+
import org.gradle.api.file.FileCollection;
2429
import org.gradle.api.tasks.Input;
30+
import org.gradle.api.tasks.InputFiles;
2531
import org.gradle.api.tasks.OutputFile;
2632
import org.gradle.api.tasks.TaskAction;
2733

@@ -35,6 +41,9 @@ public abstract class GenerateApiTxtFileTask extends DefaultTask {
3541

3642
abstract AndroidSourceSet getSourceSet();
3743

44+
@InputFiles
45+
public abstract FileCollection getClassPath();
46+
3847
@OutputFile
3948
abstract File getBaselineFile();
4049

@@ -43,6 +52,8 @@ public abstract class GenerateApiTxtFileTask extends DefaultTask {
4352

4453
public abstract void setSourceSet(AndroidSourceSet value);
4554

55+
public abstract void setClassPath(FileCollection value);
56+
4657
public abstract void setBaselineFile(File value);
4758

4859
public abstract void setUpdateBaseline(boolean value);
@@ -58,16 +69,29 @@ void execute() {
5869
.filter(File::exists)
5970
.map(File::getAbsolutePath)
6071
.collect(Collectors.joining(":"));
72+
if (sourcePath.isEmpty()) {
73+
getLogger()
74+
.warn(
75+
"Project {} has no sources in main source set, skipping...", getProject().getPath());
76+
return;
77+
}
78+
String classPath =
79+
Stream.concat(
80+
getClassPath().getFiles().stream(), Stream.of(SdkUtil.getAndroidJar(getProject())))
81+
.map(File::getAbsolutePath)
82+
.collect(Collectors.joining(":"));
6183
List<String> args =
6284
new ArrayList<>(
6385
Arrays.asList(
6486
getMetalavaJarPath(),
87+
"--no-banner",
6588
"--source-path",
6689
sourcePath,
90+
"--classpath",
91+
classPath,
6792
"--api",
6893
getApiTxt().getAbsolutePath(),
69-
"--format=v2",
70-
"--delete-empty-baselines"));
94+
"--format=v2"));
7195

7296
if (getUpdateBaseline()) {
7397
args.addAll(Arrays.asList("--update-baseline", getBaselineFile().getAbsolutePath()));

0 commit comments

Comments
 (0)