Add tool for copying keep annotations Kotlin files to androidx

Bug: b/392865072

Change-Id: Id75ccb8559516884e932b80a3438c408330bf0be
diff --git a/tools/update-androidx-keep-annotations.py b/tools/update-androidx-keep-annotations.py
new file mode 100755
index 0000000..91fffa0
--- /dev/null
+++ b/tools/update-androidx-keep-annotations.py
@@ -0,0 +1,72 @@
+#!/usr/bin/env python3
+# Copyright (c) 2025, the R8 project authors. Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
+
+import argparse
+import os
+import shutil
+import sys
+import utils
+
+
+KOTLIN_EXTENSION = '.kt'
+# Extension used by androidx KMP libraries for Kotlin files with code
+# targeting the JVM.
+JVM_KOTLIN_EXTENSION = '.jvm.kt'
+
+
+def parse_options():
+    parser = argparse.ArgumentParser(description='Update androidx keep annotations')
+    parser.add_argument('--androidx',
+                        metavar=('<path>'),
+                        required=True,
+                        help='Path to the androidx checkout')
+    return parser.parse_args()
+
+
+def main():
+    args = parse_options()
+
+    source_dir = os.path.join(
+        utils.REPO_ROOT,
+        'src',
+        'keepanno',
+        'java',
+        'androidx',
+        'annotation',
+        'keep')
+    dest_dir = os.path.join(
+        args.androidx,
+        'frameworks',
+        'support',
+        'annotation',
+        'annotation-keep',
+        'src',
+        'jvmMain',
+        'kotlin',
+        'androidx',
+        'annotation',
+        'keep')
+
+    for root, dirnames, filenames in os.walk(source_dir):
+        if root != source_dir:
+            print('Unexpected subdirectory under {source_dir}.'
+                .format(source_dir=source_dir))
+        if len(dirnames) > 0:
+            print('Unexpected subdirectories under {dirnames}.'
+                .format(dirnames=dirnames))
+        for filename in filenames:
+            if not filename.endswith(KOTLIN_EXTENSION):
+                print('Unexpected non Kotlin file {filename}.'
+                    .format(filename=os.path.join(root, filename)))
+                sys.exit(1)
+            new_filename = filename[0:len(filename) - len(KOTLIN_EXTENSION)] + JVM_KOTLIN_EXTENSION
+
+            shutil.copyfile(
+                os.path.join(root, filename),
+                os.path.join(dest_dir, new_filename))
+
+
+if __name__ == '__main__':
+    sys.exit(main())