aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools
diff options
context:
space:
mode:
authorGravatar Googler <noreply@google.com>2016-10-11 16:40:36 +0000
committerGravatar Yue Gan <yueg@google.com>2016-10-12 08:55:13 +0000
commit978c9178f0c75770b3c0477671cc1e895515d91d (patch)
treeba302b4c6bcb0ad2664376088f91bac5676fee8b /src/main/java/com/google/devtools
parent74b94328db5346e0f6c573731fcbaa85ca751304 (diff)
Added support for rex to optionally compress dex files.
-- MOS_MIGRATED_REVID=135805730
Diffstat (limited to 'src/main/java/com/google/devtools')
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java40
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidConfiguration.java14
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidRuleClasses.java150
3 files changed, 147 insertions, 57 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 ec92b0476c..8a229275be 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
@@ -431,16 +431,46 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory {
resourceApk.getMainDexProguardConfig(),
resourceClasses);
+ Artifact finalDexes;
+ Artifact finalProguardMap;
+
+ if (ruleContext.getFragment(AndroidConfiguration.class).useRexToCompressDexFiles()
+ || (ruleContext.attributes().get("rewrite_dexes_with_rex", Type.BOOLEAN))) {
+ finalDexes = getDxArtifact(ruleContext, "rexed_dexes.zip");
+ Builder rexActionBuilder = new SpawnAction.Builder();
+ rexActionBuilder
+ .setExecutable(ruleContext.getExecutablePrerequisite("$rex_wrapper", Mode.HOST))
+ .setMnemonic("Rex")
+ .setProgressMessage("Rexing dex files")
+ .addArgument("--dex_input")
+ .addInputArgument(dexingOutput.classesDexZip)
+ .addArgument("--dex_output")
+ .addOutputArgument(finalDexes);
+ if (proguardOutput.getMapping() != null) {
+ finalProguardMap = getDxArtifact(ruleContext, "rexed_proguard.map");
+ rexActionBuilder
+ .addArgument("--proguard_input_map")
+ .addInputArgument(proguardOutput.getMapping())
+ .addArgument("--proguard_output_map")
+ .addOutputArgument(finalProguardMap);
+ } else {
+ finalProguardMap = proguardOutput.getMapping();
+ }
+ ruleContext.registerAction(rexActionBuilder.build(ruleContext));
+ } else {
+ finalDexes = dexingOutput.classesDexZip;
+ finalProguardMap = proguardOutput.getMapping();
+ }
+
ApkSigningMethod signingMethod =
ruleContext.getFragment(AndroidConfiguration.class).getApkSigningMethod();
-
Artifact unsignedApk =
ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_BINARY_UNSIGNED_APK);
Artifact zipAlignedApk =
ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_BINARY_APK);
ApkActionsBuilder.create("apk", signingMethod)
- .setClassesDex(dexingOutput.classesDexZip)
+ .setClassesDex(finalDexes)
.setResourceApk(resourceApk.getArtifact())
.setJavaResourceZip(dexingOutput.javaResourceJar)
.setNativeLibs(nativeLibs)
@@ -675,9 +705,9 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory {
builder, ruleContext, javaCommon, androidCommon, jarToDex);
if (proguardOutput.getMapping() != null) {
- builder.add(ProguardMappingProvider.class,
- ProguardMappingProvider.create(
- proguardOutput.getMapping(), proguardOutput.getProtoMapping()));
+ builder.add(
+ ProguardMappingProvider.class,
+ ProguardMappingProvider.create(finalProguardMap, proguardOutput.getProtoMapping()));
}
return builder
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 e718d82254..1a4695df1a 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
@@ -376,6 +376,14 @@ public class AndroidConfiguration extends BuildConfiguration.Fragment {
help = "dx flags supported in incremental dexing.")
public List<String> dexoptsSupportedInIncrementalDexing;
+ @Option(
+ name = "experimental_android_rewrite_dexes_with_rex",
+ defaultValue = "false",
+ category = "undocumented",
+ help = "use rex tool to rewrite dex files"
+ )
+ public boolean useRexToCompressDexFiles;
+
@Option(name = "experimental_allow_android_library_deps_without_srcs",
defaultValue = "true",
category = "undocumented",
@@ -498,6 +506,7 @@ public class AndroidConfiguration extends BuildConfiguration.Fragment {
private final ImmutableList<String> dexoptsSupportedInIncrementalDexing;
private final ImmutableList<String> targetDexoptsThatPreventIncrementalDexing;
private final boolean desugarJava8;
+ private final boolean useRexToCompressDexFiles;
private final boolean allowAndroidLibraryDepsWithoutSrcs;
private final boolean useAndroidResourceShrinking;
private final boolean useRClassGenerator;
@@ -530,6 +539,7 @@ public class AndroidConfiguration extends BuildConfiguration.Fragment {
this.manifestMerger = options.manifestMerger;
this.apkSigningMethod = options.apkSigningMethod;
this.useSingleJarApkBuilder = options.useSingleJarApkBuilder;
+ this.useRexToCompressDexFiles = options.useRexToCompressDexFiles;
}
public String getCpu() {
@@ -586,6 +596,10 @@ public class AndroidConfiguration extends BuildConfiguration.Fragment {
return desugarJava8;
}
+ public boolean useRexToCompressDexFiles() {
+ return useRexToCompressDexFiles;
+ }
+
public boolean allowSrcsLessAndroidLibraryDeps() {
return allowAndroidLibraryDepsWithoutSrcs;
}
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 9ee0dfbe54..879b8a2a10 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
@@ -594,9 +594,10 @@ public final class AndroidRuleClasses {
<p>This rule currently forces source and class compatibility with Java 6.
</p>
<!-- #END_BLAZE_RULE.ATTRIBUTE --> */
- .add(attr("srcs", LABEL_LIST)
- .direct_compile_time_input()
- .allowedFileTypes(JavaSemantics.JAVA_SOURCE, JavaSemantics.SOURCE_JAR))
+ .add(
+ attr("srcs", LABEL_LIST)
+ .direct_compile_time_input()
+ .allowedFileTypes(JavaSemantics.JAVA_SOURCE, JavaSemantics.SOURCE_JAR))
/* <!-- #BLAZE_RULE($android_binary_base).ATTRIBUTE(deps) -->
The list of other libraries to be linked in to the binary target.
Permitted library types are: <code>android_library</code>,
@@ -604,38 +605,77 @@ public final class AndroidRuleClasses {
<code>cc_library</code> wrapping or producing <code>.so</code> native libraries for the
Android target platform.
<!-- #END_BLAZE_RULE.ATTRIBUTE --> */
- .override(builder.copy("deps")
- .cfg(ANDROID_SPLIT_TRANSITION)
- .allowedRuleClasses(ALLOWED_DEPENDENCIES)
- .allowedFileTypes()
- .aspect(androidNeverlinkAspect)
- .aspect(dexArchiveAspect, DexArchiveAspect.PARAM_EXTRACTOR)
- .aspect(jackAspect))
+ .override(
+ builder
+ .copy("deps")
+ .cfg(ANDROID_SPLIT_TRANSITION)
+ .allowedRuleClasses(ALLOWED_DEPENDENCIES)
+ .allowedFileTypes()
+ .aspect(androidNeverlinkAspect)
+ .aspect(dexArchiveAspect, DexArchiveAspect.PARAM_EXTRACTOR)
+ .aspect(jackAspect))
// Proguard rule specifying master list of classes to keep during legacy multidexing.
- .add(attr("$build_incremental_dexmanifest", LABEL).cfg(HOST).exec()
- .value(env.getToolsLabel(BUILD_INCREMENTAL_DEXMANIFEST_LABEL)))
- .add(attr("$stubify_manifest", LABEL).cfg(HOST).exec()
- .value(env.getToolsLabel(STUBIFY_MANIFEST_LABEL)))
- .add(attr("$shuffle_jars", LABEL).cfg(HOST).exec()
- .value(env.getToolsLabel("//tools/android:shuffle_jars")))
- .add(attr("$dexbuilder", LABEL).cfg(HOST).exec()
- .value(env.getToolsLabel("//tools/android:dexbuilder")))
- .add(attr("$dexmerger", LABEL).cfg(HOST).exec()
- .value(env.getToolsLabel("//tools/android:dexmerger")))
- .add(attr("$merge_dexzips", LABEL).cfg(HOST).exec()
- .value(env.getToolsLabel("//tools/android:merge_dexzips")))
- .add(attr("$incremental_install", LABEL).cfg(HOST).exec()
- .value(env.getToolsLabel(INCREMENTAL_INSTALL_LABEL)))
- .add(attr("$build_split_manifest", LABEL).cfg(HOST).exec()
- .value(env.getToolsLabel(BUILD_SPLIT_MANIFEST_LABEL)))
- .add(attr("$strip_resources", LABEL).cfg(HOST).exec()
- .value(env.getToolsLabel(STRIP_RESOURCES_LABEL)))
- .add(attr("$incremental_stub_application", LABEL)
- .value(env.getToolsLabel(DEFAULT_INCREMENTAL_STUB_APPLICATION)))
- .add(attr("$incremental_split_stub_application", LABEL)
- .value(env.getToolsLabel(DEFAULT_INCREMENTAL_SPLIT_STUB_APPLICATION)))
- .add(attr("$desugar", LABEL).cfg(HOST).exec()
- .value(env.getToolsLabel("//tools/android:desugar_java8")))
+ .add(
+ attr("$build_incremental_dexmanifest", LABEL)
+ .cfg(HOST)
+ .exec()
+ .value(env.getToolsLabel(BUILD_INCREMENTAL_DEXMANIFEST_LABEL)))
+ .add(
+ attr("$stubify_manifest", LABEL)
+ .cfg(HOST)
+ .exec()
+ .value(env.getToolsLabel(STUBIFY_MANIFEST_LABEL)))
+ .add(
+ attr("$shuffle_jars", LABEL)
+ .cfg(HOST)
+ .exec()
+ .value(env.getToolsLabel("//tools/android:shuffle_jars")))
+ .add(
+ attr("$dexbuilder", LABEL)
+ .cfg(HOST)
+ .exec()
+ .value(env.getToolsLabel("//tools/android:dexbuilder")))
+ .add(
+ attr("$dexmerger", LABEL)
+ .cfg(HOST)
+ .exec()
+ .value(env.getToolsLabel("//tools/android:dexmerger")))
+ .add(
+ attr("$merge_dexzips", LABEL)
+ .cfg(HOST)
+ .exec()
+ .value(env.getToolsLabel("//tools/android:merge_dexzips")))
+ .add(
+ attr("$incremental_install", LABEL)
+ .cfg(HOST)
+ .exec()
+ .value(env.getToolsLabel(INCREMENTAL_INSTALL_LABEL)))
+ .add(
+ attr("$build_split_manifest", LABEL)
+ .cfg(HOST)
+ .exec()
+ .value(env.getToolsLabel(BUILD_SPLIT_MANIFEST_LABEL)))
+ .add(
+ attr("$strip_resources", LABEL)
+ .cfg(HOST)
+ .exec()
+ .value(env.getToolsLabel(STRIP_RESOURCES_LABEL)))
+ .add(
+ attr("$incremental_stub_application", LABEL)
+ .value(env.getToolsLabel(DEFAULT_INCREMENTAL_STUB_APPLICATION)))
+ .add(
+ attr("$incremental_split_stub_application", LABEL)
+ .value(env.getToolsLabel(DEFAULT_INCREMENTAL_SPLIT_STUB_APPLICATION)))
+ .add(
+ attr("$desugar", LABEL)
+ .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")))
/* <!-- #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
@@ -661,9 +701,10 @@ public final class AndroidRuleClasses {
android_test rules with binary_under_test set. We are working on addressing these
shortcomings so please check with us if you run into these limitations.
<!-- #END_BLAZE_RULE.ATTRIBUTE --> */
- .add(attr("incremental_dexing", TRISTATE)
- // Read by DexArchiveAspect's attribute extractor
- .nonconfigurable("AspectParameters don't support configurations."))
+ .add(
+ attr("incremental_dexing", TRISTATE)
+ // Read by DexArchiveAspect's attribute extractor
+ .nonconfigurable("AspectParameters don't support configurations."))
/* <!-- #BLAZE_RULE($android_binary_base).ATTRIBUTE(multidex) -->
Whether to split code into multiple dex files.<br/>
Possible values:
@@ -682,9 +723,10 @@ public final class AndroidRuleClasses {
index limit.</li>
</ul>
<!-- #END_BLAZE_RULE.ATTRIBUTE --> */
- .add(attr("multidex", STRING)
- .allowedValues(new AllowedValueSet(MultidexMode.getValidValues()))
- .value(MultidexMode.OFF.getAttributeValue()))
+ .add(
+ attr("multidex", STRING)
+ .allowedValues(new AllowedValueSet(MultidexMode.getValidValues()))
+ .value(MultidexMode.OFF.getAttributeValue()))
/* <!-- #BLAZE_RULE($android_binary_base).ATTRIBUTE(main_dex_list_opts) -->
Command line options to pass to the main dex list builder.
Use this option to affect the classes included in the main dex list.
@@ -694,13 +736,13 @@ public final class AndroidRuleClasses {
A text file contains a list of class file names. Classes defined by those class files are
put in the primary classes.dex. e.g.:<pre class="code">
-android/support/multidex/MultiDex$V19.class
-android/support/multidex/MultiDex.class
-android/support/multidex/MultiDexApplication.class
-com/google/common/base/Objects.class
- </pre>
- Must be used with <code>multidex="manual_main_dex"</code>.
- <!-- #END_BLAZE_RULE.ATTRIBUTE --> */
+ android/support/multidex/MultiDex$V19.class
+ android/support/multidex/MultiDex.class
+ android/support/multidex/MultiDexApplication.class
+ com/google/common/base/Objects.class
+ </pre>
+ Must be used with <code>multidex="manual_main_dex"</code>.
+ <!-- #END_BLAZE_RULE.ATTRIBUTE --> */
.add(attr("main_dex_list", LABEL).legacyAllowAnyFileType())
/* <!-- #BLAZE_RULE($android_binary_base).ATTRIBUTE(main_dex_proguard_specs) -->
Files to be used as the Proguard specifications to determine classes that must be kept in
@@ -722,8 +764,10 @@ com/google/common/base/Objects.class
specification should contain neither <code>-dontobfuscate</code> nor
<code>-printmapping</code>.</em></p>
<!-- #END_BLAZE_RULE.ATTRIBUTE --> */
- .add(attr("proguard_generate_mapping", BOOLEAN).value(false)
- .nonconfigurable("value is referenced in an ImplicitOutputsFunction"))
+ .add(
+ attr("proguard_generate_mapping", BOOLEAN)
+ .value(false)
+ .nonconfigurable("value is referenced in an ImplicitOutputsFunction"))
/* <!-- #BLAZE_RULE($android_binary_base).ATTRIBUTE(proguard_apply_mapping) -->
File to be used as a mapping for proguard.
A mapping file generated by <code>proguard_generate_mapping</code> to be
@@ -731,10 +775,12 @@ com/google/common/base/Objects.class
<!-- #END_BLAZE_RULE.ATTRIBUTE --> */
.add(attr("proguard_apply_mapping", LABEL).legacyAllowAnyFileType())
// TODO(mstaib): Remove this attribute and the matching flag after some cleanup of users
- .add(attr("legacy_native_support", TRISTATE)
- .value(TriState.AUTO)
- .undocumented("No-op, soon to be removed"))
+ .add(
+ attr("legacy_native_support", TRISTATE)
+ .value(TriState.AUTO)
+ .undocumented("No-op, soon to be removed"))
.add(attr(":extra_proguard_specs", LABEL_LIST).value(JavaSemantics.EXTRA_PROGUARD_SPECS))
+ .add(attr("rewrite_dexes_with_rex", BOOLEAN).value(false).undocumented("experimental"))
.advertiseProvider(JavaCompilationArgsProvider.class)
.build();
}