* `rules/proguard.bzl`: Pass `-whykeepingfile` to the AppReduce `FINAL` optimizer action.
* `rules/android_binary/impl.bzl`: Declare `_proguard.why_keeping` file artifact.
* `rules_android/test/rules/android_binary/BUILD`: Update golden test implicit output assertions.

PiperOrigin-RevId: 975406738
Change-Id: Idb5cfb473311f5e703b27d627ec648dd52785785
diff --git a/rules/android_binary/impl.bzl b/rules/android_binary/impl.bzl
index d71712a..ab79f58 100644
--- a/rules/android_binary/impl.bzl
+++ b/rules/android_binary/impl.bzl
@@ -778,6 +778,7 @@
         proguard_output_config = ctx.actions.declare_file(ctx.label.name + "_proguard.config")
     proguard_seeds = ctx.actions.declare_file(ctx.label.name + "_proguard.seeds")
     proguard_usage = ctx.actions.declare_file(ctx.label.name + "_proguard.usage")
+    proguard_why_keeping_file = ctx.actions.declare_file(ctx.label.name + "_proguard.why_keeping")
 
     startup_profile = None
     baseline_profile = None
@@ -816,6 +817,7 @@
         proguard_output_map = proguard_output_map,
         proguard_seeds = proguard_seeds,
         proguard_usage = proguard_usage,
+        proguard_why_keeping_file = proguard_why_keeping_file,
         startup_profile = startup_profile,
         baseline_profile = baseline_profile,
         resource_files = packaged_resources_ctx.validation_result if enable_rewrite_resources_through_optimizer else None,
@@ -830,6 +832,7 @@
                 proguard_output.config,
                 proguard_output.seeds,
                 proguard_output.usage,
+                proguard_output.why_keeping_file,
             ],
         )
 
diff --git a/rules/proguard.bzl b/rules/proguard.bzl
index 9005755..08146a3 100644
--- a/rules/proguard.bzl
+++ b/rules/proguard.bzl
@@ -182,6 +182,7 @@
         proguard_output_map = None,
         proguard_seeds = None,
         proguard_usage = None,
+        proguard_why_keeping_file = None,
         proguard_config_output = None,
         startup_profile = None,
         startup_profile_rewritten = None,
@@ -222,6 +223,7 @@
         classes and members which match a keep rule.
       proguard_usage: File. Optional file used to write all classes and members that are removed
         during shrinking (i.e. unused code).
+      proguard_why_keeping_file: File. Optional file used to write whyareyoukeeping relationship graph.
       proguard_config_output: File. Optional file used to write the entire configuration that has
         been parsed, included files and replaced variables. Useful for debugging.
       startup_profile: File. Optional. The merged startup profile to be optimized.
@@ -328,6 +330,10 @@
         args.add("-nextstageoutput", next_stage_output)
         outputs.append(next_stage_output)
 
+    if proguard_why_keeping_file:
+        args.add("-whykeepingfile", proguard_why_keeping_file)
+        outputs.append(proguard_why_keeping_file)
+
     ctx.actions.run(
         outputs = outputs,
         inputs = inputs,
@@ -351,7 +357,8 @@
         proguard_output_config = None,
         proguard_output_map = None,
         proguard_seeds = None,
-        proguard_usage = None):
+        proguard_usage = None,
+        proguard_why_keeping_file = None):
     """ Creates empty proguard outputs.
 
     These outputs will fail at execution time when any of them are explicitly requested. This is
@@ -365,6 +372,7 @@
       proguard_output_map: File. The output proguard map.
       proguard_seeds: File. The output proguard seeds.
       proguard_usage: File. The output proguard usage.
+      proguard_why_keeping_file: File. Optional file used to write whyareyoukeeping relationship graph.
 
     Returns:
       A struct of proguard outputs.
@@ -376,6 +384,7 @@
         proguard_output_config = proguard_output_config,
         proguard_seeds = proguard_seeds,
         proguard_usage = proguard_usage,
+        proguard_why_keeping_file = proguard_why_keeping_file,
         proguard_output_map = proguard_output_map,
         combined_library_jar = None,
         startup_profile_rewritten = None,
@@ -393,6 +402,7 @@
         outputs.config,
         outputs.seeds,
         outputs.usage,
+        outputs.why_keeping_file,
     )
     return outputs
 
@@ -407,6 +417,7 @@
         proguard_output_map = None,
         proguard_seeds = None,
         proguard_usage = None,
+        proguard_why_keeping_file = None,
         startup_profile = None,
         baseline_profile = None,
         resource_files = None,
@@ -425,6 +436,7 @@
       proguard_output_map: File. The output proguard map.
       proguard_seeds: File. The output proguard seeds.
       proguard_usage: File. The output proguard usage.
+      proguard_why_keeping_file: File. Optional file used to write whyareyoukeeping relationship graph.
       startup_profile: File. The input merged startup profile to be optimized.
       baseline_profile: File. The input merged baseline profile to be optimized.
       resource_files: File. The zipped resources to be optimized.
@@ -442,6 +454,7 @@
             proguard_output_map,
             proguard_seeds,
             proguard_usage,
+            proguard_why_keeping_file,
         )
 
     library_jar_list = [utils.only(common.get_java_toolchain(ctx)[java_common.JavaToolchainInfo].bootclasspath.to_list())]
@@ -457,6 +470,7 @@
         proguard_specs,
         proguard_seeds,
         proguard_usage,
+        proguard_why_keeping_file,
         proguard_mapping,
         proguard_output_jar,
         proguard_output_config,
@@ -478,6 +492,7 @@
         proguard_output_config,
         proguard_seeds,
         proguard_usage,
+        proguard_why_keeping_file,
         proguard_output_map,
         combined_library_jar,
         startup_profile_rewritten,
@@ -497,6 +512,7 @@
         proto_mapping = proguard_output_proto_map,
         seeds = proguard_seeds,
         usage = proguard_usage,
+        why_keeping_file = proguard_why_keeping_file,
         library_jar = combined_library_jar,
         config = proguard_output_config,
         startup_profile_rewritten = startup_profile_rewritten,
@@ -509,6 +525,7 @@
         proguard_specs = None,
         proguard_seeds = None,
         proguard_usage = None,
+        proguard_why_keeping_file = None,
         proguard_mapping = None,
         proguard_output_jar = None,
         proguard_output_config = None,
@@ -560,6 +577,7 @@
         proguard_output_config,
         proguard_seeds,
         proguard_usage,
+        proguard_why_keeping_file,
         proguard_output_map,
         combined_library_jar,
         startup_profile_rewritten,
@@ -583,6 +601,7 @@
             proguard_output_map = outputs.mapping,
             proguard_seeds = outputs.seeds,
             proguard_usage = outputs.usage,
+            proguard_why_keeping_file = outputs.why_keeping_file,
             proguard_config_output = outputs.config,
             startup_profile = startup_profile,
             startup_profile_rewritten = outputs.startup_profile_rewritten,
@@ -613,6 +632,7 @@
         proguard_output_map = None,
         proguard_seeds = outputs.seeds,
         proguard_usage = None,
+        proguard_why_keeping_file = None,
         proguard_config_output = None,
         startup_profile = startup_profile,
         startup_profile_rewritten = None,
@@ -685,6 +705,7 @@
         proguard_output_map = outputs.mapping,
         proguard_seeds = None,
         proguard_usage = outputs.usage,
+        proguard_why_keeping_file = outputs.why_keeping_file,
         proguard_config_output = outputs.config,
         startup_profile = None,
         startup_profile_rewritten = outputs.startup_profile_rewritten,