Initial push.
diff --git a/tools/run_r8_on_app.py b/tools/run_r8_on_app.py
new file mode 100755
index 0000000..736d428
--- /dev/null
+++ b/tools/run_r8_on_app.py
@@ -0,0 +1,123 @@
+#!/usr/bin/env python
+# Copyright (c) 2017, 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 optparse
+import os
+import r8
+import sys
+
+import gmscore_data
+import youtube_data
+
+TYPES = ['dex', 'deploy', 'proguarded']
+APPS = ['gmscore', 'youtube']
+
+def ParseOptions():
+  result = optparse.OptionParser()
+  result.add_option('--app',
+                    help='',
+                    default='gmscore',
+                    choices=APPS)
+  result.add_option('--type',
+                    help='',
+                    default='deploy',
+                    choices=TYPES)
+  result.add_option('--out',
+                    help='',
+                    default=os.getcwd())
+  result.add_option('--no-build',
+                    help='',
+                    default=False,
+                    action='store_true')
+  result.add_option('--no-libraries',
+                    help='',
+                    default=False,
+                    action='store_true')
+  result.add_option('--no-debug',
+                    help='Run without debug asserts.',
+                    default=False,
+                    action='store_true')
+  result.add_option('--version',
+                    help='')
+  result.add_option('-k',
+                    help='Override the default ProGuard keep rules')
+  result.add_option('--r8-flags',
+                    help='Additional option(s) for R8. ' +
+                         'If passing several options use a quoted string.')
+  result.add_option('--track-memory-to-file',
+                    help='Track how much memory the jvm is using while ' +
+                    ' compiling. Output to the specified file.')
+  result.add_option('--profile',
+                    help='Profile R8 run.',
+                    default=False,
+                    action='store_true')
+  result.add_option('--dump-args-file',
+                    help='Dump a file with the arguments for the specified ' +
+                    'configuration. For use as a @<file> argument to perform ' +
+                    'the run.')
+  return result.parse_args()
+
+def main():
+  (options, args) = ParseOptions()
+  outdir = options.out
+  data = None
+  if options.app == 'gmscore':
+    options.version = options.version or 'v9'
+    data = gmscore_data
+  elif options.app == 'youtube':
+    options.version = options.version or '12.10'
+    data = youtube_data
+  else:
+    raise 'Unexpected'
+
+  if not options.version in data.VERSIONS.keys():
+    print 'No version %s for application %s' % (options.version, options.app)
+    print 'Valid versions are %s' % data.VERSIONS.keys()
+    return 1
+
+  version = data.VERSIONS[options.version]
+
+  if options.type not in version:
+    print 'No type %s for version %s' % (options.type, options.version)
+    print 'Valid types are %s' % version.keys()
+    return 1
+  values = version[options.type]
+  inputs = None
+  # For 'deploy' the JAR is located using the Proguard configuration -injars option.
+  if 'inputs' in values and options.type != 'deploy':
+    inputs = values['inputs']
+
+  args.extend(['--output', outdir])
+  if 'pgmap' in values:
+    args.extend(['--pg-map', values['pgmap']])
+  if 'pgconf' in values and not options.k:
+    for pgconf in values['pgconf']:
+      args.extend(['--pg-conf', pgconf])
+  if options.k:
+    args.extend(['--pg-conf', options.k])
+  if not options.no_libraries and 'libraries' in values:
+    for lib in values['libraries']:
+      args.extend(['--lib', lib])
+
+  if not outdir.endswith('.zip') and not outdir.endswith('.jar') and not os.path.exists(outdir):
+    os.makedirs(outdir)
+
+  if 'r8-flags' in values:
+    args.extend(values['r8-flags'].split(' '))
+  if options.r8_flags:
+    args.extend(options.r8_flags.split(' '))
+
+  if inputs:
+    args.extend(inputs)
+
+  if options.dump_args_file:
+    with open(options.dump_args_file, 'w') as args_file:
+      args_file.writelines([arg + os.linesep for arg in args])
+  else:
+    r8.run(args, not options.no_build, not options.no_debug, options.profile,
+           options.track_memory_to_file)
+
+if __name__ == '__main__':
+  sys.exit(main())