From 0cc293e46771144837a5ad4accf5d49e655060e9 Mon Sep 17 00:00:00 2001 From: Googler Date: Thu, 23 Feb 2017 22:01:48 +0000 Subject: Description redacted. -- PiperOrigin-RevId: 148388306 MOS_MIGRATED_REVID=148388306 --- .../build/lib/rules/android/AndroidBinary.java | 3 +- .../lib/rules/android/AndroidConfiguration.java | 12 ++++++ .../build/lib/rules/java/ProguardHelper.java | 43 ++++++++++++++++------ 3 files changed, 46 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 7e683c74de..ff22844118 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 @@ -1057,7 +1057,8 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { proguardOutputJar, javaSemantics, getProguardOptimizationPasses(ruleContext), - proguardOutputMap); + proguardOutputMap, + ruleContext.getFragment(AndroidConfiguration.class).useSingleJarForProguardLibraryJars()); return result; } diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidConfiguration.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidConfiguration.java index 785217716d..eaae47df85 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidConfiguration.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidConfiguration.java @@ -426,6 +426,12 @@ public class AndroidConfiguration extends BuildConfiguration.Fragment { ) public boolean useResourcePrefiltering; + @Option(name = "use_singlejar_for_proguard_libraryjars", + defaultValue = "false", + category = "undocumented", + help = "Use SingleJar to combine all ProGuard library jars.") + public boolean useSingleJarForProguardLibraryJars; + @Override public void addAllLabels(Multimap labelMap) { if (androidCrosstoolTop != null) { @@ -506,6 +512,7 @@ public class AndroidConfiguration extends BuildConfiguration.Fragment { private final boolean useSingleJarApkBuilder; private final boolean useSingleJarForMultidex; private final boolean useResourcePrefiltering; + private final boolean useSingleJarForProguardLibraryJars; AndroidConfiguration(Options options, Label androidSdk) { this.sdk = androidSdk; @@ -533,6 +540,7 @@ public class AndroidConfiguration extends BuildConfiguration.Fragment { this.apkSigningMethod = options.apkSigningMethod; this.useSingleJarApkBuilder = options.useSingleJarApkBuilder; this.useSingleJarForMultidex = options.useSingleJarForMultidex; + this.useSingleJarForProguardLibraryJars = options.useSingleJarForProguardLibraryJars; this.useRexToCompressDexFiles = options.useRexToCompressDexFiles; this.useResourcePrefiltering = options.useResourcePrefiltering; } @@ -634,6 +642,10 @@ public class AndroidConfiguration extends BuildConfiguration.Fragment { return useResourcePrefiltering; } + public boolean useSingleJarForProguardLibraryJars() { + return useSingleJarForProguardLibraryJars; + } + @Override public void addGlobalMakeVariables(ImmutableMap.Builder globalMakeEnvBuilder) { globalMakeEnvBuilder.put("ANDROID_CPU", cpu); diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/ProguardHelper.java b/src/main/java/com/google/devtools/build/lib/rules/java/ProguardHelper.java index 4447cadf63..49c13824ac 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/ProguardHelper.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/ProguardHelper.java @@ -19,6 +19,7 @@ import com.google.common.base.Joiner; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSortedSet; +import com.google.common.collect.Iterables; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.analysis.FilesToRunProvider; import com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode; @@ -141,15 +142,16 @@ public abstract class ProguardHelper { protected ProguardHelper() {} /** - * Creates an action to run Proguard to output the given {@code deployJar} artifact - * if --java_optimization_mode calls for it from an assumed input artifact - * {@link JavaSemantics#JAVA_BINARY_MERGED_JAR}. Returns the artifacts that Proguard will - * generate or {@code null} if Proguard isn't used. + * Creates an action to run Proguard to output the given {@code deployJar} artifact if + * --java_optimization_mode calls for it from an assumed input artifact {@link + * JavaSemantics#JAVA_BINARY_MERGED_JAR}. Returns the artifacts that Proguard will generate or + * {@code null} if Proguard isn't used. * - *

If this method returns artifacts then {@link DeployArchiveBuilder} needs to write the - * assumed input artifact (instead of the conventional deploy.jar, which now Proguard writes). - * Do not use this method for binary rules that themselves declare {@link #PROGUARD_SPECS} - * attributes, which as of includes 1/2016 {@code android_binary} and {@code android_test}. + *

If this method returns artifacts then {@link + * com.google.devtools.build.lib.rules.java.DeployArchiveBuilder} needs to write the assumed input + * artifact (instead of the conventional deploy.jar, which now Proguard writes). Do not use this + * method for binary rules that themselves declare {@link #PROGUARD_SPECS} attributes, which as of + * includes 1/2016 {@code android_binary} and {@code android_test}. */ @Nullable public ProguardOutput applyProguardIfRequested( @@ -157,7 +159,8 @@ public abstract class ProguardHelper { Artifact deployJar, ImmutableList bootclasspath, String mainClassName, - JavaSemantics semantics) throws InterruptedException { + JavaSemantics semantics) + throws InterruptedException { JavaOptimizationMode optMode = getJavaOptimizationMode(ruleContext); if (optMode == JavaOptimizationMode.NOOP || optMode == JavaOptimizationMode.LEGACY) { // For simplicity do nothing in LEGACY mode @@ -195,7 +198,8 @@ public abstract class ProguardHelper { deployJar, semantics, /* optimizationPases */ 3, - proguardOutputMap); + proguardOutputMap, + /* useSingleJarForProguardLibraryJars */ false); } private ImmutableList collectProguardSpecs( @@ -365,6 +369,8 @@ public abstract class ProguardHelper { * @param optimizationPasses if not null specifies to break proguard up into multiple passes with * the given number of optimization passes. * @param proguardOutputMap mapping generated by Proguard if requested. could be null. + * @param useSingleJarForProguardLibraryJars whether to combine all library jars into a single jar + * file before processing with Proguard */ public static ProguardOutput createProguardAction(RuleContext ruleContext, FilesToRunProvider proguard, @@ -377,7 +383,8 @@ public abstract class ProguardHelper { Artifact proguardOutputJar, JavaSemantics semantics, @Nullable Integer optimizationPasses, - @Nullable Artifact proguardOutputMap) throws InterruptedException { + @Nullable Artifact proguardOutputMap, + boolean useSingleJarForProguardLibraryJars) throws InterruptedException { JavaOptimizationMode optMode = getJavaOptimizationMode(ruleContext); Preconditions.checkArgument(optMode != JavaOptimizationMode.NOOP); Preconditions.checkArgument(optMode != JavaOptimizationMode.LEGACY || !proguardSpecs.isEmpty()); @@ -386,6 +393,20 @@ public abstract class ProguardHelper { getProguardOutputs(proguardOutputJar, proguardSeeds, proguardUsage, ruleContext, semantics, proguardOutputMap); + + if (useSingleJarForProguardLibraryJars && Iterables.size(libraryJars) > 1) { + JavaTargetAttributes attributes = new JavaTargetAttributes.Builder(semantics) + .build(); + Artifact combinedLibraryJar = getProguardTempArtifact(ruleContext, + optMode.name().toLowerCase(), "combined_library_jars.jar"); + new DeployArchiveBuilder(semantics, ruleContext) + .setOutputJar(combinedLibraryJar) + .setAttributes(attributes) + .addRuntimeJars(libraryJars) + .build(); + libraryJars = ImmutableList.of(combinedLibraryJar); + } + if (optimizationPasses == null) { // Run proguard as a single step. Builder builder = makeBuilder( -- cgit v1.2.3