diff options
author | Googler <noreply@google.com> | 2017-09-19 17:23:31 +0200 |
---|---|---|
committer | László Csomor <laszlocsomor@google.com> | 2017-09-20 08:59:49 +0200 |
commit | c034dfd487bdba6b6b2f3f7851415a312ae10f53 (patch) | |
tree | 21f86c663ac79bd7c0e634690190bf99a6ed2ee4 /src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java | |
parent | 088f6113007d1a341893d915a87b93a4aed9898e (diff) |
Include library R classes in runtime classpath for library but not binary
In general, R classes for Android libraries are used for compilation of those
libraries and then thrown away. They are replaced by the R classes from the
binary. Removing the unused android_library R classes will make binaries
smaller.
RELNOTES: none
PiperOrigin-RevId: 169244068
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java | 36 |
1 files changed, 24 insertions, 12 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 0bb79d7e22..1385b16a7b 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 @@ -311,6 +311,16 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { boolean shrinkResources = shouldShrinkResources(ruleContext); + NestedSet<Artifact> excludedRuntimeArtifacts = null; + if (!androidConfig.includeLibraryResourceJars()) { + // Remove the library resource JARs from the binary's runtime classpath. + // Resource classes from android_library dependencies are replaced by the binary's resource + // class. We remove them only at the top level so that resources included by a library that is + // a dependency of a java_library are still included, since these resources are propagated via + // android-specific providers and won't show up when we collect the library resource JARs. + excludedRuntimeArtifacts = getLibraryResourceJars(ruleContext); + } + JavaTargetAttributes resourceClasses = androidCommon.init( javaSemantics, androidSemantics, @@ -318,7 +328,7 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { ruleContext.getConfiguration().isCodeCoverageEnabled(), true /* collectJavaCompilationArgs */, true, /* isBinary */ - androidConfig.includeLibraryResourceJars()); + excludedRuntimeArtifacts); ruleContext.assertNoErrors(); Function<Artifact, Artifact> derivedJarFunction = @@ -689,19 +699,9 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { // 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 = Streams.stream(jars) - .filter(not(in(libraryResourceJars.toSet()))) + .filter(not(in(getLibraryResourceJars(ruleContext).toSet()))) .collect(toImmutableList()); AndroidSdkProvider sdk = AndroidSdkProvider.fromRuleContext(ruleContext); @@ -720,6 +720,18 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { ruleContext.registerAction(manifestAction); } + private static NestedSet<Artifact> getLibraryResourceJars(RuleContext ruleContext) { + Iterable<AndroidLibraryResourceClassJarProvider> libraryResourceJarProviders = + AndroidCommon.getTransitivePrerequisites( + ruleContext, Mode.TARGET, AndroidLibraryResourceClassJarProvider.class); + + NestedSetBuilder<Artifact> libraryResourceJarsBuilder = NestedSetBuilder.naiveLinkOrder(); + for (AndroidLibraryResourceClassJarProvider provider : libraryResourceJarProviders) { + libraryResourceJarsBuilder.addTransitive(provider.getResourceClassJars()); + } + return libraryResourceJarsBuilder.build(); + } + /** Generates an uncompressed _deploy.jar of all the runtime jars. */ public static Artifact createDeployJar( RuleContext ruleContext, |