diff options
author | 2018-04-13 12:21:12 -0700 | |
---|---|---|
committer | 2018-04-13 12:24:31 -0700 | |
commit | 445fb097b82aae3b2e5736aea540ecb907d5f052 (patch) | |
tree | a69f7a22a042bd9cec3b01d5a567fcd9f376d59c /src/main/java/com/google/devtools/build/lib/rules/android/MergedAndroidResources.java | |
parent | 10d9155d6b1fad5c05c5872fb917cc77fbc61810 (diff) |
Resource-only merge action
Create wrapper for merged resources, and methods to make it from parsed
resources.
Currently just reuse the ResourceDependencies class to provide resource
dependencies; we could create an interface and another class, but this class is
good enough (and will be resource-specific once we finish decoupling assets,
resources, and manifests).
Note that, like the previous parse action, merging sometimes has a dependency
on the stamped manifest, so resources and manifests will only be mostly
decoupled.
Also, make the merge action not require an output manifest for cases like this.
RELNOTES: none
PiperOrigin-RevId: 192805891
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/rules/android/MergedAndroidResources.java')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/rules/android/MergedAndroidResources.java | 144 |
1 files changed, 144 insertions, 0 deletions
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 new file mode 100644 index 0000000000..e6cf1791d7 --- /dev/null +++ b/src/main/java/com/google/devtools/build/lib/rules/android/MergedAndroidResources.java @@ -0,0 +1,144 @@ +// Copyright 2018 The Bazel Authors. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +package com.google.devtools.build.lib.rules.android; + +import com.google.common.base.Preconditions; +import com.google.devtools.build.lib.actions.Artifact; +import com.google.devtools.build.lib.analysis.RuleContext; +import com.google.devtools.build.lib.rules.android.AndroidConfiguration.AndroidAaptVersion; +import java.util.Objects; +import javax.annotation.Nullable; + +/** Wraps merged Android resources. */ +public class MergedAndroidResources extends ParsedAndroidResources { + private final Artifact mergedResources; + private final Artifact classJar; + @Nullable private final Artifact dataBindingInfoZip; + private final ResourceDependencies resourceDependencies; + /** + * The processed manifest. + * + * <p>TODO(b/30817309): Just use the manifest inherited from {@link ParsedAndroidResources} once + * the legacy manifest merger is removed. + */ + private final ProcessedAndroidManifest manifest; + + public static MergedAndroidResources mergeFrom( + RuleContext ruleContext, ParsedAndroidResources parsed, boolean neverlink) + throws InterruptedException { + + AndroidConfiguration androidConfiguration = AndroidCommon.getAndroidConfig(ruleContext); + + boolean useCompiledMerge = + androidConfiguration.getAndroidAaptVersion().equals(AndroidAaptVersion.AAPT2) + && androidConfiguration.skipParsingAction(); + + Preconditions.checkState( + !useCompiledMerge || parsed.getCompiledSymbols() != null, + "Should not use compiled merge if no compiled symbols are available!"); + + AndroidResourceMergingActionBuilder builder = + new AndroidResourceMergingActionBuilder(ruleContext) + .setJavaPackage(parsed.getJavaPackage()) + .withDependencies(ResourceDependencies.fromRuleDeps(ruleContext, neverlink)) + .setThrowOnResourceConflict(androidConfiguration.throwOnResourceConflict()) + .setUseCompiledMerge(useCompiledMerge); + + if (DataBinding.isEnabled(ruleContext)) { + builder.setDataBindingInfoZip(DataBinding.getLayoutInfoFile(ruleContext)); + } + + return builder + .setManifestOut( + ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_PROCESSED_MANIFEST)) + .setMergedResourcesOut( + ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_RESOURCES_ZIP)) + .setClassJarOut( + ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_RESOURCES_CLASS_JAR)) + .build(ruleContext, parsed); + } + + public static MergedAndroidResources of( + ParsedAndroidResources parsed, + Artifact mergedResources, + Artifact classJar, + @Nullable Artifact dataBindingInfoZip, + ResourceDependencies resourceDependencies, + ProcessedAndroidManifest manifest) { + return new MergedAndroidResources( + parsed, mergedResources, classJar, dataBindingInfoZip, resourceDependencies, manifest); + } + + MergedAndroidResources(MergedAndroidResources other) { + this( + other, + other.mergedResources, + other.classJar, + other.dataBindingInfoZip, + other.resourceDependencies, + other.manifest); + } + + private MergedAndroidResources( + ParsedAndroidResources other, + Artifact mergedResources, + Artifact classJar, + @Nullable Artifact dataBindingInfoZip, + ResourceDependencies resourceDependencies, + ProcessedAndroidManifest manifest) { + super(other, manifest); + this.mergedResources = mergedResources; + this.classJar = classJar; + this.dataBindingInfoZip = dataBindingInfoZip; + this.resourceDependencies = resourceDependencies; + this.manifest = manifest; + } + + public Artifact getMergedResources() { + return mergedResources; + } + + public Artifact getClassJar() { + return classJar; + } + + @Nullable + public Artifact getDataBindingInfoZip() { + return dataBindingInfoZip; + } + + @Override + public ProcessedAndroidManifest getStampedManifest() { + return manifest; + } + + @Override + public boolean equals(Object object) { + if (!super.equals(object)) { + return false; + } + + MergedAndroidResources other = (MergedAndroidResources) object; + return mergedResources.equals(other.mergedResources) + && classJar.equals(other.classJar) + && Objects.equals(dataBindingInfoZip, other.dataBindingInfoZip) + && resourceDependencies.equals(other.resourceDependencies); + } + + @Override + public int hashCode() { + return Objects.hash( + super.hashCode(), mergedResources, classJar, dataBindingInfoZip, resourceDependencies); + } +} |