Extract and propagate databinding information from imported aars.
#2694

RELNOTES: None
PiperOrigin-RevId: 309327526
diff --git a/tools/android/aar_resources_extractor.py b/tools/android/aar_resources_extractor.py
index 29d2b4b..49ce7f1 100644
--- a/tools/android/aar_resources_extractor.py
+++ b/tools/android/aar_resources_extractor.py
@@ -45,6 +45,10 @@
 flags.DEFINE_string("output_res_dir", None, "Output resources directory")
 flags.mark_flag_as_required("output_res_dir")
 flags.DEFINE_string("output_assets_dir", None, "Output assets directory")
+flags.DEFINE_string("output_databinding_br_dir", None,
+                    "Output directory for databinding br files")
+flags.DEFINE_string("output_databinding_setter_store_dir", None,
+                    "Output directory for databinding setter_store.json files")
 
 
 def ExtractResources(aar, output_res_dir):
@@ -79,6 +83,14 @@
     WriteFileWithJunctions(empty_asset_filename, b"")
 
 
+def ExtractDatabinding(aar, file_suffix, output_databinding_dir):
+  """Extracts databinding metadata files from an `aar`."""
+  output_databinding_dir_abs = os.path.abspath(output_databinding_dir)
+  for name in aar.namelist():
+    if name.startswith("data-binding/") and name.endswith(file_suffix):
+      ExtractOneFile(aar, name, output_databinding_dir_abs)
+
+
 def WriteFileWithJunctions(filename, content):
   """Writes file including creating any junctions or directories necessary."""
   def _WriteFile(filename):
@@ -132,6 +144,12 @@
     ExtractResources(aar, FLAGS.output_res_dir)
     if FLAGS.output_assets_dir is not None:
       ExtractAssets(aar, FLAGS.output_assets_dir)
+    if FLAGS.output_databinding_br_dir is not None:
+      ExtractDatabinding(aar, "br.bin", FLAGS.output_databinding_br_dir)
+    if FLAGS.output_databinding_setter_store_dir is not None:
+      ExtractDatabinding(aar, "setter_store.json",
+                         FLAGS.output_databinding_setter_store_dir)
+
 
 if __name__ == "__main__":
   FLAGS(sys.argv)