Skip to content

Commit 7f8d84f

Browse files
committed
Fix worker and multiplex workers for DexBuilder and Desugar actions
1 parent 2d04c91 commit 7f8d84f

File tree

5 files changed

+104
-30
lines changed

5 files changed

+104
-30
lines changed

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

Lines changed: 49 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -905,10 +905,11 @@ public static class Options extends FragmentOptions {
905905
},
906906
help = "Enable persistent Android dex and desugar actions by using workers.",
907907
expansion = {
908+
"--internal_persistent_android_dex_desugar",
908909
"--strategy=Desugar=worker",
909910
"--strategy=DexBuilder=worker",
910911
})
911-
public Void persistentDexDesugar;
912+
public Void persistentAndroidDexDesugar;
912913

913914
@Option(
914915
name = "persistent_multiplex_android_dex_desugar",
@@ -921,10 +922,9 @@ public static class Options extends FragmentOptions {
921922
help = "Enable persistent multiplexed Android dex and desugar actions by using workers.",
922923
expansion = {
923924
"--persistent_android_dex_desugar",
924-
"--modify_execution_info=Desugar=+supports-multiplex-workers",
925-
"--modify_execution_info=DexBuilder=+supports-multiplex-workers",
925+
"--internal_persistent_multiplex_android_dex_desugar",
926926
})
927-
public Void persistentMultiplexDexDesugar;
927+
public Void persistentMultiplexAndroidDexDesugar;
928928

929929
@Option(
930930
name = "persistent_multiplex_android_tools",
@@ -974,6 +974,36 @@ public static class Options extends FragmentOptions {
974974
help = "Tracking flag for when multiplexed busybox workers are enabled.")
975975
public boolean persistentMultiplexBusyboxTools;
976976

977+
/**
978+
* We use this option to decide when to enable workers for busybox tools. This flag is also a
979+
* guard against enabling workers using nothing but --persistent_android_resource_processor.
980+
*
981+
* <p>Consequently, we use this option to decide between param files or regular command line
982+
* parameters. If we're not using workers or on Windows, there's no need to always use param
983+
* files for I/O performance reasons.
984+
*/
985+
@Option(
986+
name = "internal_persistent_android_dex_desugar",
987+
documentationCategory = OptionDocumentationCategory.UNDOCUMENTED,
988+
effectTags = {
989+
OptionEffectTag.HOST_MACHINE_RESOURCE_OPTIMIZATIONS,
990+
OptionEffectTag.EXECUTION,
991+
},
992+
defaultValue = "false",
993+
help = "Tracking flag for when dexing and desugaring workers are enabled.")
994+
public boolean persistentDexDesugar;
995+
996+
@Option(
997+
name = "internal_persistent_multiplex_android_dex_desugar",
998+
documentationCategory = OptionDocumentationCategory.UNDOCUMENTED,
999+
effectTags = {
1000+
OptionEffectTag.HOST_MACHINE_RESOURCE_OPTIMIZATIONS,
1001+
OptionEffectTag.EXECUTION,
1002+
},
1003+
defaultValue = "false",
1004+
help = "Tracking flag for when multiplexed dexing and desugaring workers are enabled.")
1005+
public boolean persistentMultiplexDexDesugar;
1006+
9771007
@Option(
9781008
name = "experimental_remove_r_classes_from_instrumentation_test_jar",
9791009
defaultValue = "true",
@@ -1155,6 +1185,8 @@ public FragmentOptions getHost() {
11551185
private final boolean dataBindingAndroidX;
11561186
private final boolean persistentBusyboxTools;
11571187
private final boolean persistentMultiplexBusyboxTools;
1188+
private final boolean persistentDexDesugar;
1189+
private final boolean persistentMultiplexDexDesugar;
11581190
private final boolean filterRJarsFromAndroidTest;
11591191
private final boolean removeRClassesFromInstrumentationTestJar;
11601192
private final boolean alwaysFilterDuplicateClassesFromAndroidTest;
@@ -1216,6 +1248,8 @@ public AndroidConfiguration(BuildOptions buildOptions) throws InvalidConfigurati
12161248
this.dataBindingAndroidX = options.dataBindingAndroidX;
12171249
this.persistentBusyboxTools = options.persistentBusyboxTools;
12181250
this.persistentMultiplexBusyboxTools = options.persistentMultiplexBusyboxTools;
1251+
this.persistentDexDesugar = options.persistentDexDesugar;
1252+
this.persistentMultiplexDexDesugar = options.persistentMultiplexDexDesugar;
12191253
this.filterRJarsFromAndroidTest = options.filterRJarsFromAndroidTest;
12201254
this.removeRClassesFromInstrumentationTestJar =
12211255
options.removeRClassesFromInstrumentationTestJar;
@@ -1319,12 +1353,6 @@ public ImmutableList<String> getTargetDexoptsThatPreventIncrementalDexing() {
13191353
return targetDexoptsThatPreventIncrementalDexing;
13201354
}
13211355

1322-
/** Whether to assume the dexbuilder tool supports local worker mode. */
1323-
@Override
1324-
public boolean useWorkersWithDexbuilder() {
1325-
return useWorkersWithDexbuilder;
1326-
}
1327-
13281356
@Override
13291357
public boolean desugarJava8() {
13301358
return desugarJava8;
@@ -1473,6 +1501,16 @@ public boolean persistentMultiplexBusyboxTools() {
14731501
return persistentMultiplexBusyboxTools;
14741502
}
14751503

1504+
@Override
1505+
public boolean persistentDexDesugar() {
1506+
return persistentDexDesugar;
1507+
}
1508+
1509+
@Override
1510+
public boolean persistentMultiplexDexDesugar() {
1511+
return persistentMultiplexDexDesugar;
1512+
}
1513+
14761514
@Override
14771515
public boolean incompatibleUseToolchainResolution() {
14781516
return incompatibleUseToolchainResolution;
@@ -1500,6 +1538,7 @@ public boolean alwaysFilterDuplicateClassesFromAndroidTest() {
15001538
return alwaysFilterDuplicateClassesFromAndroidTest;
15011539
}
15021540

1541+
@Override
15031542
public boolean filterLibraryJarWithProgramJar() {
15041543
return filterLibraryJarWithProgramJar;
15051544
}

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

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import com.google.common.base.Joiner;
2828
import com.google.common.base.Predicate;
2929
import com.google.common.base.Predicates;
30+
import com.google.common.collect.ImmutableMap;
3031
import com.google.common.collect.ImmutableList;
3132
import com.google.common.collect.ImmutableSet;
3233
import com.google.common.collect.Iterables;
@@ -526,7 +527,9 @@ private static Artifact createDesugarAction(
526527
.addOutput(result)
527528
.setMnemonic("Desugar")
528529
.setProgressMessage("Desugaring %s for Android", jar.prettyPrint())
529-
.setExecutionInfo(ExecutionRequirements.WORKER_MODE_ENABLED);
530+
.setExecutionInfo(createDexingDesugaringExecRequirements(ruleContext)
531+
.putAll(ExecutionRequirements.WORKER_MODE_ENABLED)
532+
.buildKeepingLast());
530533

531534
// SpawnAction.Builder.build() is documented as being safe for re-use. So we can call build here
532535
// to get the action's inputs for vetting path stripping safety, then call it again later to
@@ -617,9 +620,9 @@ static Artifact createDexArchiveAction(
617620
new SpawnAction.Builder()
618621
.useDefaultShellEnvironment()
619622
.setExecutable(ruleContext.getExecutablePrerequisite(dexbuilderPrereq))
620-
.setExecutionInfo(
621-
TargetUtils.getExecutionInfo(
622-
ruleContext.getRule(), ruleContext.isAllowTagsPropagation()))
623+
.setExecutionInfo(createDexingDesugaringExecRequirements(ruleContext)
624+
.putAll(TargetUtils.getExecutionInfo(ruleContext.getRule(), ruleContext.isAllowTagsPropagation()))
625+
.buildKeepingLast())
623626
// WorkerSpawnStrategy expects the last argument to be @paramfile
624627
.addInput(jar)
625628
.addOutput(dexArchive)
@@ -648,9 +651,6 @@ static Artifact createDexArchiveAction(
648651
dexbuilder
649652
.addCommandLine(args.build(), ParamFileInfo.builder(UNQUOTED).setUseAlways(true).build())
650653
.stripOutputPaths(stripOutputPaths);
651-
if (getAndroidConfig(ruleContext).useWorkersWithDexbuilder()) {
652-
dexbuilder.setExecutionInfo(ExecutionRequirements.WORKER_MODE_ENABLED);
653-
}
654654
ruleContext.registerAction(dexbuilder.build(ruleContext));
655655
return dexArchive;
656656
}
@@ -660,6 +660,22 @@ private static Set<Set<String>> aspectDexopts(RuleContext ruleContext) {
660660
normalizeDexopts(getAndroidConfig(ruleContext).getDexoptsSupportedInIncrementalDexing()));
661661
}
662662

663+
/**
664+
* Creates the execution requires for the DexBuilder and Desugar actions
665+
*/
666+
private static ImmutableMap.Builder<String, String> createDexingDesugaringExecRequirements(RuleContext ruleContext) {
667+
final ImmutableMap.Builder<String, String> executionInfo = ImmutableMap.builder();
668+
AndroidConfiguration androidConfiguration = getAndroidConfig(ruleContext);
669+
if (androidConfiguration.persistentDexDesugar()) {
670+
executionInfo.putAll(ExecutionRequirements.WORKER_MODE_ENABLED);
671+
if (androidConfiguration.persistentMultiplexDexDesugar()) {
672+
executionInfo.putAll(ExecutionRequirements.WORKER_MULTIPLEX_MODE_ENABLED);
673+
}
674+
}
675+
676+
return executionInfo;
677+
}
678+
663679
/**
664680
* Derives options to use in incremental dexing actions from the given context and dx flags, where
665681
* 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)