diff options
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; + } +} + |