Skip to content

Commit 765c0eb

Browse files
Bencodescopybara-github
authored andcommitted
Fix worker and multiplex workers for DexBuilder and Desugar actions
Fixing up the DexBuilder and Desugar actions so that they correctly spawn worker or multiplexed worker actions. `--modify_execution_info` doesn't work as expected and is not additive, which results in the previous execution infos being removed. Closes #17351. PiperOrigin-RevId: 523696356 Change-Id: Iada7fb75df5b4d2e3ba1308110977899567f2bc2
1 parent 0f2f0f9 commit 765c0eb

6 files changed

Lines changed: 119 additions & 44 deletions

File tree

src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRulesModule.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -307,6 +307,15 @@ public static class BuildGraveyardOptions extends OptionsBase {
307307
help = "No-op, will be removed soon.",
308308
allowMultiple = true)
309309
public List<String> highPriorityWorkers;
310+
311+
@Option(
312+
name = "use_workers_with_dexbuilder",
313+
defaultValue = "true",
314+
documentationCategory = OptionDocumentationCategory.UNDOCUMENTED,
315+
effectTags = {OptionEffectTag.EXECUTION},
316+
help = "This option is deprecated and has no effect.")
317+
@Deprecated
318+
public boolean useWorkersWithDexbuilder;
310319
}
311320

312321
/** This is where deprecated Bazel-specific options only used by the build command go to die. */

src/main/java/com/google/devtools/build/lib/rules/android/AndroidConfiguration.java

Lines changed: 53 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
import com.google.devtools.common.options.OptionEffectTag;
4040
import com.google.devtools.common.options.OptionMetadataTag;
4141
import java.util.List;
42+
import java.util.Locale;
4243
import javax.annotation.Nullable;
4344
import net.starlark.java.eval.StarlarkValue;
4445

@@ -163,11 +164,11 @@ public enum AndroidManifestMerger {
163164
ANDROID,
164165
FORCE_ANDROID;
165166

166-
public static List<String> getAttributeValues() {
167+
public static ImmutableList<String> getAttributeValues() {
167168
return ImmutableList.of(
168-
LEGACY.name().toLowerCase(),
169-
ANDROID.name().toLowerCase(),
170-
FORCE_ANDROID.name().toLowerCase(),
169+
LEGACY.name().toLowerCase(Locale.ROOT),
170+
ANDROID.name().toLowerCase(Locale.ROOT),
171+
FORCE_ANDROID.name().toLowerCase(Locale.ROOT),
171172
getRuleAttributeDefault());
172173
}
173174

@@ -533,14 +534,6 @@ public static class Options extends FragmentOptions {
533534
help = "dx flags supported in tool that groups classes for inclusion in final .dex files.")
534535
public List<String> dexoptsSupportedInDexSharder;
535536

536-
@Option(
537-
name = "use_workers_with_dexbuilder",
538-
defaultValue = "true",
539-
documentationCategory = OptionDocumentationCategory.UNDOCUMENTED,
540-
effectTags = {OptionEffectTag.EXECUTION},
541-
help = "Whether dexbuilder supports being run in local worker mode.")
542-
public boolean useWorkersWithDexbuilder;
543-
544537
@Option(
545538
name = "experimental_android_rewrite_dexes_with_rex",
546539
defaultValue = "false",
@@ -905,10 +898,11 @@ public static class Options extends FragmentOptions {
905898
},
906899
help = "Enable persistent Android dex and desugar actions by using workers.",
907900
expansion = {
901+
"--internal_persistent_android_dex_desugar",
908902
"--strategy=Desugar=worker",
909903
"--strategy=DexBuilder=worker",
910904
})
911-
public Void persistentDexDesugar;
905+
public Void persistentAndroidDexDesugar;
912906

913907
@Option(
914908
name = "persistent_multiplex_android_dex_desugar",
@@ -921,10 +915,9 @@ public static class Options extends FragmentOptions {
921915
help = "Enable persistent multiplexed Android dex and desugar actions by using workers.",
922916
expansion = {
923917
"--persistent_android_dex_desugar",
924-
"--modify_execution_info=Desugar=+supports-multiplex-workers",
925-
"--modify_execution_info=DexBuilder=+supports-multiplex-workers",
918+
"--internal_persistent_multiplex_android_dex_desugar",
926919
})
927-
public Void persistentMultiplexDexDesugar;
920+
public Void persistentMultiplexAndroidDexDesugar;
928921

929922
@Option(
930923
name = "persistent_multiplex_android_tools",
@@ -974,6 +967,36 @@ public static class Options extends FragmentOptions {
974967
help = "Tracking flag for when multiplexed busybox workers are enabled.")
975968
public boolean persistentMultiplexBusyboxTools;
976969

970+
/**
971+
* We use this option to decide when to enable workers for busybox tools. This flag is also a
972+
* guard against enabling workers using nothing but --persistent_android_resource_processor.
973+
*
974+
* <p>Consequently, we use this option to decide between param files or regular command line
975+
* parameters. If we're not using workers or on Windows, there's no need to always use param
976+
* files for I/O performance reasons.
977+
*/
978+
@Option(
979+
name = "internal_persistent_android_dex_desugar",
980+
documentationCategory = OptionDocumentationCategory.UNDOCUMENTED,
981+
effectTags = {
982+
OptionEffectTag.HOST_MACHINE_RESOURCE_OPTIMIZATIONS,
983+
OptionEffectTag.EXECUTION,
984+
},
985+
defaultValue = "false",
986+
help = "Tracking flag for when dexing and desugaring workers are enabled.")
987+
public boolean persistentDexDesugar;
988+
989+
@Option(
990+
name = "internal_persistent_multiplex_android_dex_desugar",
991+
documentationCategory = OptionDocumentationCategory.UNDOCUMENTED,
992+
effectTags = {
993+
OptionEffectTag.HOST_MACHINE_RESOURCE_OPTIMIZATIONS,
994+
OptionEffectTag.EXECUTION,
995+
},
996+
defaultValue = "false",
997+
help = "Tracking flag for when multiplexed dexing and desugaring workers are enabled.")
998+
public boolean persistentMultiplexDexDesugar;
999+
9771000
@Option(
9781001
name = "experimental_remove_r_classes_from_instrumentation_test_jar",
9791002
defaultValue = "true",
@@ -1100,7 +1123,6 @@ public FragmentOptions getExec() {
11001123
exec.dexoptsSupportedInIncrementalDexing = dexoptsSupportedInIncrementalDexing;
11011124
exec.dexoptsSupportedInDexMerger = dexoptsSupportedInDexMerger;
11021125
exec.dexoptsSupportedInDexSharder = dexoptsSupportedInDexSharder;
1103-
exec.useWorkersWithDexbuilder = useWorkersWithDexbuilder;
11041126
exec.manifestMerger = manifestMerger;
11051127
exec.manifestMergerOrder = manifestMergerOrder;
11061128
exec.allowAndroidLibraryDepsWithoutSrcs = allowAndroidLibraryDepsWithoutSrcs;
@@ -1128,7 +1150,6 @@ public FragmentOptions getExec() {
11281150
private final ImmutableList<String> targetDexoptsThatPreventIncrementalDexing;
11291151
private final ImmutableList<String> dexoptsSupportedInDexMerger;
11301152
private final ImmutableList<String> dexoptsSupportedInDexSharder;
1131-
private final boolean useWorkersWithDexbuilder;
11321153
private final boolean desugarJava8;
11331154
private final boolean desugarJava8Libs;
11341155
private final boolean checkDesugarDeps;
@@ -1155,6 +1176,8 @@ public FragmentOptions getExec() {
11551176
private final boolean dataBindingAndroidX;
11561177
private final boolean persistentBusyboxTools;
11571178
private final boolean persistentMultiplexBusyboxTools;
1179+
private final boolean persistentDexDesugar;
1180+
private final boolean persistentMultiplexDexDesugar;
11581181
private final boolean filterRJarsFromAndroidTest;
11591182
private final boolean removeRClassesFromInstrumentationTestJar;
11601183
private final boolean alwaysFilterDuplicateClassesFromAndroidTest;
@@ -1184,7 +1207,6 @@ public AndroidConfiguration(BuildOptions buildOptions) throws InvalidConfigurati
11841207
ImmutableList.copyOf(options.nonIncrementalPerTargetDexopts);
11851208
this.dexoptsSupportedInDexMerger = ImmutableList.copyOf(options.dexoptsSupportedInDexMerger);
11861209
this.dexoptsSupportedInDexSharder = ImmutableList.copyOf(options.dexoptsSupportedInDexSharder);
1187-
this.useWorkersWithDexbuilder = options.useWorkersWithDexbuilder;
11881210
this.desugarJava8 = options.desugarJava8;
11891211
this.desugarJava8Libs = options.desugarJava8Libs;
11901212
this.checkDesugarDeps = options.checkDesugarDeps;
@@ -1216,6 +1238,8 @@ public AndroidConfiguration(BuildOptions buildOptions) throws InvalidConfigurati
12161238
this.dataBindingAndroidX = options.dataBindingAndroidX;
12171239
this.persistentBusyboxTools = options.persistentBusyboxTools;
12181240
this.persistentMultiplexBusyboxTools = options.persistentMultiplexBusyboxTools;
1241+
this.persistentDexDesugar = options.persistentDexDesugar;
1242+
this.persistentMultiplexDexDesugar = options.persistentMultiplexDexDesugar;
12191243
this.filterRJarsFromAndroidTest = options.filterRJarsFromAndroidTest;
12201244
this.removeRClassesFromInstrumentationTestJar =
12211245
options.removeRClassesFromInstrumentationTestJar;
@@ -1319,12 +1343,6 @@ public ImmutableList<String> getTargetDexoptsThatPreventIncrementalDexing() {
13191343
return targetDexoptsThatPreventIncrementalDexing;
13201344
}
13211345

1322-
/** Whether to assume the dexbuilder tool supports local worker mode. */
1323-
@Override
1324-
public boolean useWorkersWithDexbuilder() {
1325-
return useWorkersWithDexbuilder;
1326-
}
1327-
13281346
@Override
13291347
public boolean desugarJava8() {
13301348
return desugarJava8;
@@ -1473,6 +1491,16 @@ public boolean persistentMultiplexBusyboxTools() {
14731491
return persistentMultiplexBusyboxTools;
14741492
}
14751493

1494+
@Override
1495+
public boolean persistentDexDesugar() {
1496+
return persistentDexDesugar;
1497+
}
1498+
1499+
@Override
1500+
public boolean persistentMultiplexDexDesugar() {
1501+
return persistentMultiplexDexDesugar;
1502+
}
1503+
14761504
@Override
14771505
public boolean incompatibleUseToolchainResolution() {
14781506
return incompatibleUseToolchainResolution;

src/main/java/com/google/devtools/build/lib/rules/android/DexArchiveAspect.java

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import com.google.common.base.Predicate;
2929
import com.google.common.base.Predicates;
3030
import com.google.common.collect.ImmutableList;
31+
import com.google.common.collect.ImmutableMap;
3132
import com.google.common.collect.ImmutableSet;
3233
import com.google.common.collect.Iterables;
3334
import com.google.common.collect.Sets;
@@ -536,7 +537,10 @@ private static Artifact createDesugarAction(
536537
.addOutput(result)
537538
.setMnemonic("Desugar")
538539
.setProgressMessage("Desugaring %s for Android", jar.prettyPrint())
539-
.setExecutionInfo(ExecutionRequirements.WORKER_MODE_ENABLED);
540+
.setExecutionInfo(
541+
createDexingDesugaringExecRequirements(ruleContext)
542+
.putAll(ExecutionRequirements.WORKER_MODE_ENABLED)
543+
.buildKeepingLast());
540544

541545
// SpawnAction.Builder.build() is documented as being safe for re-use. So we can call build here
542546
// to get the action's inputs for vetting path stripping safety, then call it again later to
@@ -628,8 +632,11 @@ static Artifact createDexArchiveAction(
628632
.useDefaultShellEnvironment()
629633
.setExecutable(ruleContext.getExecutablePrerequisite(dexbuilderPrereq))
630634
.setExecutionInfo(
631-
TargetUtils.getExecutionInfo(
632-
ruleContext.getRule(), ruleContext.isAllowTagsPropagation()))
635+
createDexingDesugaringExecRequirements(ruleContext)
636+
.putAll(
637+
TargetUtils.getExecutionInfo(
638+
ruleContext.getRule(), ruleContext.isAllowTagsPropagation()))
639+
.buildKeepingLast())
633640
// WorkerSpawnStrategy expects the last argument to be @paramfile
634641
.addInput(jar)
635642
.addOutput(dexArchive)
@@ -658,9 +665,6 @@ static Artifact createDexArchiveAction(
658665
dexbuilder
659666
.addCommandLine(args.build(), ParamFileInfo.builder(UNQUOTED).setUseAlways(true).build())
660667
.stripOutputPaths(stripOutputPaths);
661-
if (getAndroidConfig(ruleContext).useWorkersWithDexbuilder()) {
662-
dexbuilder.setExecutionInfo(ExecutionRequirements.WORKER_MODE_ENABLED);
663-
}
664668
ruleContext.registerAction(dexbuilder.build(ruleContext));
665669
return dexArchive;
666670
}
@@ -670,6 +674,21 @@ private static Set<Set<String>> aspectDexopts(RuleContext ruleContext) {
670674
normalizeDexopts(getAndroidConfig(ruleContext).getDexoptsSupportedInIncrementalDexing()));
671675
}
672676

677+
/** Creates the execution requires for the DexBuilder and Desugar actions */
678+
private static ImmutableMap.Builder<String, String> createDexingDesugaringExecRequirements(
679+
RuleContext ruleContext) {
680+
final ImmutableMap.Builder<String, String> executionInfo = ImmutableMap.builder();
681+
AndroidConfiguration androidConfiguration = getAndroidConfig(ruleContext);
682+
if (androidConfiguration.persistentDexDesugar()) {
683+
executionInfo.putAll(ExecutionRequirements.WORKER_MODE_ENABLED);
684+
if (androidConfiguration.persistentMultiplexDexDesugar()) {
685+
executionInfo.putAll(ExecutionRequirements.WORKER_MULTIPLEX_MODE_ENABLED);
686+
}
687+
}
688+
689+
return executionInfo;
690+
}
691+
673692
/**
674693
* Derives options to use in incremental dexing actions from the given context and dx flags, where
675694
* the latter typically come from a {@code dexopts} attribute on a top-level target. This method

src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidConfigurationApi.java

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -94,13 +94,6 @@ public interface AndroidConfigurationApi extends StarlarkValue {
9494
documented = false)
9595
ImmutableList<String> getTargetDexoptsThatPreventIncrementalDexing();
9696

97-
@StarlarkMethod(
98-
name = "use_workers_with_dexbuilder",
99-
structField = true,
100-
doc = "",
101-
documented = false)
102-
boolean useWorkersWithDexbuilder();
103-
10497
@StarlarkMethod(name = "desugar_java8", structField = true, doc = "", documented = false)
10598
boolean desugarJava8();
10699

@@ -238,6 +231,20 @@ public interface AndroidConfigurationApi extends StarlarkValue {
238231
documented = false)
239232
boolean persistentMultiplexBusyboxTools();
240233

234+
@StarlarkMethod(
235+
name = "persistent_android_dex_desugar",
236+
structField = true,
237+
doc = "",
238+
documented = false)
239+
boolean persistentDexDesugar();
240+
241+
@StarlarkMethod(
242+
name = "persistent_multiplex_android_dex_desugar",
243+
structField = true,
244+
doc = "",
245+
documented = false)
246+
boolean persistentMultiplexDexDesugar();
247+
241248
@StarlarkMethod(
242249
name = "get_output_directory_name",
243250
structField = true,

src/test/shell/bazel/android/desugarer_integration_test.sh

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -124,10 +124,24 @@ function test_java_8_android_binary_worker_strategy() {
124124
setup_android_sdk_support
125125
create_java_8_android_binary
126126

127-
bazel build \
128-
--strategy=Desugar=worker \
129-
--desugar_for_android //java/bazel:bin \
130-
|| fail "build failed"
127+
assert_build //java/bazel:bin \
128+
--persistent_android_dex_desugar \
129+
--worker_verbose &> $TEST_log
130+
expect_log "Created new non-sandboxed Desugar worker (id [0-9]\+)"
131+
expect_log "Created new non-sandboxed DexBuilder worker (id [0-9]\+)"
132+
}
133+
134+
function test_java_8_android_binary_multiplex_worker_strategy() {
135+
create_new_workspace
136+
setup_android_sdk_support
137+
create_java_8_android_binary
138+
139+
assert_build //java/bazel:bin \
140+
--experimental_worker_multiplex \
141+
--persistent_multiplex_android_dex_desugar \
142+
--worker_verbose &> $TEST_log
143+
expect_log "Created new non-sandboxed Desugar multiplex-worker (id [0-9]\+)"
144+
expect_log "Created new non-sandboxed DexBuilder multiplex-worker (id [0-9]\+)"
131145
}
132146

133147
run_suite "Android desugarer integration tests"

tools/android/BUILD.tools

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,6 @@ java_binary(
4747
runtime_deps = ["//src/tools/android/java/com/google/devtools/build/android/r8"],
4848
)
4949

50-
# NOTE: d8 dex builder doesn't support the persistent worker mode at the moment. To use this config,
51-
# without a build error, --nouse_workers_with_dexbuilder flag must also be specified.
5250
config_setting(
5351
name = "d8_incremental_dexing",
5452
values = {

0 commit comments

Comments
 (0)