From ab8ea13d81106aebcfd1c08f4edec198e347c48c Mon Sep 17 00:00:00 2001 From: ajmichael Date: Wed, 20 Dec 2017 12:53:31 -0800 Subject: Remove references to some internal tooling. RELNOTES: None PiperOrigin-RevId: 179722149 --- .../bazel/rules/android/BazelAndroidSemantics.java | 19 +++ .../build/lib/rules/android/AndroidBinary.java | 133 +++++---------------- .../build/lib/rules/android/AndroidCommon.java | 2 +- .../lib/rules/android/AndroidRuleClasses.java | 15 --- .../build/lib/rules/android/AndroidSemantics.java | 17 +++ 5 files changed, 68 insertions(+), 118 deletions(-) (limited to 'src/main') 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 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 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 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 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)) /* Additional command-line flags for the dx tool when generating classes.dex. Subject to "Make variable" 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 proguard_specs is also specified. When - proguard_specs 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")) /* Select the manifest merger to use for this rule.
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 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 filesBuilder, + Artifact classesDexZip, + ProguardOutput proguardOutput) + throws InterruptedException; } -- cgit v1.2.3