diff --git a/build.gradle b/build.gradle
index 0eace9e..7f93d4a 100644
--- a/build.gradle
+++ b/build.gradle
@@ -988,14 +988,19 @@
     return baseD8CommandLine(allArgs)
 }
 
-def r8LibCreateTask(name, pgConfs = [], r8Task, output, args = ["--release"], libs = []) {
+def r8LibCreateTask(name, pgConfs = [], r8Task, output, libs = []) {
     return tasks.create("r8Lib${name}", Exec) {
-        inputs.files ([pgConfs, r8WithRelocatedDeps.outputs, r8Task.outputs, libs])
+        inputs.files ([pgConfs, r8WithRelocatedDeps.outputs, r8Task.outputs])
         outputs.file output
         dependsOn downloadOpenJDKrt
         dependsOn r8WithRelocatedDeps
         dependsOn r8Task
-        commandLine r8CfCommandLine(r8Task.outputs.files[0], output, pgConfs, args, libs)
+        commandLine ([
+                "tools/create_r8lib.py",
+                "--r8jar", r8Task.outputs.files[0],
+                "--output", output]
+                + (pgConfs.collectMany { ["--pg-conf", it] })
+                + (libs.collectMany { ["--lib", it] }))
         workingDir = projectDir
     }
 }
@@ -1090,11 +1095,10 @@
 
 task R8LibNoDeps {
     dependsOn r8LibCreateTask(
-            "NoDeps",
+            "MainNoDeps",
             ["src/main/keep.txt"],
             r8NoManifestWithoutDeps,
             r8LibExludeDepsPath,
-            "--release",
             repackageDeps.outputs.files
     ).dependsOn(repackageDeps)
     inputs.files ([r8NoManifestWithoutDeps.outputs, repackageDeps.outputs])
diff --git a/tools/create_r8lib.py b/tools/create_r8lib.py
new file mode 100755
index 0000000..21dd48c
--- /dev/null
+++ b/tools/create_r8lib.py
@@ -0,0 +1,53 @@
+#!/usr/bin/env python3
+# 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.
+
+import argparse
+import subprocess
+import sys
+
+import jdk
+
+
+def parse_options():
+  parser = argparse.ArgumentParser(description='Tag R8 Versions')
+  parser.add_argument(
+      '--r8jar',
+      required=True,
+      help='The R8 jar to compile')
+  parser.add_argument(
+      '--output',
+      required=True,
+      help='The output path for the r8lib')
+  parser.add_argument(
+      '--pg-conf',
+      action='append',
+      help='Keep configuration')
+  parser.add_argument(
+      '--lib',
+      action='append',
+      help='Additional libraries (JDK 1.8 rt.jar already included)')
+  return parser.parse_args()
+
+def main():
+  args = parse_options()
+  # TODO(b/139725780): See if we can remove or lower the heap size (-Xmx8g).
+  cmd = [jdk.GetJavaExecutable(), '-Xmx8g', '-ea']
+  cmd.extend(['-cp', 'build/libs/r8_with_deps.jar', 'com.android.tools.r8.R8'])
+  cmd.append(args.r8jar)
+  cmd.append('--classfile')
+  cmd.extend(['--output', args.output])
+  cmd.extend(['--pg-map-output', args.output + '.map'])
+  cmd.extend(['--lib', 'third_party/openjdk/openjdk-rt-1.8/rt.jar'])
+  if args.pg_conf:
+    for pgconf in args.pg_conf:
+      cmd.extend(['--pg-conf', pgconf])
+  if args.lib:
+    for lib in args.lib:
+      cmd.extend(['--lib', lib])
+  print(' '.join(cmd))
+  subprocess.check_call(cmd)
+
+if __name__ == '__main__':
+  sys.exit(main())
