Skip to content

Commit c4a3918

Browse files
committed
Update metalava api.txt, fix metalava task.
1 parent 00956bc commit c4a3918

File tree

25 files changed

+589
-175
lines changed

25 files changed

+589
-175
lines changed

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

Lines changed: 101 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,10 @@
2727
import java.nio.file.Paths;
2828
import org.gradle.api.Plugin;
2929
import org.gradle.api.Project;
30+
import org.gradle.api.artifacts.ArtifactView;
31+
import org.gradle.api.attributes.Attribute;
32+
import org.gradle.api.file.FileCollection;
33+
import org.gradle.api.tasks.TaskProvider;
3034
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile;
3135

3236
public class FirebaseLibraryPlugin implements Plugin<Project> {
@@ -101,55 +105,104 @@ private static void setupApiInformationAnalysis(Project project, LibraryExtensio
101105
task -> {
102106
task.setOutputFile(metalavaOutputJarFile);
103107
});
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);
108+
File apiTxt =
109+
project.file("api.txt").exists()
110+
? project.file("api.txt")
111+
: project.file(project.getRootDir() + "/empty-api.txt");
112+
TaskProvider<ApiInformationTask> apiInfo =
113+
project
114+
.getTasks()
115+
.register(
116+
"apiInformation",
117+
ApiInformationTask.class,
118+
task -> {
119+
task.setApiTxt(apiTxt);
120+
task.setMetalavaJarPath(metalavaOutputJarFile.getAbsolutePath());
121+
task.setSourceSet(mainSourceSet);
122+
android
123+
.getLibraryVariants()
124+
.all(
125+
v -> {
126+
if (v.getName().equals("release")) {
127+
ArtifactView artifactView =
128+
v.getCompileConfiguration()
129+
.getIncoming()
130+
.artifactView(
131+
config ->
132+
config.attributes(
133+
container ->
134+
container.attribute(
135+
Attribute.of(
136+
"artifactType", String.class),
137+
"jar")));
138+
task.setClassPath(artifactView.getArtifacts().getArtifactFiles());
139+
}
140+
});
141+
142+
task.setOutputFile(outputFile);
143+
task.setBaselineFile(project.file("baseline.txt"));
144+
task.setOutputApiFile(outputApiFile);
145+
if (project.hasProperty("updateBaseline")) {
146+
task.setUpdateBaseline(true);
147+
} else {
148+
task.setUpdateBaseline(false);
149+
}
150+
task.dependsOn("getMetalavaJar");
151+
});
152+
153+
TaskProvider<GenerateApiTxtFileTask> generateApiTxt =
154+
project
155+
.getTasks()
156+
.register(
157+
"generateApiTxtFile",
158+
GenerateApiTxtFileTask.class,
159+
task -> {
160+
task.setApiTxt(project.file("api.txt"));
161+
task.setMetalavaJarPath(metalavaOutputJarFile.getAbsolutePath());
162+
task.setSourceSet(mainSourceSet);
163+
task.setBaselineFile(project.file("baseline.txt"));
164+
if (project.hasProperty("updateBaseline")) {
165+
task.setUpdateBaseline(true);
166+
} else {
167+
task.setUpdateBaseline(false);
168+
}
169+
task.dependsOn("getMetalavaJar");
170+
});
171+
172+
TaskProvider<GenerateStubsTask> docStubs =
173+
project
174+
.getTasks()
175+
.register(
176+
"docStubs",
177+
GenerateStubsTask.class,
178+
task -> {
179+
task.setMetalavaJarPath(metalavaOutputJarFile.getAbsolutePath());
180+
task.setOutputDir(new File(project.getBuildDir(), "doc-stubs"));
181+
task.dependsOn("getMetalavaJar");
182+
183+
task.setSourceSet(mainSourceSet);
184+
});
185+
186+
android
187+
.getLibraryVariants()
188+
.all(
189+
v -> {
190+
if (v.getName().equals("release")) {
191+
FileCollection jars =
192+
v.getCompileConfiguration()
193+
.getIncoming()
194+
.artifactView(
195+
config ->
196+
config.attributes(
197+
container ->
198+
container.attribute(
199+
Attribute.of("artifactType", String.class), "jar")))
200+
.getArtifacts()
201+
.getArtifactFiles();
202+
apiInfo.configure(t -> t.setClassPath(jars));
203+
generateApiTxt.configure(t -> t.setClassPath(jars));
204+
docStubs.configure(t -> t.setClassPath(jars));
138205
}
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);
153206
});
154207
}
155208

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: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,9 @@
2121
import java.util.List;
2222
import java.util.stream.Collectors;
2323
import org.gradle.api.DefaultTask;
24+
import org.gradle.api.file.FileCollection;
2425
import org.gradle.api.tasks.Input;
26+
import org.gradle.api.tasks.InputFiles;
2527
import org.gradle.api.tasks.OutputFile;
2628
import org.gradle.api.tasks.TaskAction;
2729

@@ -35,6 +37,9 @@ public abstract class GenerateApiTxtFileTask extends DefaultTask {
3537

3638
abstract AndroidSourceSet getSourceSet();
3739

40+
@InputFiles
41+
public abstract FileCollection getClassPath();
42+
3843
@OutputFile
3944
abstract File getBaselineFile();
4045

@@ -43,6 +48,8 @@ public abstract class GenerateApiTxtFileTask extends DefaultTask {
4348

4449
public abstract void setSourceSet(AndroidSourceSet value);
4550

51+
public abstract void setClassPath(FileCollection value);
52+
4653
public abstract void setBaselineFile(File value);
4754

4855
public abstract void setUpdateBaseline(boolean value);
@@ -58,16 +65,24 @@ void execute() {
5865
.filter(File::exists)
5966
.map(File::getAbsolutePath)
6067
.collect(Collectors.joining(":"));
68+
if (sourcePath.isEmpty()) {
69+
getLogger()
70+
.warn(
71+
"Project {} has no sources in main source set, skipping...", getProject().getPath());
72+
return;
73+
}
6174
List<String> args =
6275
new ArrayList<>(
6376
Arrays.asList(
6477
getMetalavaJarPath(),
78+
"--no-banner",
6579
"--source-path",
6680
sourcePath,
81+
"--classpath",
82+
getClassPath().getAsPath(),
6783
"--api",
6884
getApiTxt().getAbsolutePath(),
69-
"--format=v2",
70-
"--delete-empty-baselines"));
85+
"--format=v2"));
7186

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

0 commit comments

Comments
 (0)