aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/rules/android/MergedAndroidResources.java
diff options
context:
space:
mode:
authorGravatar asteinb <asteinb@google.com>2018-04-13 12:21:12 -0700
committerGravatar Copybara-Service <copybara-piper@google.com>2018-04-13 12:24:31 -0700
commit445fb097b82aae3b2e5736aea540ecb907d5f052 (patch)
treea69f7a22a042bd9cec3b01d5a567fcd9f376d59c /src/main/java/com/google/devtools/build/lib/rules/android/MergedAndroidResources.java
parent10d9155d6b1fad5c05c5872fb917cc77fbc61810 (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.java144
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);
+ }
+}