From 010e13443257a5824cd4c045216bda304a9e3dd8 Mon Sep 17 00:00:00 2001 From: kisabaka <648530+kisabaka@users.noreply.github.com> Date: Fri, 8 May 2026 18:29:28 +0200 Subject: [PATCH 1/3] Add flag to propagate JVM flags to Busybox tools. --- rules/aar_import/attrs.bzl | 4 ++++ rules/busybox.bzl | 14 ++++++++++++-- rules/flags/BUILD | 6 ++++++ 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/rules/aar_import/attrs.bzl b/rules/aar_import/attrs.bzl index 049424902..6eb350840 100644 --- a/rules/aar_import/attrs.bzl +++ b/rules/aar_import/attrs.bzl @@ -63,6 +63,10 @@ ATTRS = _attrs.add( _flags = attr.label( default = "//rules/flags", ), + _jvm_args = attr.label( + default = "//rules/flags:jvm_args", + doc = "Additional flags to pass to the JVM when invoking tools.", + ), _java_toolchain = attr.label( default = Label("//tools/jdk:toolchain_android_only"), ), diff --git a/rules/busybox.bzl b/rules/busybox.bzl index 64f5c8a96..39d110521 100644 --- a/rules/busybox.bzl +++ b/rules/busybox.bzl @@ -14,6 +14,7 @@ """Bazel ResourcesBusyBox Commands.""" load("//rules:visibility.bzl", "PROJECT_VISIBILITY") +load("@bazel_skylib//rules:common_settings.bzl", "BuildSettingInfo") load(":busybox_compat.bzl", "AAPT2_COMPAT_FLAGS") load(":java.bzl", _java = "java") @@ -840,11 +841,20 @@ def _merge_compiled( jvm_flags = _C1_ONLY_FLAGS, ) -def _java_run(ctx, mnemonic = None, *args, **kwargs): +def _java_run(ctx, mnemonic = None, jvm_flags = [], *args, **kwargs): enable_workers = ctx.fragments.android.persistent_busybox_tools multiplex_workers = ctx.fragments.android.persistent_multiplex_busybox_tools - _java.run(ctx, mnemonic = mnemonic, supports_workers = enable_workers, supports_multiplex_workers = multiplex_workers, *args, **kwargs) + extra_jvm_flags = ctx.attr._jvm_args[BuildSettingInfo].value + _java.run( + ctx, + mnemonic = mnemonic, + supports_workers = enable_workers, + supports_multiplex_workers = multiplex_workers, + jvm_flags = jvm_flags + extra_jvm_flags, + *args, + **kwargs + ) def _escape_mv(s): """Escapes `:` and `,` in manifest values so they can be used as a busybox flag.""" diff --git a/rules/flags/BUILD b/rules/flags/BUILD index 479b4844f..45f083cb9 100644 --- a/rules/flags/BUILD +++ b/rules/flags/BUILD @@ -149,6 +149,12 @@ string_list_flag( visibility = ["//visibility:public"], ) +string_list_flag( + name = "jvm_args", + build_setting_default = [], + visibility = ["//visibility:public"], +) + string_list_flag( name = "dexopts_supported_in_dexsharder", build_setting_default = ["--minimal-main-dex"], From 9d727757ae5fc8c6ac1bcab10d0703044c54e96a Mon Sep 17 00:00:00 2001 From: kisabaka <648530+kisabaka@users.noreply.github.com> Date: Fri, 8 May 2026 20:02:47 +0200 Subject: [PATCH 2/3] Try per-mnemonic flags --- rules/aar_import/attrs.bzl | 8 +++++--- rules/flags/BUILD | 2 +- rules/flags/mnemonic_flags.bzl | 10 ++++++++++ rules/java.bzl | 6 ++++++ 4 files changed, 22 insertions(+), 4 deletions(-) create mode 100644 rules/flags/mnemonic_flags.bzl diff --git a/rules/aar_import/attrs.bzl b/rules/aar_import/attrs.bzl index 6eb350840..fc43a3ec2 100644 --- a/rules/aar_import/attrs.bzl +++ b/rules/aar_import/attrs.bzl @@ -63,9 +63,11 @@ ATTRS = _attrs.add( _flags = attr.label( default = "//rules/flags", ), - _jvm_args = attr.label( - default = "//rules/flags:jvm_args", - doc = "Additional flags to pass to the JVM when invoking tools.", + _mnemonic_jvm_flags = attr.label( + default = "//rules/flags:mnemonic_jvm_flags", + doc = "Additional JVM flags to set depending on the mnemonic " + + "E.g --//rules/flags:mnemonic_jvm_flags=CompileAndroidResources=Xms1G " + + " will add -Xms1G to all invocations of the CompileAndroidResources mnemonic", ), _java_toolchain = attr.label( default = Label("//tools/jdk:toolchain_android_only"), diff --git a/rules/flags/BUILD b/rules/flags/BUILD index 45f083cb9..8d5e96102 100644 --- a/rules/flags/BUILD +++ b/rules/flags/BUILD @@ -150,7 +150,7 @@ string_list_flag( ) string_list_flag( - name = "jvm_args", + name = "mnemonic_jvm_flags", build_setting_default = [], visibility = ["//visibility:public"], ) diff --git a/rules/flags/mnemonic_flags.bzl b/rules/flags/mnemonic_flags.bzl new file mode 100644 index 000000000..434aa063e --- /dev/null +++ b/rules/flags/mnemonic_flags.bzl @@ -0,0 +1,10 @@ +load("@bazel_skylib//rules:common_settings.bzl", "BuildSettingInfo") + +def extract_jvm_flags_for_mnemonic(ctx, mnemonic): + flag_values = [] + for value in ctx.attr._mnemonic_jvm_flags[BuildSettingInfo].value: + key, jvm_flag = value.split("=", 1) + if key != mnemonic: + continue + flag_values.append(jvm_flag) + return flag_values diff --git a/rules/java.bzl b/rules/java.bzl index 5259508e1..609a1a94d 100644 --- a/rules/java.bzl +++ b/rules/java.bzl @@ -14,6 +14,7 @@ """Bazel Java APIs for the Android rules.""" load("//rules:visibility.bzl", "PROJECT_VISIBILITY") +load("//rules/flags:mnemonic_flags.bzl", "extract_jvm_flags_for_mnemonic") load("@rules_java//java/common:java_common.bzl", "java_common") load("@rules_java//java/private:android_support.bzl", "android_support") # buildifier: disable=bzl-visibility load(":path.bzl", _path = "path") @@ -466,6 +467,11 @@ def _run( # Can still be overridden by callers of this method. jvm_flags = ["-Xms3G", "-Xmx3G", "-XX:+ExitOnOutOfMemoryError"] + jvm_flags + # Additional JVM flags depending on the mnemonic + if mnemonic and getattr(ctx.attr, "_mnemonic_jvm_flags", None): + extra_jvm_flags = extract_jvm_flags_for_mnemonic(ctx, mnemonic) + jvm_flags += extra_jvm_flags + # executable should be a File or a FilesToRunProvider jar = args.get("executable") if type(jar) == "FilesToRunProvider": From 8585c08db23c75748eb0a27ad0e75caa4a6bf047 Mon Sep 17 00:00:00 2001 From: kisabaka <648530+kisabaka@users.noreply.github.com> Date: Fri, 8 May 2026 21:37:21 +0200 Subject: [PATCH 3/3] Rename flag and make it add up --- rules/aar_import/attrs.bzl | 12 ++++++------ rules/android_library/attrs.bzl | 6 ++++++ rules/busybox.bzl | 1 - rules/flags/BUILD | 13 +++++++------ rules/flags/mnemonic_flags.bzl | 10 +++++++++- rules/java.bzl | 7 ++++--- 6 files changed, 32 insertions(+), 17 deletions(-) diff --git a/rules/aar_import/attrs.bzl b/rules/aar_import/attrs.bzl index fc43a3ec2..e263795d8 100644 --- a/rules/aar_import/attrs.bzl +++ b/rules/aar_import/attrs.bzl @@ -63,12 +63,6 @@ ATTRS = _attrs.add( _flags = attr.label( default = "//rules/flags", ), - _mnemonic_jvm_flags = attr.label( - default = "//rules/flags:mnemonic_jvm_flags", - doc = "Additional JVM flags to set depending on the mnemonic " + - "E.g --//rules/flags:mnemonic_jvm_flags=CompileAndroidResources=Xms1G " + - " will add -Xms1G to all invocations of the CompileAndroidResources mnemonic", - ), _java_toolchain = attr.label( default = Label("//tools/jdk:toolchain_android_only"), ), @@ -79,6 +73,12 @@ ATTRS = _attrs.add( _manifest_merge_order = attr.label( default = "//rules/flags:manifest_merge_order", ), + _mnemonic_jvm_flags = attr.label( + default = "//rules/flags:mnemonic_jvm_flags", + doc = "Additional JVM flags to set depending on the mnemonic " + + "E.g --//rules/flags:mnemonic_jvm_flags=CompileAndroidResources=Xms1G " + + " will add -Xms1G to all invocations of the CompileAndroidResources mnemonic", + ), _cpu_constraints = attr.label_keyed_string_dict( default = { # The keys are labels to constraint_value targets representing the CPU for Android diff --git a/rules/android_library/attrs.bzl b/rules/android_library/attrs.bzl index 00e02137f..98db7ff94 100644 --- a/rules/android_library/attrs.bzl +++ b/rules/android_library/attrs.bzl @@ -179,6 +179,12 @@ ATTRS = _attrs.add( "Add these flags to the AIDL compiler command." ), ), + _mnemonic_jvm_flags = attr.label( + default = "//rules/flags:mnemonic_jvm_flags", + doc = "Additional JVM flags to set depending on the mnemonic " + + "E.g --//rules/flags:mnemonic_jvm_flags=CompileAndroidResources=Xms1G " + + " will add -Xms1G to all invocations of the CompileAndroidResources mnemonic", + ), neverlink = attr.bool( default = False, doc = ( diff --git a/rules/busybox.bzl b/rules/busybox.bzl index 39d110521..16743d0ba 100644 --- a/rules/busybox.bzl +++ b/rules/busybox.bzl @@ -14,7 +14,6 @@ """Bazel ResourcesBusyBox Commands.""" load("//rules:visibility.bzl", "PROJECT_VISIBILITY") -load("@bazel_skylib//rules:common_settings.bzl", "BuildSettingInfo") load(":busybox_compat.bzl", "AAPT2_COMPAT_FLAGS") load(":java.bzl", _java = "java") diff --git a/rules/flags/BUILD b/rules/flags/BUILD index 8d5e96102..4f1cb6731 100644 --- a/rules/flags/BUILD +++ b/rules/flags/BUILD @@ -6,6 +6,7 @@ load("//rules/flags:additional_flags.bzl", "additional_flags") load("//rules/flags:configurations.bzl", "configurations") load("//rules/flags:flag_defs.bzl", "define_flags") load("//rules/flags:flags.bzl", "flags") +load("//rules/flags:mnemonic_flags.bzl", "mnemonic_flag") licenses(["notice"]) @@ -149,12 +150,6 @@ string_list_flag( visibility = ["//visibility:public"], ) -string_list_flag( - name = "mnemonic_jvm_flags", - build_setting_default = [], - visibility = ["//visibility:public"], -) - string_list_flag( name = "dexopts_supported_in_dexsharder", build_setting_default = ["--minimal-main-dex"], @@ -215,6 +210,12 @@ int_flag( visibility = ["//visibility:public"], ) +mnemonic_flag( + name = "mnemonic_jvm_flags", + build_setting_default = "", + visibility = ["//visibility:public"], +) + configurations() define_flags() diff --git a/rules/flags/mnemonic_flags.bzl b/rules/flags/mnemonic_flags.bzl index 434aa063e..056814cf9 100644 --- a/rules/flags/mnemonic_flags.bzl +++ b/rules/flags/mnemonic_flags.bzl @@ -1,6 +1,9 @@ load("@bazel_skylib//rules:common_settings.bzl", "BuildSettingInfo") -def extract_jvm_flags_for_mnemonic(ctx, mnemonic): +def _mnemonic_flag_impl(ctx): + return [BuildSettingInfo(value = ctx.build_setting_value)] + +def extract_values_for_mnemonic(ctx, mnemonic): flag_values = [] for value in ctx.attr._mnemonic_jvm_flags[BuildSettingInfo].value: key, jvm_flag = value.split("=", 1) @@ -8,3 +11,8 @@ def extract_jvm_flags_for_mnemonic(ctx, mnemonic): continue flag_values.append(jvm_flag) return flag_values + +mnemonic_flag = rule( + implementation = _mnemonic_flag_impl, + build_setting = config.string(flag = True, allow_multiple = True) +) \ No newline at end of file diff --git a/rules/java.bzl b/rules/java.bzl index 609a1a94d..1a82d2e2f 100644 --- a/rules/java.bzl +++ b/rules/java.bzl @@ -14,7 +14,7 @@ """Bazel Java APIs for the Android rules.""" load("//rules:visibility.bzl", "PROJECT_VISIBILITY") -load("//rules/flags:mnemonic_flags.bzl", "extract_jvm_flags_for_mnemonic") +load("//rules/flags:mnemonic_flags.bzl", "extract_values_for_mnemonic") load("@rules_java//java/common:java_common.bzl", "java_common") load("@rules_java//java/private:android_support.bzl", "android_support") # buildifier: disable=bzl-visibility load(":path.bzl", _path = "path") @@ -469,8 +469,9 @@ def _run( # Additional JVM flags depending on the mnemonic if mnemonic and getattr(ctx.attr, "_mnemonic_jvm_flags", None): - extra_jvm_flags = extract_jvm_flags_for_mnemonic(ctx, mnemonic) - jvm_flags += extra_jvm_flags + extra_jvm_flags = extract_values_for_mnemonic(ctx, mnemonic) + if extra_jvm_flags: + jvm_flags += extra_jvm_flags # executable should be a File or a FilesToRunProvider jar = args.get("executable")