diff --git a/scripts/add-android-jar.sh b/scripts/add-android-jar.sh
deleted file mode 100755
index 3f575b4..0000000
--- a/scripts/add-android-jar.sh
+++ /dev/null
@@ -1,45 +0,0 @@
-#!/bin/bash
-#
-# Copyright (c) 2021, 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.
-
-set -e
-set -x
-
-echo "Update this script manually before using"
-echo "If updating API database also update API_LEVEL in " \
-    "AndroidApiHashingDatabaseBuilderGeneratorTest"
-exit -1
-
-# Download Platform SDK in @SDK_HOME
-SDK_HOME=$HOME/Android/Sdk
-
-# Modify these to match the SDK android.jar to add.
-SDK_DIR_NAME=android-35
-SDK_VERSION=35
-
-SDK_DIR=$SDK_HOME/platforms/$SDK_DIR_NAME
-THIRD_PARTY_ANDROID_JAR=third_party/android_jar
-THIRD_PARTY_ANDROID_JAR_LIB=$THIRD_PARTY_ANDROID_JAR/lib-v$SDK_VERSION
-
-rm -rf $THIRD_PARTY_ANDROID_JAR_LIB
-rm -f ${THIRD_PARTY_ANDROID_JAR_LIB}.tar.gz
-rm -f ${THIRD_PARTY_ANDROID_JAR_LIB}.tar.sha1
-
-mkdir -p $THIRD_PARTY_ANDROID_JAR_LIB/optional
-cp $SDK_DIR/android.jar $THIRD_PARTY_ANDROID_JAR_LIB/android.jar
-cp $SDK_DIR/data/api-versions.xml $THIRD_PARTY_ANDROID_JAR_LIB/api-versions.xml
-cp $SDK_DIR/optional/*.jar $THIRD_PARTY_ANDROID_JAR_LIB/optional
-cp $SDK_DIR/optional/optional.json $THIRD_PARTY_ANDROID_JAR_LIB/optional
-cp $THIRD_PARTY_ANDROID_JAR/lib-v31/README.google $THIRD_PARTY_ANDROID_JAR_LIB
-vi $THIRD_PARTY_ANDROID_JAR_LIB/README.google
-
-(cd $THIRD_PARTY_ANDROID_JAR \
-    && upload_to_google_storage.py -a --bucket r8-deps lib-v$SDK_VERSION)
-rm -rf $THIRD_PARTY_ANDROID_JAR_LIB
-rm ${THIRD_PARTY_ANDROID_JAR_LIB}.tar.gz
-git add ${THIRD_PARTY_ANDROID_JAR_LIB}.tar.gz.sha1
-
-echo "Update build.gradle with this new cloud dependency, " \
-    "and verify with tools/gradle.py downloadDeps"
diff --git a/tools/add-android-sdk.py b/tools/add-android-sdk.py
new file mode 100755
index 0000000..e299172
--- /dev/null
+++ b/tools/add-android-sdk.py
@@ -0,0 +1,94 @@
+#!/usr/bin/env python3
+# Copyright (c) 2024, 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
+
+
+def parse_options():
+    parser = argparse.ArgumentParser(description='Release r8')
+    parser.add_argument('--sdk-home',
+                        '--sdk_home',
+                        metavar=('<SDK_HOME>'),
+                        help='SDK_HOME to use for finding SDK')
+    parser.add_argument('--sdk-name',
+                        '--sdk_name',
+                        required=True,
+                        metavar=('<name>'),
+                        help='Name of the SDK, either API level or code name')
+    return parser.parse_args()
+
+
+def remove(path):
+    try:
+        os.remove(path)
+    except FileNotFoundError:
+        pass
+
+
+def generate_readme_google(destination, sdk_name):
+    with open(os.path.join(destination, 'README.google'), 'w') as f:
+        f.write('Name: Android SDK excerpts\n')
+        f.write('URL: https://developer.android.com/tools/sdkmanager\n')
+        f.write('Version: API version %s\n' % sdk_name)
+        f.write('Revision: N/A\n')
+        f.write('License: Apache License Version 2.0\n')
+        f.write('\n')
+        f.write('Description:\n')
+        f.write('This is excerpts from an Android SDK including android.jar.\n')
+
+
+def main():
+    args = parse_options()
+
+    if not args.sdk_home:
+        args.sdk_home = os.environ.get('SDK_HOME')
+        if not args.sdk_home:
+            print('No SDK_HOME specified')
+            sys.exit(1)
+        else:
+            print('Using SDK_HOME: %s' % args.sdk_home)
+
+    source = os.path.join(args.sdk_home, 'platforms',
+                          'android-%s' % args.sdk_name)
+    if not os.path.exists(source):
+        print('Path %s does not exist' % source)
+        sys.exit(1)
+
+    destination = utils.get_android_jar_dir(args.sdk_name)
+
+    # Remove existing if present.
+    shutil.rmtree(destination, ignore_errors=True)
+    remove(destination + 'tar.gz')
+    remove(destination + 'tar.gz.sha1')
+
+    # Copy the files of interest.
+    destination_optional_path = os.path.join(destination, 'optional')
+    os.makedirs(os.path.join(destination_optional_path))
+    shutil.copyfile(os.path.join(source, 'android.jar'),
+                    os.path.join(destination, 'android.jar'))
+    shutil.copyfile(os.path.join(source, 'data', 'api-versions.xml'),
+                    os.path.join(destination, 'api-versions.xml'))
+    source_optional_path = os.path.join(source, 'optional')
+    for root, dirnames, filenames in os.walk(source_optional_path):
+        for filename in filenames:
+            if filename.endswith('.jar') or filename == 'optional.json':
+                shutil.copyfile(
+                    os.path.join(source_optional_path, filename),
+                    os.path.join(destination_optional_path, filename))
+    generate_readme_google(destination, args.sdk_name)
+
+    print('If you want to upload this run:')
+    print('  (cd %s; upload_to_google_storage.py -a --bucket r8-deps %s)' %
+          (os.path.dirname(destination), os.path.basename(destination)))
+    print('Update d8_r8/commonBuildSrc/src/main/kotlin/DependenciesPlugin.kt'
+          ' if this is a new dependency.')
+
+
+if __name__ == '__main__':
+    sys.exit(main())
