From 0cb8590de83b9250eee198a3f82078aad74f42b5 Mon Sep 17 00:00:00 2001 From: corysmith Date: Fri, 3 Aug 2018 15:20:44 -0700 Subject: Reduce and centralize databinding context instances. Due to some of the vagaries of skylark and multiple entry points, the databinding context is currently updated by the parse action. RELNOTES: None PiperOrigin-RevId: 207333111 --- .../build/lib/rules/android/AarImport.java | 7 ++- .../build/lib/rules/android/AndroidBinary.java | 3 +- .../build/lib/rules/android/AndroidLibrary.java | 8 ++- .../lib/rules/android/AndroidLocalTestBase.java | 4 ++ .../AndroidResourceParsingActionBuilder.java | 11 +++- .../build/lib/rules/android/AndroidResources.java | 59 ++++++++++---------- .../android/AndroidResourcesProcessorBuilder.java | 22 +++++--- .../lib/rules/android/AndroidSkylarkData.java | 32 ++++------- .../lib/rules/android/ApplicationManifest.java | 7 +-- .../build/lib/rules/android/DataBinding.java | 32 ++++++++++- .../lib/rules/android/MergedAndroidResources.java | 6 +-- .../lib/rules/android/ParsedAndroidResources.java | 63 +++++++++++++++++----- .../lib/rules/android/ProcessedAndroidData.java | 15 ++++-- .../build/lib/rules/android/ResourceApk.java | 4 +- .../rules/android/ValidatedAndroidResources.java | 5 +- 15 files changed, 181 insertions(+), 97 deletions(-) (limited to 'src/main/java/com/google/devtools/build') diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AarImport.java b/src/main/java/com/google/devtools/build/lib/rules/android/AarImport.java index a7a980cd30..d021892d8f 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AarImport.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AarImport.java @@ -104,7 +104,12 @@ public class AarImport implements RuleConfiguredTargetFactory { boolean neverlink = JavaCommon.isNeverLink(ruleContext); ValidatedAndroidResources validatedResources = AndroidResources.forAarImport(resources) - .process(ruleContext, dataContext, manifest, neverlink); + .process( + ruleContext, + dataContext, + manifest, + DataBinding.contextFrom(ruleContext), + neverlink); MergedAndroidAssets mergedAssets = AndroidAssets.forAarImport(assets) .process( diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java index a413f0c280..959ffe83dd 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java @@ -239,7 +239,8 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { ? ruleContext .getPrerequisite("feature_after", Mode.TARGET, ApkInfo.PROVIDER) .getApk() - : null) + : null, + DataBinding.contextFrom(ruleContext)) .generateRClass(dataContext, aaptVersion); } else { applicationManifest = diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibrary.java index 1a7e53b9ae..58ef404322 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibrary.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibrary.java @@ -174,7 +174,12 @@ public abstract class AndroidLibrary implements RuleConfiguredTargetFactory { ValidatedAndroidResources resources = AndroidResources.from(ruleContext, "resource_files") - .process(ruleContext, dataContext, manifest, isNeverLink); + .process( + ruleContext, + dataContext, + manifest, + DataBinding.contextFrom(ruleContext), + isNeverLink); MergedAndroidAssets assets = AndroidAssets.from(ruleContext) @@ -212,6 +217,7 @@ public abstract class AndroidLibrary implements RuleConfiguredTargetFactory { resourceApk = ResourceApk.processFromTransitiveLibraryData( dataContext, + DataBinding.contextFrom(ruleContext), resourceDeps, assetDeps, StampedAndroidManifest.createEmpty(ruleContext, /* exported = */ false)); diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLocalTestBase.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLocalTestBase.java index f32ea9c9bf..6d02827921 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLocalTestBase.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLocalTestBase.java @@ -37,6 +37,7 @@ import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; import com.google.devtools.build.lib.collect.nestedset.Order; import com.google.devtools.build.lib.packages.BuildType; import com.google.devtools.build.lib.rules.android.AndroidConfiguration.AndroidAaptVersion; +import com.google.devtools.build.lib.rules.android.DataBinding.DataBindingContext; import com.google.devtools.build.lib.rules.java.ClasspathConfiguredFragment; import com.google.devtools.build.lib.rules.java.DeployArchiveBuilder; import com.google.devtools.build.lib.rules.java.JavaCommon; @@ -100,6 +101,7 @@ public abstract class AndroidLocalTestBase implements RuleConfiguredTargetFactor buildResourceApk( dataContext, androidSemantics, + DataBinding.contextFrom(ruleContext), AndroidManifest.fromAttributes(ruleContext, dataContext), AndroidResources.from(ruleContext, "resource_files"), AndroidAssets.from(ruleContext), @@ -557,6 +559,7 @@ public abstract class AndroidLocalTestBase implements RuleConfiguredTargetFactor static ResourceApk buildResourceApk( AndroidDataContext dataContext, AndroidSemantics androidSemantics, + DataBindingContext dataBindingContext, AndroidManifest manifest, AndroidResources resources, AndroidAssets assets, @@ -576,6 +579,7 @@ public abstract class AndroidLocalTestBase implements RuleConfiguredTargetFactor return ProcessedAndroidData.processLocalTestDataFrom( dataContext, + dataBindingContext, stamped, manifestValues, aaptVersion, diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourceParsingActionBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourceParsingActionBuilder.java index aff8128419..e5fe55a0db 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourceParsingActionBuilder.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourceParsingActionBuilder.java @@ -19,6 +19,7 @@ import com.google.common.collect.Iterables; import com.google.common.collect.Streams; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.rules.android.AndroidConfiguration.AndroidAaptVersion; +import com.google.devtools.build.lib.rules.android.DataBinding.DataBindingContext; import com.google.devtools.build.lib.vfs.PathFragment; import javax.annotation.Nullable; @@ -118,7 +119,8 @@ public class AndroidResourceParsingActionBuilder { public ParsedAndroidResources build( AndroidDataContext dataContext, AndroidResources androidResources, - StampedAndroidManifest manifest) { + StampedAndroidManifest manifest, + DataBindingContext dataBindingContext) { if (dataBindingInfoZip != null) { // Manifest information is needed for data binding setManifest(manifest.getManifest()); @@ -129,7 +131,12 @@ public class AndroidResourceParsingActionBuilder { build(dataContext); return ParsedAndroidResources.of( - androidResources, output, compiledSymbols, dataContext.getLabel(), manifest); + androidResources, + output, + compiledSymbols, + dataContext.getLabel(), + manifest, + dataBindingContext); } public ParsedAndroidAssets build(AndroidDataContext dataContext, AndroidAssets assets) { diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResources.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResources.java index ebe36bc995..c78533eb43 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResources.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResources.java @@ -16,6 +16,7 @@ package com.google.devtools.build.lib.rules.android; import com.android.resources.ResourceFolderType; import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Joiner; +import com.google.common.base.MoreObjects; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; @@ -136,32 +137,24 @@ public class AndroidResources { return from( ruleContext, ruleContext.getPrerequisites(resourcesAttr, Mode.TARGET, FileProvider.class), - resourcesAttr, - DataBinding.contextFrom(ruleContext)); + resourcesAttr); } public static AndroidResources from( RuleErrorConsumer errorConsumer, Iterable resourcesTargets, - String resourcesAttr, - DataBindingContext dataBindingContext) + String resourcesAttr) throws RuleErrorException { - return forResources( - errorConsumer, getResources(resourcesTargets), resourcesAttr, dataBindingContext); + return forResources(errorConsumer, getResources(resourcesTargets), resourcesAttr); } /** Returns an {@link AndroidResources} for a list of resource artifacts. */ @VisibleForTesting public static AndroidResources forResources( - RuleErrorConsumer ruleErrorConsumer, - ImmutableList resources, - String resourcesAttr, - DataBindingContext dataBindingContext) + RuleErrorConsumer ruleErrorConsumer, ImmutableList resources, String resourcesAttr) throws RuleErrorException { return new AndroidResources( - resources, - getResourceRoots(ruleErrorConsumer, resources, resourcesAttr), - dataBindingContext); + resources, getResourceRoots(ruleErrorConsumer, resources, resourcesAttr)); } /** @@ -174,8 +167,7 @@ public class AndroidResources { } static AndroidResources empty() { - return new AndroidResources( - ImmutableList.of(), ImmutableList.of(), DataBinding.asDisabledDataBindingContext()); + return new AndroidResources(ImmutableList.of(), ImmutableList.of()); } /** @@ -192,8 +184,7 @@ public class AndroidResources { Preconditions.checkArgument(resourcesDir.isTreeArtifact()); return new AndroidResources( ImmutableList.of(resourcesDir), - ImmutableList.of(resourcesDir.getExecPath().getChild("res")), - DataBinding.asDisabledDataBindingContext()); + ImmutableList.of(resourcesDir.getExecPath().getChild("res"))); } /** @@ -316,20 +307,16 @@ public class AndroidResources { private final ImmutableList resources; private final ImmutableList resourceRoots; - private final DataBindingContext dataBindingContext; AndroidResources(AndroidResources other) { - this(other.resources, other.resourceRoots, other.dataBindingContext); + this(other.resources, other.resourceRoots); } @VisibleForTesting public AndroidResources( - ImmutableList resources, - ImmutableList resourceRoots, - DataBindingContext dataBindingContext) { + ImmutableList resources, ImmutableList resourceRoots) { this.resources = resources; this.resourceRoots = resourceRoots; - this.dataBindingContext = dataBindingContext; } private static ImmutableList getResources(Iterable targets) { @@ -411,19 +398,18 @@ public class AndroidResources { return Optional.of( new AndroidResources( filtered.get(), - getResourceRoots(errorConsumer, filtered.get(), DEFAULT_RESOURCES_ATTR), - dataBindingContext)); + getResourceRoots(errorConsumer, filtered.get(), DEFAULT_RESOURCES_ATTR))); } /** Parses these resources. */ public ParsedAndroidResources parse( AndroidDataContext dataContext, StampedAndroidManifest manifest, - boolean enableDataBinding, - AndroidAaptVersion aaptVersion) + AndroidAaptVersion aaptVersion, + DataBindingContext dataBindingContext) throws InterruptedException { return ParsedAndroidResources.parseFrom( - dataContext, this, manifest, enableDataBinding, aaptVersion); + dataContext, this, manifest, aaptVersion, dataBindingContext); } /** @@ -434,13 +420,14 @@ public class AndroidResources { RuleContext ruleContext, AndroidDataContext dataContext, StampedAndroidManifest manifest, + DataBindingContext dataBindingContext, boolean neverlink) throws RuleErrorException, InterruptedException { return process( dataContext, manifest, ResourceDependencies.fromRuleDeps(ruleContext, neverlink), - DataBinding.isEnabled(ruleContext), + dataBindingContext, AndroidAaptVersion.chooseTargetAaptVersion(ruleContext)); } @@ -448,11 +435,11 @@ public class AndroidResources { AndroidDataContext dataContext, StampedAndroidManifest manifest, ResourceDependencies resourceDeps, - boolean enableDataBinding, + DataBindingContext dataBindingContext, AndroidAaptVersion aaptVersion) throws InterruptedException { - return parse(dataContext, manifest, enableDataBinding, aaptVersion) - .merge(dataContext, resourceDeps, enableDataBinding, aaptVersion) + return parse(dataContext, manifest, aaptVersion, dataBindingContext) + .merge(dataContext, resourceDeps, aaptVersion) .validate(dataContext, aaptVersion); } @@ -470,4 +457,12 @@ public class AndroidResources { public int hashCode() { return Objects.hash(resources, resourceRoots); } + + @Override + public String toString() { + return MoreObjects.toStringHelper(this) + .add("resources", resources) + .add("resourceRoots", resourceRoots) + .toString(); + } } diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourcesProcessorBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourcesProcessorBuilder.java index e289c7e319..e1567f0209 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourcesProcessorBuilder.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourcesProcessorBuilder.java @@ -18,6 +18,7 @@ import com.google.common.collect.Iterables; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.rules.android.AndroidConfiguration.AndroidAaptVersion; import com.google.devtools.build.lib.rules.android.AndroidDataConverter.JoinerType; +import com.google.devtools.build.lib.rules.android.DataBinding.DataBindingContext; import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.VisibleForSerialization; import java.util.Collections; @@ -230,9 +231,12 @@ public class AndroidResourcesProcessorBuilder { * information. */ public ResourceApk buildWithoutLocalResources( - AndroidDataContext dataContext, StampedAndroidManifest manifest) { + AndroidDataContext dataContext, + StampedAndroidManifest manifest, + DataBindingContext androidDataContext) { - build(dataContext, AndroidResources.empty(), AndroidAssets.empty(), manifest); + build( + dataContext, AndroidResources.empty(), AndroidAssets.empty(), manifest, androidDataContext); return ResourceApk.fromTransitiveResources( resourceDependencies, @@ -241,12 +245,16 @@ public class AndroidResourcesProcessorBuilder { rTxtOut); } - public ResourceContainer build(AndroidDataContext dataContext, ResourceContainer primary) { + public ResourceContainer build( + AndroidDataContext dataContext, + ResourceContainer primary, + DataBindingContext dataBindingContext) { build( dataContext, primary.getAndroidResources(), primary.getAndroidAssets(), - ProcessedAndroidManifest.from(primary)); + ProcessedAndroidManifest.from(primary), + dataBindingContext); ResourceContainer.Builder builder = primary.toBuilder().setJavaSourceJar(sourceJarOut).setRTxt(rTxtOut).setSymbols(symbols); @@ -272,7 +280,8 @@ public class AndroidResourcesProcessorBuilder { AndroidDataContext dataContext, AndroidResources primaryResources, AndroidAssets primaryAssets, - StampedAndroidManifest primaryManifest) { + StampedAndroidManifest primaryManifest, + DataBindingContext dataBindingContext) { if (aaptVersion == AndroidAaptVersion.AAPT2) { createAapt2ApkAction(dataContext, primaryResources, primaryAssets, primaryManifest); @@ -294,7 +303,8 @@ public class AndroidResourcesProcessorBuilder { symbols, /* compiledSymbols = */ null, dataContext.getLabel(), - processedManifest); + processedManifest, + dataBindingContext); // Wrap the parsed and merged assets ParsedAndroidAssets parsedAssets = diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkData.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkData.java index 58fb920d4d..565fd50a89 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkData.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkData.java @@ -88,6 +88,7 @@ public abstract class AndroidSkylarkData } return ResourceApk.processFromTransitiveLibraryData( ctx, + DataBinding.asDisabledDataBindingContext(), ResourceDependencies.fromProviders(deps, /* neverlink = */ neverlink), AssetDependencies.empty(), StampedAndroidManifest.createEmpty( @@ -169,19 +170,12 @@ public abstract class AndroidSkylarkData AndroidAaptVersion aaptVersion = ctx.getAndroidConfig().getAndroidAaptVersion(); ValidatedAndroidResources validated = - AndroidResources.from( - errorReporter, - getFileProviders(resources), - "resources", - enableDataBinding - ? DataBinding.asEnabledDataBindingContextFrom( - ctx.getActionConstructionContext()) - : DataBinding.asDisabledDataBindingContext()) + AndroidResources.from(errorReporter, getFileProviders(resources), "resources") .process( ctx, manifest.asStampedManifest(), ResourceDependencies.fromProviders(deps, neverlink), - enableDataBinding, + DataBinding.contextFrom(enableDataBinding, ctx.getActionConstructionContext()), aaptVersion); JavaInfo javaInfo = getJavaInfoForRClassJar(validated.getClassJar()); @@ -383,7 +377,7 @@ public abstract class AndroidSkylarkData AndroidManifest.forAarImport(androidManifestArtifact), ResourceDependencies.fromProviders( getProviders(deps, AndroidResourcesInfo.PROVIDER), /* neverlink = */ false), - /* enableDataBinding = */ false, + DataBinding.asDisabledDataBindingContext(), aaptVersion); MergedAndroidAssets mergedAssets = @@ -428,12 +422,9 @@ public abstract class AndroidSkylarkData AndroidLocalTestBase.buildResourceApk( ctx, getAndroidSemantics(), + DataBinding.asDisabledDataBindingContext(), rawManifest, - AndroidResources.from( - errorReporter, - getFileProviders(resources), - "resource_files", - DataBinding.asDisabledDataBindingContext()), + AndroidResources.from(errorReporter, getFileProviders(resources), "resource_files"), AndroidAssets.from( errorReporter, listFromNoneable(assets, ConfiguredTarget.class), @@ -575,13 +566,7 @@ public abstract class AndroidSkylarkData manifestValues, settings.aaptVersion, AndroidResources.from( - errorReporter, - getFileProviders(resources), - "resource_files", - dataBindingEnabled - ? DataBinding.asEnabledDataBindingContextFrom( - ctx.getActionConstructionContext()) - : DataBinding.asDisabledDataBindingContext()), + errorReporter, getFileProviders(resources), "resource_files"), AndroidAssets.from( errorReporter, listFromNoneable(assets, ConfiguredTarget.class), @@ -596,7 +581,8 @@ public abstract class AndroidSkylarkData crunchPng, dataBindingEnabled, /* featureOf = */ null, - /* featureAfter = */ null) + /* featureAfter = */ null, + DataBinding.contextFrom(dataBindingEnabled, ctx.getActionConstructionContext())) .generateRClass(ctx, settings.aaptVersion); return AndroidBinaryDataInfo.of( diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/ApplicationManifest.java b/src/main/java/com/google/devtools/build/lib/rules/android/ApplicationManifest.java index d93b8a2b7f..c9e3daea8c 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/ApplicationManifest.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/ApplicationManifest.java @@ -418,7 +418,8 @@ public final class ApplicationManifest { .setSymbols(resourceContainer.getSymbols()) .setSourceJarOut(resourceContainer.getJavaSourceJar()); } - ResourceContainer processed = builder.build(dataContext, resourceContainer); + ResourceContainer processed = + builder.build(dataContext, resourceContainer, DataBinding.contextFrom(ruleContext)); ResourceContainer finalContainer = new RClassGeneratorActionBuilder() @@ -547,7 +548,7 @@ public final class ApplicationManifest { .getFragment(AndroidConfiguration.class) .throwOnResourceConflict()) .setPackageUnderTest(null) - .build(dataContext, resourceContainer); + .build(dataContext, resourceContainer, DataBinding.contextFrom(ruleContext)); // Intentionally skip building an R class JAR - incremental binaries handle this separately. @@ -630,7 +631,7 @@ public final class ApplicationManifest { .setRTxtOut(resourceContainer.getRTxt()) .setSymbols(resourceContainer.getSymbols()) .setSourceJarOut(resourceContainer.getJavaSourceJar()) - .build(dataContext, resourceContainer); + .build(dataContext, resourceContainer, DataBinding.contextFrom(ruleContext)); ResourceContainer finalContainer = new RClassGeneratorActionBuilder() diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/DataBinding.java b/src/main/java/com/google/devtools/build/lib/rules/android/DataBinding.java index 86cd131a49..9f295ba832 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/DataBinding.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/DataBinding.java @@ -32,6 +32,7 @@ import com.google.devtools.build.lib.vfs.PathFragment; import java.io.IOException; import java.util.ArrayList; import java.util.List; +import java.util.Objects; import java.util.function.Consumer; /** @@ -62,6 +63,8 @@ public final class DataBinding { public static final String DATABINDING_ANNOTATION_PROCESSOR_ATTR = "$databinding_annotation_processor"; + public static final String ENABLE_DATA_BINDING_ATTR = "enable_data_binding"; + /** Contains Android Databinding configuration and resource generation information. */ public interface DataBindingContext { void supplyLayoutInfo(Consumer consumer); @@ -79,6 +82,23 @@ public final class DataBinding { public void supplyLayoutInfo(Consumer consumer) { consumer.accept(getLayoutInfoFile(actionConstructionContext)); } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + EnabledDataBindingContext that = (EnabledDataBindingContext) o; + return Objects.equals(actionConstructionContext, that.actionConstructionContext); + } + + @Override + public int hashCode() { + return actionConstructionContext.hashCode(); + } } private static final class DisabledDataBindingContext implements DataBindingContext { @@ -97,6 +117,14 @@ public final class DataBinding { return asDisabledDataBindingContext(); } + /** Supplies a databinding context from a rulecontext. */ + public static DataBindingContext contextFrom(boolean enabled, ActionConstructionContext context) { + if (enabled) { + return asEnabledDataBindingContextFrom(context); + } + return asDisabledDataBindingContext(); + } + /** Supplies an enabled DataBindingContext from the action context. */ public static DataBindingContext asEnabledDataBindingContextFrom( ActionConstructionContext actionContext) { @@ -129,8 +157,8 @@ public final class DataBinding { * binding expressions appear in their layout resources. */ public static boolean isEnabled(RuleContext ruleContext) { - return ruleContext.attributes().has("enable_data_binding", Type.BOOLEAN) - && ruleContext.attributes().get("enable_data_binding", Type.BOOLEAN); + return ruleContext.attributes().has(ENABLE_DATA_BINDING_ATTR, Type.BOOLEAN) + && ruleContext.attributes().get(ENABLE_DATA_BINDING_ATTR, Type.BOOLEAN); } /** Returns this rule's data binding base output dir (as an execroot-relative path). */ diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/MergedAndroidResources.java b/src/main/java/com/google/devtools/build/lib/rules/android/MergedAndroidResources.java index ce3bc207e5..f139a2b457 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/MergedAndroidResources.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/MergedAndroidResources.java @@ -40,7 +40,6 @@ public class MergedAndroidResources extends ParsedAndroidResources { AndroidDataContext dataContext, ParsedAndroidResources parsed, ResourceDependencies resourceDeps, - boolean enableDataBinding, AndroidAaptVersion aaptVersion) throws InterruptedException { @@ -60,10 +59,7 @@ public class MergedAndroidResources extends ParsedAndroidResources { .setThrowOnResourceConflict(androidConfiguration.throwOnResourceConflict()) .setUseCompiledMerge(useCompiledMerge); - if (enableDataBinding) { - builder.setDataBindingInfoZip( - DataBinding.getLayoutInfoFile(dataContext.getActionConstructionContext())); - } + parsed.asDataBindingContext().supplyLayoutInfo(builder::setDataBindingInfoZip); return builder .setManifestOut( diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/ParsedAndroidResources.java b/src/main/java/com/google/devtools/build/lib/rules/android/ParsedAndroidResources.java index e1b2d4c6c6..240dce0b11 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/ParsedAndroidResources.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/ParsedAndroidResources.java @@ -13,11 +13,15 @@ // limitations under the License. package com.google.devtools.build.lib.rules.android; +import com.android.annotations.VisibleForTesting; +import com.google.common.base.MoreObjects; import com.google.devtools.build.lib.actions.Artifact; +import com.google.devtools.build.lib.analysis.actions.ActionConstructionContext; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException; import com.google.devtools.build.lib.packages.RuleErrorConsumer; import com.google.devtools.build.lib.rules.android.AndroidConfiguration.AndroidAaptVersion; +import com.google.devtools.build.lib.rules.android.DataBinding.DataBindingContext; import java.util.Objects; import java.util.Optional; import javax.annotation.Nullable; @@ -29,25 +33,28 @@ public class ParsedAndroidResources extends AndroidResources @Nullable private final Artifact compiledSymbols; private final Label label; private final StampedAndroidManifest manifest; + private final DataBindingContext dataBindingContext; public static ParsedAndroidResources parseFrom( AndroidDataContext dataContext, AndroidResources resources, StampedAndroidManifest manifest, - boolean enableDataBinding, - AndroidAaptVersion aaptVersion) + AndroidAaptVersion aaptVersion, + DataBindingContext dataBindingContext) throws InterruptedException { boolean isAapt2 = aaptVersion == AndroidAaptVersion.AAPT2; AndroidResourceParsingActionBuilder builder = new AndroidResourceParsingActionBuilder(); - if (enableDataBinding && isAapt2) { + if (isAapt2) { // TODO(corysmith): Centralize the data binding processing and zipping into a single // action. Data binding processing needs to be triggered here as well as the merger to // avoid aapt2 from throwing an error during compilation. - builder.setDataBindingInfoZip( - DataBinding.getSuffixedInfoFile(dataContext.getActionConstructionContext(), "_unused")); + dataBindingContext.supplyLayoutInfo( + layoutInfo -> + builder.setDataBindingInfoZip( + getDummyDataBindingArtifact(dataContext.getActionConstructionContext()))); } return builder @@ -56,7 +63,12 @@ public class ParsedAndroidResources extends AndroidResources isAapt2 ? dataContext.createOutputArtifact(AndroidRuleClasses.ANDROID_COMPILED_SYMBOLS) : null) - .build(dataContext, resources, manifest); + .build(dataContext, resources, manifest, dataBindingContext); + } + + @VisibleForTesting + static Artifact getDummyDataBindingArtifact(ActionConstructionContext dataContext) { + return dataContext.getUniqueDirectoryArtifact("dummydatabinding", "unused.zip"); } public static ParsedAndroidResources of( @@ -64,12 +76,20 @@ public class ParsedAndroidResources extends AndroidResources Artifact symbols, @Nullable Artifact compiledSymbols, Label label, - StampedAndroidManifest manifest) { - return new ParsedAndroidResources(resources, symbols, compiledSymbols, label, manifest); + StampedAndroidManifest manifest, + DataBindingContext dataBindingContext) { + return new ParsedAndroidResources( + resources, symbols, compiledSymbols, label, manifest, dataBindingContext); } ParsedAndroidResources(ParsedAndroidResources other, StampedAndroidManifest manifest) { - this(other, other.symbols, other.compiledSymbols, other.label, manifest); + this( + other, + other.symbols, + other.compiledSymbols, + other.label, + manifest, + other.dataBindingContext); } protected ParsedAndroidResources( @@ -77,12 +97,14 @@ public class ParsedAndroidResources extends AndroidResources Artifact symbols, @Nullable Artifact compiledSymbols, Label label, - StampedAndroidManifest manifest) { + StampedAndroidManifest manifest, + DataBindingContext dataBindingContext) { super(resources); this.symbols = symbols; this.compiledSymbols = compiledSymbols; this.label = label; this.manifest = manifest; + this.dataBindingContext = dataBindingContext; } @Override @@ -128,11 +150,9 @@ public class ParsedAndroidResources extends AndroidResources MergedAndroidResources merge( AndroidDataContext dataContext, ResourceDependencies resourceDeps, - boolean enableDataBinding, AndroidAaptVersion aaptVersion) throws InterruptedException { - return MergedAndroidResources.mergeFrom( - dataContext, this, resourceDeps, enableDataBinding, aaptVersion); + return MergedAndroidResources.mergeFrom(dataContext, this, resourceDeps, aaptVersion); } @Override @@ -142,7 +162,8 @@ public class ParsedAndroidResources extends AndroidResources return super.maybeFilter(errorConsumer, resourceFilter, isDependency) .map( resources -> - ParsedAndroidResources.of(resources, symbols, compiledSymbols, label, manifest)); + ParsedAndroidResources.of( + resources, symbols, compiledSymbols, label, manifest, dataBindingContext)); } @Override @@ -162,4 +183,18 @@ public class ParsedAndroidResources extends AndroidResources public int hashCode() { return Objects.hash(super.hashCode(), symbols, compiledSymbols, label, manifest); } + + @Override + public String toString() { + return MoreObjects.toStringHelper(this) + .add("symbols", symbols) + .add("compiledSymbols", compiledSymbols) + .add("label", label) + .add("manifest", manifest) + .toString(); + } + + public DataBindingContext asDataBindingContext() { + return dataBindingContext; + } } diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/ProcessedAndroidData.java b/src/main/java/com/google/devtools/build/lib/rules/android/ProcessedAndroidData.java index 484d29649d..f69128afd1 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/ProcessedAndroidData.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/ProcessedAndroidData.java @@ -19,6 +19,7 @@ import com.google.devtools.build.lib.analysis.RuleContext; import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException; import com.google.devtools.build.lib.packages.RuleErrorConsumer; import com.google.devtools.build.lib.rules.android.AndroidConfiguration.AndroidAaptVersion; +import com.google.devtools.build.lib.rules.android.DataBinding.DataBindingContext; import com.google.devtools.build.lib.rules.java.ProguardHelper; import com.google.devtools.build.lib.syntax.Type; import java.util.List; @@ -68,7 +69,8 @@ public class ProcessedAndroidData { boolean crunchPng, boolean dataBindingEnabled, @Nullable Artifact featureOf, - @Nullable Artifact featureAfter) + @Nullable Artifact featureAfter, + DataBindingContext dataBindingContext) throws RuleErrorException, InterruptedException { if (conditionalKeepRules && aaptVersion != AndroidAaptVersion.AAPT2) { throw errorConsumer.throwWithRuleError( @@ -96,6 +98,7 @@ public class ProcessedAndroidData { .setFeatureAfter(featureAfter); return buildActionForBinary( dataContext, + dataBindingContext, errorConsumer, builder, manifest, @@ -125,6 +128,7 @@ public class ProcessedAndroidData { return buildActionForBinary( dataContext, + DataBinding.contextFrom(ruleContext), ruleContext, builder, manifest, @@ -139,6 +143,7 @@ public class ProcessedAndroidData { private static ProcessedAndroidData buildActionForBinary( AndroidDataContext dataContext, + DataBindingContext dataBindingContext, RuleErrorConsumer errorConsumer, AndroidResourcesProcessorBuilder builder, StampedAndroidManifest manifest, @@ -164,12 +169,13 @@ public class ProcessedAndroidData { .setCrunchPng(crunchPng) .withResourceDependencies(resourceDeps) .withAssetDependencies(assetDeps) - .build(dataContext, resources, assets, manifest); + .build(dataContext, resources, assets, manifest, dataBindingContext); } /** Processes Android data (assets, resources, and manifest) for android_local_test targets. */ public static ProcessedAndroidData processLocalTestDataFrom( AndroidDataContext dataContext, + DataBindingContext dataBindingContext, StampedAndroidManifest manifest, Map manifestValues, AndroidAaptVersion aaptVersion, @@ -191,12 +197,13 @@ public class ProcessedAndroidData { .setCrunchPng(false) .withResourceDependencies(resourceDeps) .withAssetDependencies(assetDeps) - .build(dataContext, resources, assets, manifest); + .build(dataContext, resources, assets, manifest, dataBindingContext); } /** Processes Android data (assets, resources, and manifest) for android_test targets. */ public static ProcessedAndroidData processTestDataFrom( AndroidDataContext dataContext, + DataBindingContext dataBindingContext, StampedAndroidManifest manifest, String packageUnderTest, boolean hasLocalResourceFiles, @@ -220,7 +227,7 @@ public class ProcessedAndroidData { .withResourceDependencies(resourceDeps) .withAssetDependencies(assetDeps); - return builder.build(dataContext, resources, assets, manifest); + return builder.build(dataContext, resources, assets, manifest, dataBindingContext); } /** diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/ResourceApk.java b/src/main/java/com/google/devtools/build/lib/rules/android/ResourceApk.java index bda6e3108e..2ab400cf93 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/ResourceApk.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/ResourceApk.java @@ -18,6 +18,7 @@ import com.google.devtools.build.lib.analysis.OutputGroupInfo; import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; +import com.google.devtools.build.lib.rules.android.DataBinding.DataBindingContext; import java.util.Optional; import javax.annotation.Nullable; @@ -286,6 +287,7 @@ public final class ResourceApk { */ public static ResourceApk processFromTransitiveLibraryData( AndroidDataContext dataContext, + DataBindingContext dataBindingContext, ResourceDependencies resourceDeps, AssetDependencies assetDeps, StampedAndroidManifest manifest) @@ -303,6 +305,6 @@ public final class ResourceApk { .withAssetDependencies(assetDeps) .setDebug(dataContext.useDebug()) .setThrowOnResourceConflict(dataContext.getAndroidConfig().throwOnResourceConflict()) - .buildWithoutLocalResources(dataContext, manifest); + .buildWithoutLocalResources(dataContext, manifest, dataBindingContext); } } diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/ValidatedAndroidResources.java b/src/main/java/com/google/devtools/build/lib/rules/android/ValidatedAndroidResources.java index de1d6f49b8..c70239b8b3 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/ValidatedAndroidResources.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/ValidatedAndroidResources.java @@ -195,11 +195,12 @@ public class ValidatedAndroidResources extends MergedAndroidResources new MergedAndroidResources( new ParsedAndroidResources( // Null out databinding to avoid accidentally propagating ActionCreationContext - new AndroidResources(getResources(), getResourceRoots(), null), + new AndroidResources(getResources(), getResourceRoots()), getSymbols(), getCompiledSymbols(), getLabel(), - getStampedManifest()), + getStampedManifest(), + null), getMergedResources(), getClassJar(), getDataBindingInfoZip(), -- cgit v1.2.3