Change run_on_as_app to do pre-runs in gradle

This should give more precise benchmarks.

Change-Id: Iffffd3664a68925d6636ba0d23ae718968ea9fbd
diff --git a/tools/run_on_as_app.py b/tools/run_on_as_app.py
index 032b3f4..70fbc2a 100755
--- a/tools/run_on_as_app.py
+++ b/tools/run_on_as_app.py
@@ -592,16 +592,40 @@
 
   # Build using gradle.
   args = [releaseTarget,
-         '--profile',
-         '-Pandroid.enableR8=' + str(isR8(shrinker)).lower(),
-         '-Pandroid.enableR8.fullMode=' + str(isR8FullMode(shrinker)).lower()]
+          '-Pandroid.enableR8=' + str(isR8(shrinker)).lower(),
+          '-Pandroid.enableR8.fullMode=' + str(isR8FullMode(shrinker)).lower()]
+
+  # Warm up gradle if pre_runs > 0. For posterity we generate the same sequence
+  # as the benchmarking at https://github.com/madsager/santa-tracker-android.
+  for i in range(0, options.gradle_pre_runs):
+    if i == 0:
+      utils.RunGradlew(
+          ["--stop"],
+          env_vars=env_vars,
+          quiet=options.quiet,
+          logging=not options.golem,
+          use_daemon=options.use_daemon)
+    utils.RunGradlew(
+        args,
+        env_vars=env_vars,
+        quiet=options.quiet,
+        clean=i > 0,
+        use_daemon=options.use_daemon,
+        logging=not options.golem)
+
   if keepRuleSynthesisForRecompilation:
     args.append('-Dcom.android.tools.r8.keepRuleSynthesisForRecompilation=true')
   if options.gradle_flags:
     args.extend(options.gradle_flags.split(' '))
 
-  stdout = utils.RunGradlew(args, env_vars=env_vars, quiet=options.quiet,
-                            logging=not options.golem)
+  args.append('--profile')
+
+  stdout = utils.RunGradlew(
+      args,
+      env_vars=env_vars,
+      quiet=options.quiet,
+      use_daemon=options.use_daemon,
+      logging=not options.golem)
 
   apk_base_name = (archives_base_name
       + (('-' + app.flavor) if app.flavor else '') + '-release')
@@ -652,9 +676,13 @@
          '-Pandroid.enableR8=' + str(isR8(shrinker)).lower(),
          '-Pandroid.enableR8.fullMode=' + str(isR8FullMode(shrinker)).lower()]
   env_vars = { 'ANDROID_SERIAL': options.emulator_id }
-  stdout = \
-      utils.RunGradlew(args, env_vars=env_vars, quiet=options.quiet,
-                       fail=False, logging=not options.golem)
+  stdout = utils.RunGradlew(
+      args,
+      env_vars=env_vars,
+      quiet=options.quiet,
+      fail=False,
+      logging=not options.golem,
+      use_daemon=options.use_daemon)
 
   xml_test_result_dest = os.path.join(out_dir, 'test_result')
   as_utils.MoveXMLTestResultFileTo(
@@ -684,7 +712,6 @@
       BuildAppWithShrinker(
           app, repo, shrinker, checkout_dir, out_dir,
           temp_dir, options, keepRuleSynthesisForRecompilation=True)
-  dex_size = ComputeSizeOfDexFilesInApk(apk_dest)
   recompilation_result = {
     'apk_dest': apk_dest,
     'build_status': 'success',
@@ -947,6 +974,10 @@
                     action='store_true')
   result.add_option('--gradle-flags', '--gradle_flags',
                     help='Flags to pass in to gradle')
+  result.add_option('--gradle-pre-runs', '--gradle_pre_runs',
+                    help='Do rounds of compilations to warm up gradle',
+                    default=0,
+                    type=int)
   result.add_option('--ignore-versions', '--ignore_versions',
                     help='Allow checked-out app to differ in revision from '
                          'pinned',
@@ -994,6 +1025,10 @@
   result.add_option('--shrinker',
                     help='The shrinkers to use (by default, all are run)',
                     action='append')
+  result.add_option('--use-daemon', '--use_daemon',
+                    help='Whether to use a gradle daemon',
+                    default=False,
+                    action='store_true')
   result.add_option('--version',
                     help='The version of R8 to use (e.g., 1.4.51)')
   (options, args) = result.parse_args(argv)
@@ -1045,6 +1080,8 @@
     options.no_build = True
     options.r8_compilation_steps = 1
     options.quiet = True
+    options.gradle_pre_runs = 2
+    options.use_daemon = True
 
   if not os.path.exists(WORKING_DIR):
     os.makedirs(WORKING_DIR)