aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java
diff options
context:
space:
mode:
authorGravatar Googler <noreply@google.com>2015-12-17 21:32:15 +0000
committerGravatar Kristina Chodorow <kchodorow@google.com>2015-12-21 21:34:45 +0000
commit0d32f35a05388d09e07305aac519014b92e8931a (patch)
tree82dd9bff95c2163c556d851971aae2a22be6c43a /src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java
parent99a89acf4c7608eb56d77cb746db32842833c6c1 (diff)
--
MOS_MIGRATED_REVID=110484622
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.java177
1 files changed, 21 insertions, 156 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 638db7ed97..64b078d200 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,13 +14,12 @@
package com.google.devtools.build.lib.rules.android;
import static com.google.common.base.Strings.isNullOrEmpty;
+import static com.google.devtools.build.lib.rules.android.ProguardHelper.PROGUARD_SPECS;
-import com.google.common.base.Joiner;
import com.google.common.base.Optional;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.ImmutableSortedSet;
import com.google.common.collect.Iterables;
import com.google.common.collect.Multimap;
import com.google.common.collect.MultimapBuilder;
@@ -38,7 +37,6 @@ import com.google.devtools.build.lib.analysis.RunfilesProvider;
import com.google.devtools.build.lib.analysis.TransitiveInfoCollection;
import com.google.devtools.build.lib.analysis.actions.CommandLine;
import com.google.devtools.build.lib.analysis.actions.CustomCommandLine;
-import com.google.devtools.build.lib.analysis.actions.FileWriteAction;
import com.google.devtools.build.lib.analysis.actions.SpawnAction;
import com.google.devtools.build.lib.analysis.actions.SpawnAction.Builder;
import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
@@ -50,6 +48,7 @@ import com.google.devtools.build.lib.packages.BuildType;
import com.google.devtools.build.lib.packages.TriState;
import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory;
import com.google.devtools.build.lib.rules.android.AndroidRuleClasses.MultidexMode;
+import com.google.devtools.build.lib.rules.android.ProguardHelper.ProguardOutput;
import com.google.devtools.build.lib.rules.cpp.CcToolchainProvider;
import com.google.devtools.build.lib.rules.cpp.CppHelper;
import com.google.devtools.build.lib.rules.java.DeployArchiveBuilder;
@@ -60,7 +59,6 @@ import com.google.devtools.build.lib.rules.java.JavaConfiguration.JavaOptimizati
import com.google.devtools.build.lib.rules.java.JavaSemantics;
import com.google.devtools.build.lib.rules.java.JavaSourceInfoProvider;
import com.google.devtools.build.lib.rules.java.JavaTargetAttributes;
-import com.google.devtools.build.lib.rules.java.ProguardSpecProvider;
import com.google.devtools.build.lib.syntax.Type;
import com.google.devtools.build.lib.util.Preconditions;
import com.google.devtools.build.lib.vfs.PathFragment;
@@ -71,13 +69,10 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
-import javax.annotation.Nullable;
-
/**
* An implementation for the "android_binary" rule.
*/
public abstract class AndroidBinary implements RuleConfiguredTargetFactory {
- static final String PROGUARD_SPECS = "proguard_specs";
protected abstract JavaSemantics createJavaSemantics();
protected abstract AndroidSemantics createAndroidSemantics();
@@ -211,7 +206,7 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory {
ruleContext.attributes().get("application_id", Type.STRING),
getExpandedMakeVarsForAttr(ruleContext, "version_code"),
getExpandedMakeVarsForAttr(ruleContext, "version_name"),
- false, getProguardConfigArtifact(ruleContext, ""));
+ false, ProguardHelper.getProguardConfigArtifact(ruleContext, ""));
if (ruleContext.hasErrors()) {
return null;
}
@@ -228,7 +223,7 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory {
ruleContext.attributes().get("application_id", Type.STRING),
getExpandedMakeVarsForAttr(ruleContext, "version_code"),
getExpandedMakeVarsForAttr(ruleContext, "version_name"),
- true, getProguardConfigArtifact(ruleContext, "incremental"));
+ true, ProguardHelper.getProguardConfigArtifact(ruleContext, "incremental"));
if (ruleContext.hasErrors()) {
return null;
}
@@ -245,7 +240,7 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory {
ruleContext.attributes().get("application_id", Type.STRING),
getExpandedMakeVarsForAttr(ruleContext, "version_code"),
getExpandedMakeVarsForAttr(ruleContext, "version_name"),
- true, getProguardConfigArtifact(ruleContext, "incremental_split"));
+ true, ProguardHelper.getProguardConfigArtifact(ruleContext, "incremental_split"));
if (ruleContext.hasErrors()) {
return null;
}
@@ -264,10 +259,10 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory {
ruleContext,
resourceDeps,
true,
- getProguardConfigArtifact(ruleContext, ""));
+ ProguardHelper.getProguardConfigArtifact(ruleContext, ""));
} else {
resourceApk = applicationManifest.useCurrentResources(ruleContext,
- getProguardConfigArtifact(ruleContext, ""));
+ ProguardHelper.getProguardConfigArtifact(ruleContext, ""));
}
incrementalResourceApk = applicationManifest
.addStubApplication(ruleContext)
@@ -277,7 +272,7 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory {
ruleContext,
resourceDeps,
false,
- getProguardConfigArtifact(ruleContext, "incremental"));
+ ProguardHelper.getProguardConfigArtifact(ruleContext, "incremental"));
if (ruleContext.hasErrors()) {
return null;
}
@@ -288,7 +283,7 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory {
ruleContext,
resourceDeps,
false,
- getProguardConfigArtifact(ruleContext, "incremental_split"));
+ ProguardHelper.getProguardConfigArtifact(ruleContext, "incremental_split"));
if (ruleContext.hasErrors()) {
return null;
}
@@ -346,7 +341,8 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory {
JavaTargetAttributes resourceClasses,
ImmutableList<Artifact> apksUnderTest,
Artifact proguardMapping) throws InterruptedException {
- ImmutableList<Artifact> proguardSpecs = getTransitiveProguardSpecs(ruleContext, resourceApk);
+ ImmutableList<Artifact> proguardSpecs = ProguardHelper.collectTransitiveProguardSpecs(
+ ruleContext, resourceApk.getResourceProguardConfig());
ProguardOutput proguardOutput =
applyProguard(
@@ -356,7 +352,7 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory {
filesBuilder,
proguardSpecs,
proguardMapping);
- Artifact jarToDex = proguardOutput.outputJar;
+ Artifact jarToDex = proguardOutput.getOutputJar();
DexingOutput dexingOutput =
shouldDexWithJack(ruleContext)
? dexWithJack(ruleContext, androidCommon, proguardSpecs)
@@ -562,9 +558,9 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory {
androidSemantics.addTransitiveInfoProviders(
builder, ruleContext, javaCommon, androidCommon, jarToDex);
- if (proguardOutput.mapping != null) {
+ if (proguardOutput.getMapping() != null) {
builder.add(ProguardMappingProvider.class,
- new ProguardMappingProvider(proguardOutput.mapping));
+ new ProguardMappingProvider(proguardOutput.getMapping()));
}
return builder
@@ -730,70 +726,6 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory {
return context.expandMakeVariables(attr, value);
}
- @Immutable
- private static final class ProguardOutput {
- private final Artifact outputJar;
- @Nullable private final Artifact mapping;
-
- private ProguardOutput(Artifact outputJar, Artifact mapping) {
- this.outputJar = outputJar;
- this.mapping = mapping;
- }
- }
-
- /**
- * Retrieves the full set of proguard specs that should be applied to this binary.
- *
- * <p>If Proguard shouldn't be applied, or the legacy link mode is used and there are no
- * proguard_specs on this rule, an empty list will be returned, regardless of any specs from
- * dependencies or the resourceApk.
- */
- private static ImmutableList<Artifact> getTransitiveProguardSpecs(
- RuleContext ruleContext, ResourceApk resourceApk) {
- JavaOptimizationMode optMode = getJavaOptimizationMode(ruleContext);
- if (optMode == JavaOptimizationMode.NOOP) {
- return ImmutableList.of();
- }
-
- ImmutableList<Artifact> proguardSpecs =
- ruleContext.getPrerequisiteArtifacts(PROGUARD_SPECS, Mode.TARGET).list();
- if (optMode == JavaOptimizationMode.LEGACY && proguardSpecs.isEmpty()) {
- return ImmutableList.of();
- }
-
- // TODO(kmb): In modes other than LEGACY verify that proguard specs don't include -dont... flags
- // since those flags would override the desired optMode (b/25621573)
- ImmutableSortedSet.Builder<Artifact> builder =
- ImmutableSortedSet.orderedBy(Artifact.EXEC_PATH_COMPARATOR)
- .addAll(proguardSpecs)
- .addAll(ruleContext
- .getPrerequisiteArtifacts(":extra_proguard_specs", Mode.TARGET)
- .list());
- for (ProguardSpecProvider dep :
- ruleContext.getPrerequisites("deps", Mode.TARGET, ProguardSpecProvider.class)) {
- builder.addAll(dep.getTransitiveProguardSpecs());
- }
-
- // Include proguard spec generated from rule's resources
- Artifact output = resourceApk.getResourceProguardConfig();
- builder.add(output);
-
- // Generate and include implicit Proguard spec for requested mode.
- if (!optMode.getImplicitProguardDirectives().isEmpty()) {
- Artifact implicitDirectives =
- getProguardConfigArtifact(ruleContext, optMode.name().toLowerCase());
- ruleContext.registerAction(
- new FileWriteAction(
- ruleContext.getActionOwner(),
- implicitDirectives,
- optMode.getImplicitProguardDirectives(),
- /*executable*/ false));
- builder.add(implicitDirectives);
- }
-
- return builder.build().asList();
- }
-
private static JavaOptimizationMode getJavaOptimizationMode(RuleContext ruleContext) {
return ruleContext.getConfiguration().getFragment(JavaConfiguration.class)
.getJavaOptimizationMode();
@@ -821,8 +753,13 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory {
}
AndroidSdkProvider sdk = AndroidSdkProvider.fromRuleContext(ruleContext);
- return createProguardAction(ruleContext, common, sdk.getProguard(), deployJarArtifact,
- proguardSpecs, proguardMapping, sdk.getAndroidJar(), proguardOutputJar, filesBuilder);
+ NestedSet<Artifact> libraryJars = NestedSetBuilder.<Artifact>naiveLinkOrder()
+ .add(sdk.getAndroidJar())
+ .addTransitive(common.getTransitiveNeverLinkLibraries())
+ .build();
+ return ProguardHelper.createProguardAction(ruleContext, sdk.getProguard(), deployJarArtifact,
+ proguardSpecs, proguardMapping, libraryJars, proguardOutputJar,
+ ruleContext.attributes().get("proguard_generate_mapping", Type.BOOLEAN), filesBuilder);
}
private static ProguardOutput createEmptyProguardAction(RuleContext ruleContext,
@@ -845,66 +782,6 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory {
return new ProguardOutput(deployJarArtifact, null);
}
- private static ProguardOutput createProguardAction(RuleContext ruleContext, AndroidCommon common,
- FilesToRunProvider proguard,
- Artifact jar, ImmutableList<Artifact> proguardSpecs,
- Artifact proguardMapping, Artifact androidJar, Artifact proguardOutputJar,
- NestedSetBuilder<Artifact> filesBuilder) throws InterruptedException {
- Iterable<Artifact> libraryJars = NestedSetBuilder.<Artifact>naiveLinkOrder()
- .add(androidJar)
- .addTransitive(common.getTransitiveNeverLinkLibraries())
- .build();
-
- Builder builder = new SpawnAction.Builder()
- .addInput(jar)
- .addInputs(libraryJars)
- .addInputs(proguardSpecs)
- .addOutput(proguardOutputJar)
- .setExecutable(proguard)
- .setProgressMessage("Trimming binary with proguard")
- .setMnemonic("Proguard")
- .addArgument("-injars")
- .addArgument(jar.getExecPathString());
-
- for (Artifact libraryJar : libraryJars) {
- builder.addArgument("-libraryjars")
- .addArgument(libraryJar.getExecPathString());
- }
-
- filesBuilder.add(proguardOutputJar);
-
- if (proguardMapping != null) {
- builder.addInput(proguardMapping)
- .addArgument("-applymapping")
- .addArgument(proguardMapping.getExecPathString());
- }
-
- builder.addArgument("-outjars")
- .addArgument(proguardOutputJar.getExecPathString());
-
- for (Artifact proguardSpec : proguardSpecs) {
- builder.addArgument("@" + proguardSpec.getExecPathString());
- }
-
- Artifact proguardOutputMap = null;
- JavaOptimizationMode optMode = getJavaOptimizationMode(ruleContext);
- if (ruleContext.attributes().get("proguard_generate_mapping", Type.BOOLEAN)
- || optMode.alwaysGenerateOutputMapping()) {
- // TODO(kmb): Verify that proguard spec files don't contain -printmapping directions which
- // this -printmapping command line flag will override.
- proguardOutputMap = ruleContext.getImplicitOutputArtifact(
- AndroidRuleClasses.ANDROID_BINARY_PROGUARD_MAP);
-
- builder.addOutput(proguardOutputMap)
- .addArgument("-printmapping")
- .addArgument(proguardOutputMap.getExecPathString());
- filesBuilder.add(proguardOutputMap);
- }
-
- ruleContext.registerAction(builder.build(ruleContext));
- return new ProguardOutput(proguardOutputJar, proguardOutputMap);
- }
-
@Immutable
private static final class DexingOutput {
private final Artifact classesDexZip;
@@ -1419,16 +1296,4 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory {
return ruleContext.getUniqueDirectoryArtifact("_dx", baseName,
ruleContext.getBinOrGenfilesDirectory());
}
-
- /**
- * Returns an intermediate artifact used to run Proguard.
- */
- public static Artifact getProguardConfigArtifact(RuleContext ruleContext, String prefix) {
- // TODO(bazel-team): Remove the redundant inclusion of the rule name, as getUniqueDirectory
- // includes the rulename as well.
- return Preconditions.checkNotNull(ruleContext.getUniqueDirectoryArtifact(
- "proguard",
- Joiner.on("_").join(prefix, ruleContext.getLabel().getName(), "proguard.cfg"),
- ruleContext.getBinOrGenfilesDirectory()));
- }
}