aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java
diff options
context:
space:
mode:
authorGravatar ajmichael <ajmichael@google.com>2017-12-20 12:53:31 -0800
committerGravatar Copybara-Service <copybara-piper@google.com>2017-12-20 12:55:05 -0800
commitab8ea13d81106aebcfd1c08f4edec198e347c48c (patch)
treec67eb160f67369fd40bf2556ad40b9597c854956 /src/main/java
parente6940a554bfbd79e3e4534100fb7bf92be87cab2 (diff)
Remove references to some internal tooling.
RELNOTES: None PiperOrigin-RevId: 179722149
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/com/google/devtools/build/lib/bazel/rules/android/BazelAndroidSemantics.java19
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java133
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidRuleClasses.java15
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidSemantics.java17
5 files changed, 68 insertions, 118 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/BazelAndroidSemantics.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/BazelAndroidSemantics.java
index 4d5ae958e8..46b5c0e063 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/BazelAndroidSemantics.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/BazelAndroidSemantics.java
@@ -18,6 +18,8 @@ import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.analysis.RuleContext;
import com.google.devtools.build.lib.analysis.actions.CustomCommandLine;
import com.google.devtools.build.lib.analysis.actions.SpawnAction;
+import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
+import com.google.devtools.build.lib.rules.android.AndroidBinary;
import com.google.devtools.build.lib.rules.android.AndroidCommon;
import com.google.devtools.build.lib.rules.android.AndroidConfiguration;
import com.google.devtools.build.lib.rules.android.AndroidIdeInfoProvider;
@@ -26,6 +28,7 @@ import com.google.devtools.build.lib.rules.android.ResourceApk;
import com.google.devtools.build.lib.rules.java.JavaCompilationArtifacts;
import com.google.devtools.build.lib.rules.java.JavaSemantics;
import com.google.devtools.build.lib.rules.java.JavaTargetAttributes.Builder;
+import com.google.devtools.build.lib.rules.java.ProguardHelper.ProguardOutput;
/**
* Implementation of Bazel-specific behavior in Android rules.
@@ -86,4 +89,20 @@ public class BazelAndroidSemantics implements AndroidSemantics {
throw new UnsupportedOperationException("Only supported for top-level binaries");
}
}
+
+ @Override
+ public Artifact getProguardOutputMap(RuleContext ruleContext) throws InterruptedException {
+ return ruleContext.getImplicitOutputArtifact(JavaSemantics.JAVA_BINARY_PROGUARD_MAP);
+ }
+
+ /** Bazel does not currently support any dex postprocessing. */
+ @Override
+ public AndroidBinary.DexPostprocessingOutput postprocessClassesDexZip(
+ RuleContext ruleContext,
+ NestedSetBuilder<Artifact> filesBuilder,
+ Artifact classesDexZip,
+ ProguardOutput proguardOutput)
+ throws InterruptedException {
+ return AndroidBinary.DexPostprocessingOutput.create(classesDexZip, proguardOutput.getMapping());
+ }
}
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 694c5d7dab..60b9ec2daa 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
@@ -19,6 +19,7 @@ import static com.google.common.base.Preconditions.checkState;
import static com.google.common.collect.ImmutableList.toImmutableList;
import static java.nio.charset.StandardCharsets.ISO_8859_1;
+import com.google.auto.value.AutoValue;
import com.google.common.base.Function;
import com.google.common.base.Functions;
import com.google.common.base.Preconditions;
@@ -94,6 +95,7 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory {
CppSemantics cppSemantics = createCppSemantics();
JavaSemantics javaSemantics = createJavaSemantics();
AndroidSemantics androidSemantics = createAndroidSemantics();
+ androidSemantics.validateAndroidBinaryRuleContext(ruleContext);
AndroidSdkProvider.verifyPresence(ruleContext);
NestedSetBuilder<Artifact> filesBuilder = NestedSetBuilder.stableOrder();
@@ -149,32 +151,6 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory {
"proguard_apply_mapping",
"'proguard_apply_dictionary' can only be used when 'proguard_specs' is also set");
}
- if (ruleContext.attributes().isAttributeValueExplicitlySpecified("rex_package_map")
- && !ruleContext.attributes().get("rewrite_dexes_with_rex", Type.BOOLEAN)) {
- ruleContext.throwWithAttributeError(
- "rex_package_map",
- "'rex_package_map' can only be used when 'rewrite_dexes_with_rex' is also set");
- }
- if (ruleContext.attributes().isAttributeValueExplicitlySpecified("rex_package_map")
- && ruleContext
- .attributes()
- .get(ProguardHelper.PROGUARD_SPECS, BuildType.LABEL_LIST)
- .isEmpty()) {
- ruleContext.throwWithAttributeError(
- "rex_package_map",
- "'rex_package_map' can only be used when 'proguard_specs' is also set");
- }
- if (ruleContext.attributes().isAttributeValueExplicitlySpecified("rexopts")
- && !ruleContext.attributes().get("rewrite_dexes_with_rex", Type.BOOLEAN)) {
- ruleContext.throwWithAttributeError(
- "rexopts", "'rexopts' can only be used when 'rewrite_dexes_with_rex' is also set");
- }
- if (ruleContext.attributes().isAttributeValueExplicitlySpecified("resources")
- && DataBinding.isEnabled(ruleContext)) {
- ruleContext.throwWithRuleError(
- "Data binding doesn't work with the \"resources\" attribute. "
- + "Use \"resource_files\" instead.");
- }
AndroidCommon.validateResourcesAttribute(ruleContext);
}
@@ -408,26 +384,13 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory {
.build();
}
- boolean rexEnabled =
- ruleContext.getFragment(AndroidConfiguration.class).useRexToCompressDexFiles()
- || (ruleContext.attributes().get("rewrite_dexes_with_rex", Type.BOOLEAN));
-
// TODO(bazel-team): Verify that proguard spec files don't contain -printmapping directions
// which this -printmapping command line flag will override.
Artifact proguardOutputMap = null;
if (ProguardHelper.genProguardMapping(ruleContext.attributes())
|| ProguardHelper.getJavaOptimizationMode(ruleContext).alwaysGenerateOutputMapping()
|| shrinkResources) {
- if (rexEnabled) {
- proguardOutputMap =
- ProguardHelper.getProguardTempArtifact(
- ruleContext,
- ProguardHelper.getJavaOptimizationMode(ruleContext).name().toLowerCase(),
- "proguard_output_for_rex.map");
- } else {
- proguardOutputMap =
- ruleContext.getImplicitOutputArtifact(JavaSemantics.JAVA_BINARY_PROGUARD_MAP);
- }
+ proguardOutputMap = androidSemantics.getProguardOutputMap(ruleContext);
}
ProguardOutput proguardOutput =
@@ -463,67 +426,12 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory {
NestedSet<Artifact> nativeLibsZips =
AndroidCommon.collectTransitiveNativeLibsZips(ruleContext).build();
- Artifact finalDexes;
- Artifact finalProguardMap;
- if (rexEnabled) {
- finalDexes = getDxArtifact(ruleContext, "rexed_dexes.zip");
- SpawnAction.Builder rexActionBuilder = new SpawnAction.Builder();
- CustomCommandLine.Builder commandLine = CustomCommandLine.builder();
- rexActionBuilder
- .useDefaultShellEnvironment()
- .setExecutable(ruleContext.getExecutablePrerequisite("$rex_wrapper", Mode.HOST))
- .setMnemonic("Rex")
- .setProgressMessage("Rexing dex files")
- .addInput(dexingOutput.classesDexZip)
- .addOutput(finalDexes);
- commandLine
- .addExecPath("--dex_input", dexingOutput.classesDexZip)
- .addExecPath("--dex_output", finalDexes);
- if (proguardOutput.getMapping() != null) {
- finalProguardMap =
- ruleContext.getImplicitOutputArtifact(JavaSemantics.JAVA_BINARY_PROGUARD_MAP);
- Artifact finalRexPackageMap =
- ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.REX_OUTPUT_PACKAGE_MAP);
- rexActionBuilder
- .addInput(proguardOutput.getMapping())
- .addOutput(finalProguardMap)
- .addOutput(finalRexPackageMap);
- filesBuilder.add(finalRexPackageMap);
- commandLine
- .addExecPath("--proguard_input_map", proguardOutput.getMapping())
- .addExecPath("--proguard_output_map", finalProguardMap)
- .addExecPath("--rex_output_package_map", finalRexPackageMap);
- if (ruleContext.attributes().isAttributeValueExplicitlySpecified("rex_package_map")) {
- Artifact rexPackageMap =
- ruleContext.getPrerequisiteArtifact("rex_package_map", Mode.TARGET);
- rexActionBuilder.addInput(rexPackageMap);
- commandLine.addExecPath("--rex_input_package_map", rexPackageMap);
- }
- } else {
- finalProguardMap = proguardOutput.getMapping();
- }
- // the Rex flag --keep-main-dex is used to support builds with API level below 21 that do not
- // support native multi-dex. This flag indicates to Rex to use the main_dex_list file which
- // can be provided by the user via the main_dex_list attribute or created automatically
- // when multidex mode is set to legacy.
- if (ruleContext.attributes().isAttributeValueExplicitlySpecified("main_dex_list")
- || getMultidexMode(ruleContext) == MultidexMode.LEGACY) {
- commandLine.add("--keep-main-dex");
- }
- // Pass rexopts to rex as a list of strings without validation
- if (ruleContext.attributes().isAttributeValueExplicitlySpecified("rexopts")) {
- List<String> rexopts = ruleContext.getExpander().withDataLocations().tokenized("rexopts");
- commandLine.addAll(rexopts);
- }
- rexActionBuilder.addCommandLine(commandLine.build());
- ruleContext.registerAction(rexActionBuilder.build(ruleContext));
- } else {
- finalDexes = dexingOutput.classesDexZip;
- finalProguardMap = proguardOutput.getMapping();
- }
+ DexPostprocessingOutput dexPostprocessingOutput =
+ androidSemantics.postprocessClassesDexZip(
+ ruleContext, filesBuilder, dexingOutput.classesDexZip, proguardOutput);
if (!proguardSpecs.isEmpty()) {
- proguardOutput.addAllToSet(filesBuilder, finalProguardMap);
+ proguardOutput.addAllToSet(filesBuilder, dexPostprocessingOutput.proguardMap());
}
Artifact unsignedApk =
@@ -535,7 +443,7 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory {
ruleContext.getExecutablePrerequisite("$resource_extractor", Mode.HOST);
ApkActionsBuilder.create("apk")
- .setClassesDex(finalDexes)
+ .setClassesDex(dexPostprocessingOutput.classesDexZip())
.addInputZip(resourceApk.getArtifact())
.setJavaResourceZip(dexingOutput.javaResourceJar, resourceExtractor)
.addInputZips(nativeLibsZips)
@@ -617,8 +525,10 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory {
androidCommon.isNeverLink()
);
- if (proguardOutput.getMapping() != null) {
- builder.add(ProguardMappingProvider.class, ProguardMappingProvider.create(finalProguardMap));
+ if (dexPostprocessingOutput.proguardMap() != null) {
+ builder.addProvider(
+ ProguardMappingProvider.class,
+ ProguardMappingProvider.create(dexPostprocessingOutput.proguardMap()));
}
if (oneVersionEnforcementArtifact != null) {
@@ -886,6 +796,25 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory {
}
}
+ /** All artifacts modified by any dex post-processing steps. */
+ @AutoValue
+ public abstract static class DexPostprocessingOutput {
+
+ public static DexPostprocessingOutput create(Artifact classesDexZip, Artifact proguardMap) {
+ return new AutoValue_AndroidBinary_DexPostprocessingOutput(classesDexZip, proguardMap);
+ }
+
+ /** A .zip of .dex files to include in the APK. */
+ abstract Artifact classesDexZip();
+
+ /**
+ * The proguard mapping corresponding to the post-processed dex files. This may be null if
+ * proguard was not run.
+ */
+ @Nullable
+ abstract Artifact proguardMap();
+ }
+
/** Creates one or more classes.dex files that correspond to {@code proguardedJar}. */
private static DexingOutput dex(
RuleContext ruleContext,
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 c50550c580..d632c01dc9 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
@@ -989,7 +989,7 @@ public class AndroidCommon {
}
/** Returns {@link AndroidConfiguration} in given context. */
- static AndroidConfiguration getAndroidConfig(RuleContext context) {
+ public static AndroidConfiguration getAndroidConfig(RuleContext context) {
return context.getConfiguration().getFragment(AndroidConfiguration.class);
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidRuleClasses.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidRuleClasses.java
index faa903ecb6..73d2e3922b 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidRuleClasses.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidRuleClasses.java
@@ -790,12 +790,6 @@ public final class AndroidRuleClasses {
.cfg(HOST)
.exec()
.value(env.getToolsLabel("//tools/android:desugar_java8")))
- .add(
- attr("$rex_wrapper", LABEL)
- .cfg(HOST)
- .exec()
- .value(env.getToolsLabel("//tools/android:rex_wrapper")))
- .add(attr("rexopts", STRING_LIST))
/* <!-- #BLAZE_RULE($android_binary_base).ATTRIBUTE(dexopts) -->
Additional command-line flags for the dx tool when generating classes.dex.
Subject to <a href="${link make-variables}">"Make variable"</a> substitution and
@@ -910,15 +904,6 @@ public final class AndroidRuleClasses {
attr(":cc_toolchain_split", LABEL)
.cfg(AndroidRuleClasses.ANDROID_SPLIT_TRANSITION)
.value(CppRuleClasses.ccToolchainAttribute(env)))
- .add(attr("rewrite_dexes_with_rex", BOOLEAN).value(false).undocumented("experimental"))
- /*
- File to be used as a package map for Rex tool that keeps the assignment of classes to
- dex files of a multi-dex application stable over time.
- Can only be used when <code>proguard_specs</code> is also specified. When
- <code>proguard_specs</code> is specified, but a package map isn't or there were changes,
- Rex suggests an updated package map that can be saved and reused for subsequent builds.
- */
- .add(attr("rex_package_map", LABEL).legacyAllowAnyFileType().undocumented("experimental"))
/* <!-- #BLAZE_RULE(android_binary).ATTRIBUTE(manifest_merger) -->
Select the manifest merger to use for this rule.<br/>
Possible values:
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSemantics.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSemantics.java
index 84d64e3b45..be646c3b8b 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSemantics.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSemantics.java
@@ -19,10 +19,12 @@ import com.google.devtools.build.lib.analysis.RuleContext;
import com.google.devtools.build.lib.analysis.actions.CustomCommandLine;
import com.google.devtools.build.lib.analysis.actions.SpawnAction;
import com.google.devtools.build.lib.analysis.actions.SymlinkAction;
+import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException;
import com.google.devtools.build.lib.rules.java.JavaCompilationArtifacts;
import com.google.devtools.build.lib.rules.java.JavaSemantics;
import com.google.devtools.build.lib.rules.java.JavaTargetAttributes;
+import com.google.devtools.build.lib.rules.java.ProguardHelper.ProguardOutput;
import javax.annotation.Nullable;
/**
@@ -114,4 +116,19 @@ public interface AndroidSemantics {
/** Returns the list of attributes that may contribute Java runtime dependencies. */
ImmutableList<String> getAttributesWithJavaRuntimeDeps(RuleContext ruleContext);
+
+ /** A hook for checks of internal-only or external-only attributes of {@code android_binary}. */
+ default void validateAndroidBinaryRuleContext(RuleContext ruleContext) throws RuleErrorException {
+ }
+
+ /** The artifact for the map that proguard will output. */
+ Artifact getProguardOutputMap(RuleContext ruleContext) throws InterruptedException;
+
+ /** Maybe post process the dex files and proguard output map. */
+ AndroidBinary.DexPostprocessingOutput postprocessClassesDexZip(
+ RuleContext ruleContext,
+ NestedSetBuilder<Artifact> filesBuilder,
+ Artifact classesDexZip,
+ ProguardOutput proguardOutput)
+ throws InterruptedException;
}