aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google
diff options
context:
space:
mode:
authorGravatar Alex Humesky <ahumesky@google.com>2016-08-26 22:38:27 +0000
committerGravatar John Cater <jcater@google.com>2016-08-27 00:36:30 +0000
commitbfb3de3809a550da08c39f95d64d2a6f707f8add (patch)
treea9be3c179f7470a58712a18fac8475243dbcc8ed /src/main/java/com/google
parent629b4889e456b43692890e0e0e23d59237475c16 (diff)
Exclude resources jars from android_library rules from the apk_manifest
because they contain useless stub ids. -- MOS_MIGRATED_REVID=131449999
Diffstat (limited to 'src/main/java/com/google')
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java24
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibrary.java20
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibraryResourceClassJarProvider.java44
4 files changed, 89 insertions, 3 deletions
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 ae6b9ad159..d4405521ed 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
@@ -14,6 +14,9 @@
package com.google.devtools.build.lib.rules.android;
import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.base.Predicates.in;
+import static com.google.common.base.Predicates.not;
+import static com.google.common.collect.Iterables.filter;
import static com.google.devtools.build.lib.analysis.OutputGroupProvider.INTERNAL_SUFFIX;
import com.google.common.base.Function;
@@ -68,12 +71,14 @@ import com.google.devtools.build.lib.rules.java.ProguardHelper.ProguardOutput;
import com.google.devtools.build.lib.syntax.Type;
import com.google.devtools.build.lib.util.Preconditions;
import com.google.devtools.build.lib.vfs.PathFragment;
+
import java.util.ArrayList;
import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
+
import javax.annotation.Nullable;
/**
@@ -844,7 +849,7 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory {
RuleContext ruleContext,
Artifact apkManfiest,
boolean textProto,
- AndroidCommon androidCommon,
+ final AndroidCommon androidCommon,
JavaTargetAttributes resourceClasses,
ResourceApk resourceApk,
NativeLibs nativeLibs,
@@ -853,6 +858,21 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory {
Iterable<Artifact> jars = IterablesChain.concat(
resourceClasses.getArchiveInputs(true), androidCommon.getRuntimeJars());
+ // The resources jars from android_library rules contain stub ids, so filter those out of the
+ // transitive jars.
+ Iterable<AndroidLibraryResourceClassJarProvider> libraryResourceJarProviders =
+ AndroidCommon.getTransitivePrerequisites(
+ ruleContext, Mode.TARGET, AndroidLibraryResourceClassJarProvider.class);
+
+ NestedSetBuilder<Artifact> libraryResourceJarsBuilder = NestedSetBuilder.naiveLinkOrder();
+ for (AndroidLibraryResourceClassJarProvider provider : libraryResourceJarProviders) {
+ libraryResourceJarsBuilder.addTransitive(provider.getResourceClassJars());
+ }
+ NestedSet<Artifact> libraryResourceJars = libraryResourceJarsBuilder.build();
+
+ Iterable<Artifact> filteredJars = ImmutableList.copyOf(
+ filter(jars, not(in(libraryResourceJars.toSet()))));
+
AndroidSdkProvider sdk = AndroidSdkProvider.fromRuleContext(ruleContext);
ApkManifestAction manifestAction = new ApkManifestAction(
@@ -860,7 +880,7 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory {
apkManfiest,
textProto,
sdk,
- jars,
+ filteredJars,
resourceApk,
nativeLibs,
debugKeystore);
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java
index 1dd9c6b235..78f2d389a8 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java
@@ -823,6 +823,10 @@ public class AndroidCommon {
return javaCommon.getJavaCompilationArtifacts().getRuntimeJars();
}
+ public Artifact getResourceClassJar() {
+ return resourceClassJar;
+ }
+
/**
* Returns Jars produced by this rule that may go into the runtime classpath. By contrast
* {@link #getRuntimeJars()} returns the complete runtime classpath needed by this rule, including
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 8867d77d8f..0b7f82df38 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
@@ -185,6 +185,11 @@ public abstract class AndroidLibrary implements RuleConfiguredTargetFactory {
androidSemantics.addTransitiveInfoProviders(
builder, ruleContext, javaCommon, androidCommon, null);
+ NestedSetBuilder<Artifact> transitiveResourcesJars = collectTransitiveResourceJars(ruleContext);
+ if (androidCommon.getResourceClassJar() != null) {
+ transitiveResourcesJars.add(androidCommon.getResourceClassJar());
+ }
+
builder
.add(AndroidNativeLibraryProvider.class,
new AndroidNativeLibraryProvider(transitiveNativeLibraries))
@@ -197,7 +202,9 @@ public abstract class AndroidLibrary implements RuleConfiguredTargetFactory {
new AndroidCcLinkParamsProvider(androidCommon.getCcLinkParamsStore()))
.add(JavaPluginInfoProvider.class, JavaCommon.getTransitivePlugins(ruleContext))
.add(ProguardSpecProvider.class, new ProguardSpecProvider(transitiveProguardConfigs))
- .addOutputGroup(OutputGroupProvider.HIDDEN_TOP_LEVEL, transitiveProguardConfigs);
+ .addOutputGroup(OutputGroupProvider.HIDDEN_TOP_LEVEL, transitiveProguardConfigs)
+ .add(AndroidLibraryResourceClassJarProvider.class,
+ new AndroidLibraryResourceClassJarProvider(transitiveResourcesJars.build()));
if (!JavaCommon.isNeverLink(ruleContext)) {
builder.add(AndroidLibraryAarProvider.class,
@@ -231,4 +238,15 @@ public abstract class AndroidLibrary implements RuleConfiguredTargetFactory {
}
return builder;
}
+
+ private NestedSetBuilder<Artifact> collectTransitiveResourceJars(RuleContext ruleContext) {
+ NestedSetBuilder<Artifact> builder = NestedSetBuilder.naiveLinkOrder();
+ Iterable<AndroidLibraryResourceClassJarProvider> providers =
+ AndroidCommon.getTransitivePrerequisites(
+ ruleContext, Mode.TARGET, AndroidLibraryResourceClassJarProvider.class);
+ for (AndroidLibraryResourceClassJarProvider resourceJarProvider : providers) {
+ builder.addTransitive(resourceJarProvider.getResourceClassJars());
+ }
+ return builder;
+ }
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibraryResourceClassJarProvider.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibraryResourceClassJarProvider.java
new file mode 100644
index 0000000000..69d2a7e7b1
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibraryResourceClassJarProvider.java
@@ -0,0 +1,44 @@
+// Copyright 2016 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 static com.google.common.base.Preconditions.checkNotNull;
+
+import com.google.devtools.build.lib.actions.Artifact;
+import com.google.devtools.build.lib.analysis.TransitiveInfoProvider;
+import com.google.devtools.build.lib.collect.nestedset.NestedSet;
+
+import javax.annotation.Nonnull;
+
+/**
+ * A provider which contains the resource class jars from android_library rules. See
+ * {@link AndroidRuleClasses#ANDROID_RESOURCES_CLASS_JAR}.
+ */
+public class AndroidLibraryResourceClassJarProvider implements TransitiveInfoProvider {
+
+ @Nonnull
+ private final NestedSet<Artifact> resourceClassJars;
+
+ public AndroidLibraryResourceClassJarProvider(NestedSet<Artifact> resourceClassJars) {
+ checkNotNull(resourceClassJars);
+ this.resourceClassJars = resourceClassJars;
+ }
+
+ @Nonnull
+ public NestedSet<Artifact> getResourceClassJars() {
+ return resourceClassJars;
+ }
+}
+