Skip to content

Commit f1b690f

Browse files
authored
Merge pull request #70 from gradle/lptr/clear-up-3.2.x-situation
Clear up 3.2.x situation
2 parents 0f1b2c0 + 4cec765 commit f1b690f

File tree

8 files changed

+113
-55
lines changed

8 files changed

+113
-55
lines changed

README.md

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,11 @@
55
Some Android plugin versions have issues with Gradle's build cache feature. When applied to an Android project this plugin applies workarounds for these issues based on the Android plugin and Gradle versions.
66

77
* Supported Gradle versions: 4.1+
8-
* Supported Android versions: 3.0.0, 3.0.1, 3.1.0, 3.1.1, 3.1.2, 3.2.0-alpha01
8+
* Supported Android versions: 3.0.0, 3.0.1, 3.1.0, 3.1.1, 3.1.2, 3.1.3
99

10-
**Note:** With Android 3.1.x and 3.2.x the cache-fix plugin is only required if you are using Android's data binding feature.
10+
**Note:** With Android 3.1.x the cache-fix plugin is only required if you are using Android's data binding feature.
11+
12+
**Note:** With Android 3.2.x the cache-fix plugin is not required.
1113

1214
## List of issues
1315

build.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import groovy.json.JsonBuilder
33
buildscript {
44
repositories {
55
maven {
6-
url "https://plugins.gradle.org/m2/"
6+
url = "https://plugins.gradle.org/m2/"
77
}
88
}
99
dependencies {
@@ -22,7 +22,7 @@ version = ["git", "describe", "--match", "[0-9]*", "--dirty"].execute().text.tri
2222

2323
// Maps supported Android plugin versions to the versions of Gradle that support it
2424
def supportedVersions = [
25-
"3.2.0-alpha01": ["4.5.1", "4.6", "4.7", "4.8.1"],
25+
"3.2.0-alpha18": ["4.8.1"],
2626
"3.1.3": ["4.4.1", "4.5.1", "4.6", "4.7", "4.8.1"],
2727
"3.1.2": ["4.4.1"],
2828
"3.1.1": ["4.4.1"],

src/main/groovy/org/gradle/android/AndroidCacheFixPlugin.groovy

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,7 @@ import org.gradle.util.VersionNumber
2222
import org.slf4j.Logger
2323
import org.slf4j.LoggerFactory
2424

25-
import static org.gradle.android.CompilerArgsProcessor.AnnotationProcessorOverride
26-
import static org.gradle.android.CompilerArgsProcessor.Skip
27-
import static org.gradle.android.CompilerArgsProcessor.SkipNext
25+
import static org.gradle.android.CompilerArgsProcessor.*
2826
import static org.gradle.android.Versions.android
2927

3028
@CompileStatic
@@ -61,7 +59,9 @@ class AndroidCacheFixPlugin implements Plugin<Project> {
6159
workaround.apply(context)
6260
}
6361

64-
if (currentAndroidVersion.baseVersion >= android("3.1.0-alpha06")) {
62+
if (currentAndroidVersion.baseVersion >= android("3.2.0")) {
63+
LOGGER.warn("WARNING: Android cache-fix plugin is not required for {} when using Android plugin {} or later.", project, currentAndroidVersion)
64+
} else if (currentAndroidVersion.baseVersion >= android("3.1.0")) {
6565
project.afterEvaluate {
6666
if (!project.getExtensions().findByType(AndroidConfig)?.dataBinding?.enabled) {
6767
LOGGER.warn("WARNING: Android cache-fix plugin is not required for {} when using Android plugin {} or later, unless Android data binding is used.", project, currentAndroidVersion)
@@ -158,7 +158,7 @@ class AndroidCacheFixPlugin implements Plugin<Project> {
158158
/**
159159
* Override path sensitivity for {@link AndroidJavaCompile#getDataBindingDependencyArtifacts()} to {@link PathSensitivity#RELATIVE}.
160160
*/
161-
@AndroidIssue(introducedIn = "3.0.0", link = "https://issuetracker.google.com/issues/69243050")
161+
@AndroidIssue(introducedIn = "3.0.0", fixedIn = "3.2.0-alpha18", link = "https://issuetracker.google.com/issues/69243050")
162162
static class DataBindingDependencyArtifacts_Workaround implements Workaround {
163163
@Override
164164
void apply(WorkaroundContext context) {
@@ -168,6 +168,7 @@ class AndroidCacheFixPlugin implements Plugin<Project> {
168168
compilerArgsProcessor.addRule(Skip.matching("-Aandroid.databinding.sdkDir=.*"))
169169
compilerArgsProcessor.addRule(Skip.matching("-Aandroid.databinding.bindingBuildFolder=.*"))
170170
compilerArgsProcessor.addRule(Skip.matching("-Aandroid.databinding.xmlOutDir=.*"))
171+
compilerArgsProcessor.addRule(InputDirectory.withAnnotationProcessorArgument("android.databinding.baseFeatureInfo"))
171172

172173
def outputRules = [
173174
AnnotationProcessorOverride.of("android.databinding.generationalFileOutDir") { Task task, String path ->

src/main/groovy/org/gradle/android/CompilerArgsProcessor.groovy

Lines changed: 31 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,11 @@ package org.gradle.android
33
import com.android.build.gradle.tasks.factory.AndroidJavaCompile
44
import groovy.transform.CompileStatic
55
import groovy.transform.TypeCheckingMode
6+
import org.gradle.android.CompilerArgsProcessor.Rule
67
import org.gradle.api.Project
78
import org.gradle.api.Task
9+
import org.gradle.api.tasks.PathSensitivity
10+
import org.gradle.api.tasks.TaskInputs
811
import org.gradle.internal.BiAction
912

1013
import java.util.regex.Matcher
@@ -20,7 +23,7 @@ class CompilerArgsProcessor {
2023
this.project = project
2124
this.rules = [new Rule(Pattern.compile(".*")) {
2225
@Override
23-
void process(Matcher match, Collection<String> processedArgs, Iterator<String> remainingArgs) {
26+
void process(Matcher match, Collection<String> processedArgs, Iterator<String> remainingArgs, TaskInputs inputs) {
2427
processedArgs.add(match.group())
2528
}
2629
}] as List<Rule>
@@ -41,22 +44,22 @@ class CompilerArgsProcessor {
4144
project.tasks.withType(AndroidJavaCompile) { AndroidJavaCompile task ->
4245
project.gradle.taskGraph.beforeTask {
4346
if (task == it) {
44-
def processedArgs = processArgs(task.options.compilerArgs)
47+
def processedArgs = processArgs(task.options.compilerArgs, task.inputs)
4548
overrideProperty(task, processedArgs)
4649
}
4750
}
4851
}
4952
}
5053

51-
List<String> processArgs(List<String> args) {
54+
List<String> processArgs(List<String> args, TaskInputs inputs) {
5255
def processedArgs = []
5356
def remainingArgs = args.iterator()
5457
while (remainingArgs.hasNext()) {
5558
def arg = remainingArgs.next()
5659
for (Rule rule : rules) {
5760
def matcher = rule.pattern.matcher(arg)
5861
if (matcher.matches()) {
59-
rule.process(matcher, processedArgs, remainingArgs)
62+
rule.process(matcher, processedArgs, remainingArgs, inputs)
6063
break
6164
}
6265
}
@@ -83,7 +86,7 @@ class CompilerArgsProcessor {
8386
return new AnnotationProcessorOverride(property, action)
8487
}
8588

86-
void process(Matcher match, Collection<String> processedArgs, Iterator<String> remainingArgs) {
89+
void process(Matcher match, Collection<String> processedArgs, Iterator<String> remainingArgs, TaskInputs inputs) {
8790
// Skip the arg
8891
}
8992

@@ -103,6 +106,26 @@ class CompilerArgsProcessor {
103106
}
104107
}
105108

109+
static class InputDirectory extends Rule {
110+
private final String argumentName
111+
112+
InputDirectory(String argumentName) {
113+
super(Pattern.compile("-A" + Pattern.quote(argumentName) + "=(.*)"))
114+
this.argumentName = argumentName
115+
}
116+
117+
static InputDirectory withAnnotationProcessorArgument(String argumentName) {
118+
return new InputDirectory(argumentName)
119+
}
120+
121+
@Override
122+
void process(Matcher match, Collection<String> processedArgs, Iterator<String> remainingArgs, TaskInputs inputs) {
123+
inputs.dir(match.group(1))
124+
.withPathSensitivity(PathSensitivity.RELATIVE)
125+
.withPropertyName(argumentName)
126+
}
127+
}
128+
106129
static class Skip extends Rule {
107130
Skip(Pattern pattern) {
108131
super(pattern)
@@ -113,7 +136,7 @@ class CompilerArgsProcessor {
113136
}
114137

115138
@Override
116-
void process(Matcher match, Collection<String> processedArgs, Iterator<String> remainingArgs) {
139+
void process(Matcher match, Collection<String> processedArgs, Iterator<String> remainingArgs, TaskInputs inputs) {
117140
}
118141
}
119142

@@ -127,7 +150,7 @@ class CompilerArgsProcessor {
127150
}
128151

129152
@Override
130-
void process(Matcher match, Collection<String> processedArgs, Iterator<String> remainingArgs) {
153+
void process(Matcher match, Collection<String> processedArgs, Iterator<String> remainingArgs, TaskInputs inputs) {
131154
if (remainingArgs.hasNext()) {
132155
remainingArgs.next()
133156
}
@@ -141,7 +164,7 @@ class CompilerArgsProcessor {
141164
this.pattern = pattern
142165
}
143166

144-
abstract void process(Matcher match, Collection<String> processedArgs, Iterator<String> remainingArgs)
167+
abstract void process(Matcher match, Collection<String> processedArgs, Iterator<String> remainingArgs, TaskInputs inputs)
145168

146169
@Override
147170
String toString() {

src/test/groovy/org/gradle/android/CompilerArgsProcessorTest.groovy

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,15 @@ package org.gradle.android
22

33
import org.gradle.api.Project
44
import org.gradle.api.Task
5+
import org.gradle.api.tasks.TaskInputs
56
import spock.lang.Specification
67

78
import static org.gradle.android.CompilerArgsProcessor.AnnotationProcessorOverride
89
import static org.gradle.android.CompilerArgsProcessor.Skip
910
import static org.gradle.android.CompilerArgsProcessor.SkipNext
1011

1112
class CompilerArgsProcessorTest extends Specification {
12-
def task = null
13+
def inputs = Stub(TaskInputs)
1314
CompilerArgsProcessor processor
1415

1516
def setup() {
@@ -18,22 +19,22 @@ class CompilerArgsProcessorTest extends Specification {
1819

1920
def "processes arguments by default"() {
2021
expect:
21-
processor.processArgs([]) == []
22-
processor.processArgs(["alma", "bela", "-switch"]) == ["alma", "bela", "-switch"]
22+
processor.processArgs([], inputs) == []
23+
processor.processArgs(["alma", "bela", "-switch"], inputs) == ["alma", "bela", "-switch"]
2324
}
2425

2526
def "can skip arg"() {
2627
processor.addRule(Skip.matching("-s"))
2728
expect:
28-
processor.processArgs([]) == []
29-
processor.processArgs(["alma", "bela", "-s", "-switch"]) == ["alma", "bela", "-switch"]
29+
processor.processArgs([], inputs) == []
30+
processor.processArgs(["alma", "bela", "-s", "-switch"], inputs) == ["alma", "bela", "-switch"]
3031
}
3132

3233
def "can skip multiple args"() {
3334
processor.addRule(SkipNext.matching("-s"))
3435
expect:
35-
processor.processArgs([]) == []
36-
processor.processArgs(["alma", "bela", "-s", "file.txt", "-switch"]) == ["alma", "bela", "-switch"]
36+
processor.processArgs([], inputs) == []
37+
processor.processArgs(["alma", "bela", "-s", "file.txt", "-switch"], inputs) == ["alma", "bela", "-switch"]
3738
}
3839

3940
def "can override annotation processor parameters"() {
@@ -47,8 +48,8 @@ class CompilerArgsProcessorTest extends Specification {
4748
processor.addRule(rule)
4849

4950
expect:
50-
processor.processArgs([]) == []
51-
processor.processArgs(args) == ["alma", "bela", "-Abela=123"]
51+
processor.processArgs([], inputs) == []
52+
processor.processArgs(args, inputs) == ["alma", "bela", "-Abela=123"]
5253

5354
when:
5455
rule.configureTask(task, args)

src/test/groovy/org/gradle/android/PluginApplicationTest.groovy

Lines changed: 20 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -23,37 +23,38 @@ class PluginApplicationTest extends AbstractTest {
2323
}
2424

2525
@Unroll
26-
def "does #description about being useless for Android version #androidVersion (data binding: #dataBinding)"() {
26+
def "#desc warning for being useless with Android version #androidVersion (data binding: #dataBinding)"() {
2727
def projectDir = temporaryFolder.newFolder()
2828
new SimpleAndroidApp(projectDir, cacheDir, androidVersion, dataBinding).writeProject()
29-
def message = "WARNING: Android cache-fix plugin is not required for project ':library' when using Android plugin $androidVersion or later, unless Android data binding is used."
3029

3130
expect:
3231
def result = withGradleVersion(Iterables.getLast(Versions.SUPPORTED_GRADLE_VERSIONS).version)
3332
.withProjectDir(projectDir)
3433
.withArguments("tasks")
3534
.withDebug(true)
3635
.build()
37-
if (warns) {
38-
assert result.output.contains(message)
36+
if (message == null) {
37+
assert !result.output.contains("WARNING: Android cache-fix plugin is not required")
3938
} else {
40-
assert !(result.output.contains(message))
39+
assert result.output.contains(message)
4140
}
4241

4342
where:
44-
warns | dataBinding | androidVersion
45-
false | true | "3.0.0"
46-
false | false | "3.0.0"
47-
false | true | "3.0.1"
48-
false | false | "3.0.1"
49-
false | true | "3.1.0"
50-
true | false | "3.1.0"
51-
false | true | "3.1.1"
52-
true | false | "3.1.1"
53-
false | true | "3.1.2"
54-
true | false | "3.1.2"
55-
false | true | "3.2.0-alpha01"
56-
true | false | "3.2.0-alpha01"
57-
description = warns ? "warn" : "not warn"
43+
dataBinding | androidVersion | message
44+
true | "3.0.0" | null
45+
false | "3.0.0" | null
46+
true | "3.0.1" | null
47+
false | "3.0.1" | null
48+
true | "3.1.0" | null
49+
false | "3.1.0" | "WARNING: Android cache-fix plugin is not required for project ':library' when using Android plugin 3.1.0 or later, unless Android data binding is used."
50+
true | "3.1.1" | null
51+
false | "3.1.1" | "WARNING: Android cache-fix plugin is not required for project ':library' when using Android plugin 3.1.1 or later, unless Android data binding is used."
52+
true | "3.1.2" | null
53+
false | "3.1.2" | "WARNING: Android cache-fix plugin is not required for project ':library' when using Android plugin 3.1.2 or later, unless Android data binding is used."
54+
true | "3.1.3" | null
55+
false | "3.1.3" | "WARNING: Android cache-fix plugin is not required for project ':library' when using Android plugin 3.1.3 or later, unless Android data binding is used."
56+
true | "3.2.0-alpha18" | "WARNING: Android cache-fix plugin is not required for project ':library' when using Android plugin 3.2.0-alpha18 or later."
57+
false | "3.2.0-alpha18" | "WARNING: Android cache-fix plugin is not required for project ':library' when using Android plugin 3.2.0-alpha18 or later."
58+
desc = message == null ? "does not print" : "prints"
5859
}
5960
}

src/test/groovy/org/gradle/android/RelocationTest.groovy

Lines changed: 32 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ class RelocationTest extends AbstractTest {
5656
relocatedDir.deleteDir()
5757

5858
where:
59+
//noinspection GroovyAssignabilityCheck
5960
[androidVersion, gradleVersion] << Versions.SUPPORTED_VERSIONS_MATRIX.entries().collect { [it.key, it.value] }
6061
}
6162

@@ -85,6 +86,7 @@ class RelocationTest extends AbstractTest {
8586

8687
private static ExpectedResults expectedResults(VersionNumber androidVersion, GradleVersion gradleVersion) {
8788
def isAndroid30x = androidVersion <= android("3.0.1")
89+
def isAndroid32x = androidVersion >= android("3.2.0-alpha18")
8890
def builder = ImmutableMap.<String, TaskOutcome>builder()
8991
builder.put(':app:assemble', SUCCESS)
9092
builder.put(':app:assembleDebug', SUCCESS)
@@ -95,20 +97,31 @@ class RelocationTest extends AbstractTest {
9597
builder.put(':app:checkReleaseManifest', isAndroid30x
9698
? FROM_CACHE
9799
: SUCCESS)
98-
builder.put(':app:compileDebugAidl', FROM_CACHE)
100+
builder.put(':app:compileDebugAidl', isAndroid32x
101+
? NO_SOURCE
102+
: FROM_CACHE)
99103
builder.put(':app:compileDebugJavaWithJavac', FROM_CACHE)
100104
builder.put(':app:compileDebugNdk', NO_SOURCE)
101105
builder.put(':app:compileDebugRenderscript', FROM_CACHE)
102106
builder.put(':app:compileDebugShaders', FROM_CACHE)
103107
builder.put(':app:compileDebugSources', UP_TO_DATE)
104-
builder.put(':app:compileReleaseAidl', FROM_CACHE)
108+
builder.put(':app:compileReleaseAidl', isAndroid32x
109+
? NO_SOURCE
110+
: FROM_CACHE)
105111
builder.put(':app:compileReleaseJavaWithJavac', FROM_CACHE)
106112
builder.put(':app:compileReleaseNdk', NO_SOURCE)
107113
builder.put(':app:compileReleaseRenderscript', FROM_CACHE)
108114
builder.put(':app:compileReleaseShaders', FROM_CACHE)
109115
builder.put(':app:compileReleaseSources', UP_TO_DATE)
110-
builder.put(':app:createDebugCompatibleScreenManifests', FROM_CACHE)
111-
builder.put(':app:createReleaseCompatibleScreenManifests', FROM_CACHE)
116+
117+
// See https://issuetracker.google.com/issues/110408030
118+
builder.put(':app:createDebugCompatibleScreenManifests', isAndroid32x
119+
? SUCCESS
120+
: FROM_CACHE)
121+
builder.put(':app:createReleaseCompatibleScreenManifests', isAndroid32x
122+
? SUCCESS
123+
: FROM_CACHE)
124+
112125
builder.put(':app:generateDebugAssets', UP_TO_DATE)
113126
builder.put(':app:generateDebugBuildConfig', FROM_CACHE)
114127
builder.put(':app:generateDebugResources', UP_TO_DATE)
@@ -172,21 +185,28 @@ class RelocationTest extends AbstractTest {
172185
builder.put(':library:checkReleaseManifest', isAndroid30x
173186
? FROM_CACHE
174187
: SUCCESS)
175-
builder.put(':library:compileDebugAidl', FROM_CACHE)
188+
builder.put(':library:compileDebugAidl', isAndroid32x
189+
? NO_SOURCE
190+
: FROM_CACHE)
176191
builder.put(':library:compileDebugJavaWithJavac', FROM_CACHE)
177192
builder.put(':library:compileDebugNdk', NO_SOURCE)
178193
builder.put(':library:compileDebugRenderscript', FROM_CACHE)
179194
builder.put(':library:compileDebugShaders', FROM_CACHE)
180195
builder.put(':library:compileDebugSources', UP_TO_DATE)
181-
builder.put(':library:compileReleaseAidl', FROM_CACHE)
196+
builder.put(':library:compileReleaseAidl', isAndroid32x
197+
? NO_SOURCE
198+
: FROM_CACHE)
182199
builder.put(':library:compileReleaseJavaWithJavac', FROM_CACHE)
183200
builder.put(':library:compileReleaseNdk', NO_SOURCE)
184201
builder.put(':library:compileReleaseRenderscript', FROM_CACHE)
185202
builder.put(':library:compileReleaseShaders', FROM_CACHE)
186203
builder.put(':library:compileReleaseSources', UP_TO_DATE)
187-
// TODO Does not load from cache because of data binding generates random UUID in source
188-
builder.put(':library:extractDebugAnnotations', SUCCESS)
189-
builder.put(':library:extractReleaseAnnotations', SUCCESS)
204+
builder.put(':library:extractDebugAnnotations', isAndroid32x
205+
? FROM_CACHE
206+
: SUCCESS)
207+
builder.put(':library:extractReleaseAnnotations', isAndroid32x
208+
? FROM_CACHE
209+
: SUCCESS)
190210
builder.put(':library:generateDebugAssets', UP_TO_DATE)
191211
builder.put(':library:generateDebugBuildConfig', FROM_CACHE)
192212
builder.put(':library:generateDebugResources', UP_TO_DATE)
@@ -224,7 +244,9 @@ class RelocationTest extends AbstractTest {
224244
builder.put(':library:packageDebugResources', FROM_CACHE)
225245
builder.put(':library:packageReleaseRenderscript', NO_SOURCE)
226246
builder.put(':library:packageReleaseResources', FROM_CACHE)
227-
builder.put(':library:platformAttrExtractor', FROM_CACHE)
247+
if (!isAndroid32x) {
248+
builder.put(':library:platformAttrExtractor', FROM_CACHE)
249+
}
228250
builder.put(':library:preBuild', UP_TO_DATE)
229251
builder.put(':library:preDebugBuild', UP_TO_DATE)
230252
builder.put(':library:prepareLintJar', SUCCESS)

0 commit comments

Comments
 (0)