Add r8lib shrinker to run_on_as_app.py

Bug: 121372248
Change-Id: I8de0aee42b074893cce63aa2efb86e9e94b88567
diff --git a/tools/as_utils.py b/tools/as_utils.py
index 1eaa206..7b373f4 100644
--- a/tools/as_utils.py
+++ b/tools/as_utils.py
@@ -8,7 +8,7 @@
 
 import utils
 
-def add_r8_dependency(checkout_dir):
+def add_r8_dependency(checkout_dir, minified):
   build_file = os.path.join(checkout_dir, 'build.gradle')
   assert os.path.isfile(build_file), 'Expected a file to be present at {}'.format(build_file)
 
@@ -27,12 +27,21 @@
         is_inside_dependencies = True
       if is_inside_dependencies:
         if utils.R8_JAR in stripped:
+          if minified:
+            # Skip line to avoid dependency on r8.jar
+            continue
+          added_r8_dependency = True
+        elif utils.R8LIB_JAR in stripped:
+          if not minified:
+            # Skip line to avoid dependency on r8lib.jar
+            continue
           added_r8_dependency = True
         elif 'com.android.tools.build:gradle:' in stripped:
           gradle_version = stripped[stripped.rindex(':')+1:-1]
           if not added_r8_dependency:
             indent = ''.ljust(line.index('classpath'))
-            f.write('{}classpath files(\'{}\')\n'.format(indent, utils.R8_JAR))
+            jar = utils.R8LIB_JAR if minified else utils.R8_JAR
+            f.write('{}classpath files(\'{}\')\n'.format(indent, jar))
             added_r8_dependency = True
         elif stripped == '}':
           is_inside_dependencies = False
@@ -51,5 +60,5 @@
     lines = f.readlines()
   with open(build_file, 'w') as f:
     for line in lines:
-      if utils.R8_JAR not in line:
+      if (utils.R8_JAR not in line) and (utils.R8LIB_JAR not in line):
         f.write(line)
diff --git a/tools/run_on_as_app.py b/tools/run_on_as_app.py
index e2f70f0..8f37f43 100755
--- a/tools/run_on_as_app.py
+++ b/tools/run_on_as_app.py
@@ -14,7 +14,7 @@
 
 import as_utils
 
-SHRINKERS = ['r8', 'r8full', 'proguard']
+SHRINKERS = ['r8', 'r8full', 'r8-minified', 'r8full-minified', 'proguard']
 WORKING_DIR = utils.BUILD
 
 if 'R8_BENCHMARK_DIR' in os.environ and os.path.isdir(os.environ['R8_BENCHMARK_DIR']):
@@ -107,6 +107,9 @@
   script = os.path.join(utils.TOOLS_DIR, 'extractmarker.py')
   return '~~R8' in subprocess.check_output(['python', script, apk]).strip()
 
+def IsMinifiedR8(shrinker):
+  return shrinker == 'r8-minified' or shrinker == 'r8full-minified'
+
 def IsTrackedByGit(file):
   return subprocess.check_output(['git', 'ls-files', file]).strip() != ''
 
@@ -163,11 +166,6 @@
     with utils.ChangedWorkingDirectory(checkout_dir):
       GitPull()
 
-  if options.use_tot:
-    as_utils.add_r8_dependency(checkout_dir)
-  else:
-    as_utils.remove_r8_dependency(checkout_dir)
-
   result_per_shrinker = {}
 
   with utils.ChangedWorkingDirectory(checkout_dir):
@@ -203,6 +201,11 @@
 def BuildAppWithShrinker(app, config, shrinker, checkout_dir, options):
   print('Building {} with {}'.format(app, shrinker))
 
+  if options.disable_tot:
+    as_utils.remove_r8_dependency(checkout_dir)
+  else:
+    as_utils.add_r8_dependency(checkout_dir, IsMinifiedR8(shrinker))
+
   app_module = config.get('app_module', 'app')
   archives_base_name = config.get(' archives_base_name', app_module)
   flavor = config.get('flavor')
@@ -214,7 +217,7 @@
   with open("gradle.properties", "a") as gradle_properties:
     if 'r8' in shrinker:
       gradle_properties.write('\nandroid.enableR8=true\n')
-      if shrinker == 'r8full':
+      if shrinker == 'r8full' or shrinker == 'r8full-minified':
         gradle_properties.write('android.enableR8.fullMode=true\n')
     else:
       assert shrinker == 'proguard'
@@ -328,16 +331,26 @@
   result.add_option('--shrinker',
                     help='The shrinker to use (by default, all are run)',
                     choices=SHRINKERS)
-  result.add_option('--use_tot',
+  result.add_option('--disable_tot',
                     help='Whether to disable the use of the ToT version of R8',
-                    default=True,
-                    action='store_false')
+                    default=False,
+                    action='store_true')
   return result.parse_args(argv)
 
 def main(argv):
+  global SHRINKERS
+
   (options, args) = ParseOptions(argv)
-  assert not options.use_tot or os.path.isfile(utils.R8_JAR), (
+  assert options.disable_tot or os.path.isfile(utils.R8_JAR), (
       'Cannot build from ToT without r8.jar')
+  assert options.disable_tot or os.path.isfile(utils.R8LIB_JAR), (
+      'Cannot build from ToT without r8lib.jar')
+
+  if options.disable_tot:
+    # Cannot run r8 lib without adding r8lib.jar as an dependency
+    SHRINKERS = [
+        shrinker for shrinker in SHRINKERS
+        if 'minified' not in shrinker]
 
   result_per_shrinker_per_app = {}