Skip to content

Commit 8f927d2

Browse files
nkorostecopybara-github
authored andcommitted
Propagate tags for the AndroidBinary actions
Tags are not propagated from targets to actions for Android rules. #8830 This PR adds basic propagation of tags from the android_binary target it's actions. Testing with aquery with the Android repo: ``` bazel aquery 'mnemonic(RClassGenerator, //apps/foo)' bazel aquery 'mnemonic(JavaDeployJar, //apps/foo)' bazel aquery 'mnemonic(ApkBuilder, //apps/foo)' ``` Closes #13093. PiperOrigin-RevId: 360836954
1 parent 35de1e3 commit 8f927d2

File tree

6 files changed

+72
-21
lines changed

6 files changed

+72
-21
lines changed

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

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@
6262
import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
6363
import com.google.devtools.build.lib.packages.BuildType;
6464
import com.google.devtools.build.lib.packages.RuleClass;
65+
import com.google.devtools.build.lib.packages.TargetUtils;
6566
import com.google.devtools.build.lib.packages.TriState;
6667
import com.google.devtools.build.lib.packages.Type;
6768
import com.google.devtools.build.lib.rules.android.AndroidBinaryMobileInstall.MobileInstallResourceApks;
@@ -527,7 +528,7 @@ public static RuleConfiguredTargetBuilder createAndroidBinary(
527528
java8LegacyDex = getDxArtifact(ruleContext, "_java8_legacy.dex.zip");
528529
Artifact androidJar = AndroidSdkProvider.fromRuleContext(ruleContext).getAndroidJar();
529530
ruleContext.registerAction(
530-
new SpawnAction.Builder()
531+
createSpawnActionBuilder(ruleContext)
531532
.setExecutable(ruleContext.getExecutablePrerequisite("$build_java8_legacy_dex"))
532533
.addInput(jarToDex)
533534
.addInput(androidJar)
@@ -546,7 +547,7 @@ public static RuleConfiguredTargetBuilder createAndroidBinary(
546547
// Append legacy .dex library to app's .dex files
547548
finalClassesDex = getDxArtifact(ruleContext, "_final_classes.dex.zip");
548549
ruleContext.registerAction(
549-
new SpawnAction.Builder()
550+
createSpawnActionBuilder(ruleContext)
550551
.useDefaultShellEnvironment()
551552
.setMnemonic("AppendJava8LegacyDex")
552553
.setProgressMessage("Adding Java 8 legacy library for %s", ruleContext.getLabel())
@@ -624,7 +625,7 @@ public static RuleConfiguredTargetBuilder createAndroidBinary(
624625
AndroidRuleClasses.INSTRUMENTATION_TEST_CHECK_RESULTS);
625626

626627
SpawnAction.Builder checkAction =
627-
new SpawnAction.Builder()
628+
createSpawnActionBuilder(ruleContext)
628629
.setExecutable(checker)
629630
.addInput(targetManifest)
630631
.addInput(instrumentationManifest)
@@ -1186,7 +1187,7 @@ private static DexingOutput dex(
11861187
.addExecPath("--output_zip", classesDex)
11871188
.build();
11881189
ruleContext.registerAction(
1189-
new SpawnAction.Builder()
1190+
createSpawnActionBuilder(ruleContext)
11901191
.useDefaultShellEnvironment()
11911192
.setMnemonic("MergeDexZips")
11921193
.setProgressMessage("Merging dex shards for %s", ruleContext.getLabel())
@@ -1401,7 +1402,7 @@ private static SpecialArtifact createSharderAction(
14011402
ruleContext.getUniqueDirectory("dexsplits"), ruleContext.getBinOrGenfilesDirectory());
14021403

14031404
SpawnAction.Builder shardAction =
1404-
new SpawnAction.Builder()
1405+
createSpawnActionBuilder(ruleContext)
14051406
.useDefaultShellEnvironment()
14061407
.setMnemonic("ShardForMultidex")
14071408
.setProgressMessage(
@@ -1513,7 +1514,7 @@ private static void createDexMergerAction(
15131514
@Nullable Artifact mainDexList,
15141515
Collection<String> dexopts) {
15151516
SpawnAction.Builder dexmerger =
1516-
new SpawnAction.Builder()
1517+
createSpawnActionBuilder(ruleContext)
15171518
.useDefaultShellEnvironment()
15181519
.setExecutable(ruleContext.getExecutablePrerequisite("$dexmerger"))
15191520
.setMnemonic("DexMerger")
@@ -1651,7 +1652,7 @@ private static Artifact createShuffleJarActions(
16511652
}
16521653

16531654
SpawnAction.Builder shardAction =
1654-
new SpawnAction.Builder()
1655+
createSpawnActionBuilder(ruleContext)
16551656
.useDefaultShellEnvironment()
16561657
.setMnemonic("ShardClassesToDex")
16571658
.setProgressMessage("Sharding classes for dexing for %s", ruleContext.getLabel())
@@ -1753,10 +1754,19 @@ private static ImmutableList<Artifact> toDexedClasspath(
17531754
return dexedClasspath.build();
17541755
}
17551756

1757+
/** Adds execution info by propagating tags from the target */
1758+
private static SpawnAction.Builder createSpawnActionBuilder(RuleContext ruleContext) {
1759+
return new SpawnAction.Builder()
1760+
.setExecutionInfo(
1761+
TargetUtils.getExecutionInfo(
1762+
ruleContext.getRule(), ruleContext.isAllowTagsPropagation()));
1763+
}
1764+
17561765
// Adds the appropriate SpawnAction options depending on if SingleJar is a jar or not.
17571766
private static SpawnAction.Builder singleJarSpawnActionBuilder(RuleContext ruleContext) {
17581767
Artifact singleJar = JavaToolchainProvider.from(ruleContext).getSingleJar();
1759-
SpawnAction.Builder builder = new SpawnAction.Builder().useDefaultShellEnvironment();
1768+
SpawnAction.Builder builder =
1769+
createSpawnActionBuilder(ruleContext).useDefaultShellEnvironment();
17601770
if (singleJar.getFilename().endsWith(".jar")) {
17611771
builder
17621772
.setJarExecutable(
@@ -1834,7 +1844,7 @@ static Artifact createMainDexListAction(
18341844
// Process the input jar through Proguard into an intermediate, streamlined jar.
18351845
Artifact strippedJar = AndroidBinary.getDxArtifact(ruleContext, "main_dex_intermediate.jar");
18361846
SpawnAction.Builder streamlinedBuilder =
1837-
new SpawnAction.Builder()
1847+
createSpawnActionBuilder(ruleContext)
18381848
.useDefaultShellEnvironment()
18391849
.addOutput(strippedJar)
18401850
.setExecutable(sdk.getProguard())
@@ -1865,7 +1875,7 @@ static Artifact createMainDexListAction(
18651875
ruleContext.registerAction(streamlinedBuilder.build(ruleContext));
18661876

18671877
SpawnAction.Builder builder =
1868-
new SpawnAction.Builder()
1878+
createSpawnActionBuilder(ruleContext)
18691879
.setMnemonic("MainDexClasses")
18701880
.setProgressMessage("Generating main dex classes list");
18711881

@@ -1890,7 +1900,7 @@ static Artifact createMainDexListAction(
18901900
} else {
18911901
// Use the newer legacy multidex main-dex list generation.
18921902
SpawnAction.Builder actionBuilder =
1893-
new SpawnAction.Builder()
1903+
createSpawnActionBuilder(ruleContext)
18941904
.setMnemonic("MainDexClasses")
18951905
.setProgressMessage("Generating main dex classes list");
18961906

@@ -1939,7 +1949,7 @@ static Artifact transformDexListThroughProguardMapAction(
19391949
Artifact obfuscatedMainDexList =
19401950
AndroidBinary.getDxArtifact(ruleContext, "main_dex_list_obfuscated.txt");
19411951
SpawnAction.Builder actionBuilder =
1942-
new SpawnAction.Builder()
1952+
createSpawnActionBuilder(ruleContext)
19431953
.setMnemonic("MainDexProguardClasses")
19441954
.setProgressMessage("Obfuscating main dex classes list")
19451955
.setExecutable(ruleContext.getExecutablePrerequisite("$dex_list_obfuscator"))

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

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515

1616
import static com.google.devtools.build.lib.analysis.config.CompilationMode.OPT;
1717

18+
import com.google.common.collect.ImmutableMap;
1819
import com.google.devtools.build.lib.actions.ActionAnalysisMetadata;
1920
import com.google.devtools.build.lib.actions.Artifact;
2021
import com.google.devtools.build.lib.actions.ArtifactRoot;
@@ -27,6 +28,7 @@
2728
import com.google.devtools.build.lib.cmdline.Label;
2829
import com.google.devtools.build.lib.packages.BuildType;
2930
import com.google.devtools.build.lib.packages.ImplicitOutputsFunction.SafeImplicitOutputsFunction;
31+
import com.google.devtools.build.lib.packages.TargetUtils;
3032
import com.google.devtools.build.lib.packages.TriState;
3133
import com.google.devtools.build.lib.starlarkbuildapi.android.AndroidDataContextApi;
3234
import com.google.devtools.build.lib.vfs.PathFragment;
@@ -69,6 +71,7 @@ public class AndroidDataContext implements AndroidDataContextApi {
6971
private final boolean throwOnResourceConflict;
7072
private final boolean useDataBindingV2;
7173
private final boolean useDataBindingAndroidX;
74+
private final ImmutableMap<String, String> executionInfo;
7275

7376
public static AndroidDataContext forNative(RuleContext ruleContext) {
7477
return makeContext(ruleContext);
@@ -78,6 +81,9 @@ public static AndroidDataContext makeContext(RuleContext ruleContext) {
7881
AndroidConfiguration androidConfig =
7982
ruleContext.getConfiguration().getFragment(AndroidConfiguration.class);
8083

84+
ImmutableMap<String, String> executionInfo =
85+
TargetUtils.getExecutionInfo(ruleContext.getRule(), ruleContext.isAllowTagsPropagation());
86+
8187
return new AndroidDataContext(
8288
ruleContext,
8389
ruleContext.getExecutablePrerequisite("$android_resources_busybox"),
@@ -90,7 +96,8 @@ public static AndroidDataContext makeContext(RuleContext ruleContext) {
9096
!hasExemption(ruleContext, "allow_proguard_apply_mapping", true),
9197
!hasExemption(ruleContext, "allow_resource_conflicts", true),
9298
androidConfig.useDataBindingV2(),
93-
androidConfig.useDataBindingAndroidX());
99+
androidConfig.useDataBindingAndroidX(),
100+
executionInfo);
94101
}
95102

96103
private static boolean hasExemption(
@@ -112,7 +119,8 @@ protected AndroidDataContext(
112119
boolean throwOnProguardApplyMapping,
113120
boolean throwOnResourceConflict,
114121
boolean useDataBindingV2,
115-
boolean useDataBindingAndroidX) {
122+
boolean useDataBindingAndroidX,
123+
ImmutableMap<String, String> executionInfo) {
116124
this.persistentBusyboxToolsEnabled = persistentBusyboxToolsEnabled;
117125
this.ruleContext = ruleContext;
118126
this.busybox = busybox;
@@ -125,6 +133,7 @@ protected AndroidDataContext(
125133
this.throwOnResourceConflict = throwOnResourceConflict;
126134
this.useDataBindingV2 = useDataBindingV2;
127135
this.useDataBindingAndroidX = useDataBindingAndroidX;
136+
this.executionInfo = executionInfo;
128137
}
129138

130139
public Label getLabel() {
@@ -147,6 +156,10 @@ public AndroidSdkProvider getSdk() {
147156
return sdk;
148157
}
149158

159+
public ImmutableMap<String, String> getExecutionInfo() {
160+
return executionInfo;
161+
}
162+
150163
/*
151164
* Convenience methods. These are just slightly cleaner ways of doing common tasks.
152165
*/

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

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import com.google.devtools.build.lib.analysis.RuleContext;
2121
import com.google.devtools.build.lib.analysis.actions.CustomCommandLine;
2222
import com.google.devtools.build.lib.analysis.actions.SpawnAction;
23+
import com.google.devtools.build.lib.packages.TargetUtils;
2324
import com.google.devtools.build.lib.packages.Type;
2425
import com.google.devtools.build.lib.rules.android.AndroidConfiguration.ApkSigningMethod;
2526
import com.google.devtools.build.lib.rules.java.JavaCommon;
@@ -179,7 +180,7 @@ private void buildApk(RuleContext ruleContext, Artifact outApk) {
179180
Artifact compressedApk = getApkArtifact(ruleContext, "compressed_" + outApk.getFilename());
180181

181182
SpawnAction.Builder compressedApkActionBuilder =
182-
new SpawnAction.Builder()
183+
createSpawnActionBuilder(ruleContext)
183184
.setMnemonic("ApkBuilder")
184185
.setProgressMessage("Generating unsigned %s", apkName)
185186
.addOutput(compressedApk);
@@ -219,7 +220,7 @@ private void buildApk(RuleContext ruleContext, Artifact outApk) {
219220
}
220221

221222
SpawnAction.Builder singleJarActionBuilder =
222-
new SpawnAction.Builder()
223+
createSpawnActionBuilder(ruleContext)
223224
.setMnemonic("ApkBuilder")
224225
.setProgressMessage("Generating unsigned %s", apkName)
225226
.addInput(compressedApk)
@@ -238,7 +239,7 @@ private void buildApk(RuleContext ruleContext, Artifact outApk) {
238239
Artifact extractedJavaResourceZip =
239240
getApkArtifact(ruleContext, "extracted_" + javaResourceZip.getFilename());
240241
ruleContext.registerAction(
241-
new SpawnAction.Builder()
242+
createSpawnActionBuilder(ruleContext)
242243
.setExecutable(resourceExtractor)
243244
.setMnemonic("ResourceExtractor")
244245
.setProgressMessage("Extracting Java resources from deploy jar for %s", apkName)
@@ -300,7 +301,7 @@ private void buildApk(RuleContext ruleContext, Artifact outApk) {
300301
/** Uses the zipalign tool to align the zip boundaries for uncompressed resources by 4 bytes. */
301302
private void zipalignApk(RuleContext ruleContext, Artifact inputApk, Artifact zipAlignedApk) {
302303
ruleContext.registerAction(
303-
new SpawnAction.Builder()
304+
createSpawnActionBuilder(ruleContext)
304305
.addInput(inputApk)
305306
.addOutput(zipAlignedApk)
306307
.setExecutable(AndroidSdkProvider.fromRuleContext(ruleContext).getZipalign())
@@ -328,7 +329,7 @@ private void signApk(
328329
ApkSigningMethod signingMethod =
329330
ruleContext.getFragment(AndroidConfiguration.class).getApkSigningMethod();
330331
SpawnAction.Builder actionBuilder =
331-
new SpawnAction.Builder()
332+
createSpawnActionBuilder(ruleContext)
332333
.setExecutable(AndroidSdkProvider.fromRuleContext(ruleContext).getApkSigner())
333334
.setProgressMessage("Signing %s", apkName)
334335
.setMnemonic("ApkSignerTool")
@@ -386,4 +387,12 @@ private Artifact getApkArtifact(RuleContext ruleContext, String baseName) {
386387
return AndroidBinary.getDxArtifact(ruleContext, baseName);
387388
}
388389
}
390+
391+
/** Adds execution info by propagating tags from the target */
392+
private static SpawnAction.Builder createSpawnActionBuilder(RuleContext ruleContext) {
393+
return new SpawnAction.Builder()
394+
.setExecutionInfo(
395+
TargetUtils.getExecutionInfo(
396+
ruleContext.getRule(), ruleContext.isAllowTagsPropagation()));
397+
}
389398
}

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

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515

1616
import com.google.common.base.Preconditions;
1717
import com.google.common.collect.ImmutableList;
18+
import com.google.common.collect.ImmutableMap;
1819
import com.google.devtools.build.lib.actions.Artifact;
1920
import com.google.devtools.build.lib.actions.ExecutionRequirements;
2021
import com.google.devtools.build.lib.actions.ParamFileInfo;
@@ -338,15 +339,21 @@ public void buildAndRegister(String message, String mnemonic) {
338339
.setProgressMessage("%s for %s", message, dataContext.getLabel())
339340
.setMnemonic(mnemonic);
340341

342+
ImmutableMap.Builder<String, String> executionInfo = ImmutableMap.builder();
343+
executionInfo.putAll(dataContext.getExecutionInfo());
344+
341345
if (dataContext.isPersistentBusyboxToolsEnabled()) {
342346
commandLine.add("--logWarnings=false");
343347
spawnActionBuilder
344-
.setExecutionInfo(ExecutionRequirements.WORKER_MODE_ENABLED)
345348
.addCommandLine(commandLine.build(), WORKERS_FORCED_PARAM_FILE_INFO);
349+
350+
executionInfo.putAll(ExecutionRequirements.WORKER_MODE_ENABLED);
346351
} else {
347352
spawnActionBuilder.addCommandLine(commandLine.build(), FORCED_PARAM_FILE_INFO);
348353
}
349354

355+
spawnActionBuilder.setExecutionInfo(executionInfo.build());
356+
350357
dataContext.registerAction(spawnActionBuilder);
351358
}
352359
}

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@
5555
import com.google.devtools.build.lib.packages.NativeAspectClass;
5656
import com.google.devtools.build.lib.packages.NonconfigurableAttributeMapper;
5757
import com.google.devtools.build.lib.packages.Rule;
58+
import com.google.devtools.build.lib.packages.TargetUtils;
5859
import com.google.devtools.build.lib.packages.TriState;
5960
import com.google.devtools.build.lib.rules.java.JavaCommon;
6061
import com.google.devtools.build.lib.rules.java.JavaCompilationArgsProvider;
@@ -504,6 +505,9 @@ static Artifact createDexArchiveAction(
504505
new SpawnAction.Builder()
505506
.useDefaultShellEnvironment()
506507
.setExecutable(ruleContext.getExecutablePrerequisite(dexbuilderPrereq))
508+
.setExecutionInfo(
509+
TargetUtils.getExecutionInfo(
510+
ruleContext.getRule(), ruleContext.isAllowTagsPropagation()))
507511
// WorkerSpawnStrategy expects the last argument to be @paramfile
508512
.addInput(jar)
509513
.addOutput(dexArchive)

src/main/java/com/google/devtools/build/lib/rules/java/DeployArchiveBuilder.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import com.google.common.base.Function;
1919
import com.google.common.base.Preconditions;
2020
import com.google.common.collect.ImmutableList;
21+
import com.google.common.collect.ImmutableMap;
2122
import com.google.common.collect.Iterables;
2223
import com.google.devtools.build.lib.actions.Artifact;
2324
import com.google.devtools.build.lib.actions.CommandLine;
@@ -31,6 +32,7 @@
3132
import com.google.devtools.build.lib.collect.nestedset.NestedSet;
3233
import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
3334
import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException;
35+
import com.google.devtools.build.lib.packages.TargetUtils;
3436
import com.google.devtools.build.lib.rules.cpp.CppHelper;
3537
import com.google.devtools.build.lib.rules.java.JavaConfiguration.OneVersionEnforcementLevel;
3638
import java.util.HashSet;
@@ -381,7 +383,12 @@ public void build() throws InterruptedException {
381383

382384
List<String> jvmArgs = ImmutableList.of(SINGLEJAR_MAX_MEMORY);
383385

386+
ImmutableMap.Builder<String, String> executionInfo = ImmutableMap.builder();
387+
executionInfo.putAll(
388+
TargetUtils.getExecutionInfo(ruleContext.getRule(), ruleContext.isAllowTagsPropagation()));
389+
384390
if (!usingNativeSinglejar) {
391+
executionInfo.putAll(ExecutionRequirements.WORKER_MODE_ENABLED);
385392
ruleContext.registerAction(
386393
new SpawnAction.Builder()
387394
.useDefaultShellEnvironment()
@@ -395,7 +402,7 @@ public void build() throws InterruptedException {
395402
ParamFileInfo.builder(ParameterFileType.SHELL_QUOTED).setUseAlways(true).build())
396403
.setProgressMessage("Building deploy jar %s", outputJar.prettyPrint())
397404
.setMnemonic("JavaDeployJar")
398-
.setExecutionInfo(ExecutionRequirements.WORKER_MODE_ENABLED)
405+
.setExecutionInfo(executionInfo.build())
399406
.build(ruleContext));
400407
} else {
401408
ruleContext.registerAction(
@@ -410,6 +417,7 @@ public void build() throws InterruptedException {
410417
ParamFileInfo.builder(ParameterFileType.SHELL_QUOTED).setUseAlways(true).build())
411418
.setProgressMessage("Building deploy jar %s", outputJar.prettyPrint())
412419
.setMnemonic("JavaDeployJar")
420+
.setExecutionInfo(executionInfo.build())
413421
.build(ruleContext));
414422
}
415423
}

0 commit comments

Comments
 (0)