aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Googler <noreply@google.com>2017-02-23 22:01:48 +0000
committerGravatar Irina Iancu <elenairina@google.com>2017-02-24 08:30:45 +0000
commit0cc293e46771144837a5ad4accf5d49e655060e9 (patch)
treeae39d8f97a4777cf854729b5e6714def6263e5d9
parentac6b092caafc7e1f7b58b4d2556ad79d6e2145c8 (diff)
Description redacted.
-- PiperOrigin-RevId: 148388306 MOS_MIGRATED_REVID=148388306
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java3
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidConfiguration.java12
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/ProguardHelper.java43
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<String, Label> 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<String, String> 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 <i>output</i> 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 <i>output</i> 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.
*
- * <p>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}.
+ * <p>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<Artifact> 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<Artifact> 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(