Add apps to run_on_as_app.py

This CL also extends the script such that it runs all shrinkers on all apps if --app is not provided.

Change-Id: I93ab30836c4ff56d29bb4144f69165866c74caa1
diff --git a/tools/run_on_as_app.py b/tools/run_on_as_app.py
index 0c6ea6c..82fa5bd 100755
--- a/tools/run_on_as_app.py
+++ b/tools/run_on_as_app.py
@@ -25,10 +25,36 @@
   #     'archives_base_name': ... (default same as app_module)
   #     'flavor': ... (default no flavor)
   # },
+  'AnExplorer': {
+      'git_repo': 'https://github.com/1hakr/AnExplorer',
+      'flavor': 'googleMobilePro',
+      'signed-apk-name': 'AnExplorer-googleMobileProRelease-4.0.3.apk',
+  },
   'AntennaPod': {
       'git_repo': 'https://github.com/AntennaPod/AntennaPod.git',
       'flavor': 'play',
   },
+  'apps-android-wikipedia': {
+      'git_repo': 'https://github.com/wikimedia/apps-android-wikipedia',
+      'flavor': 'prod',
+      'signed-apk-name': 'app-prod-universal-release.apk'
+  },
+  'KISS': {
+      'git_repo': 'https://github.com/Neamar/KISS',
+  },
+  'materialistic': {
+      'git_repo': 'https://github.com/hidroh/materialistic',
+  },
+  'Minimal-Todo': {
+      'git_repo': 'https://github.com/avjinder/Minimal-Todo',
+  },
+  'NewPipe': {
+      'git_repo': 'https://github.com/TeamNewPipe/NewPipe',
+  },
+  'Simple-Calendar': {
+      'git_repo': 'https://github.com/SimpleMobileTools/Simple-Calendar',
+      'signed-apk-name': 'calendar-release.apk'
+  },
   'tachiyomi': {
       'git_repo': 'https://github.com/sgjesse/tachiyomi.git',
       'flavor': 'standard',
@@ -38,9 +64,17 @@
       'git_repo': 'https://github.com/sgjesse/muzei.git',
       'app_module': 'main',
       'archives_base_name': 'muzei',
+      'skip': True,
   },
 }
 
+# Common environment setup.
+user_home = os.path.expanduser('~')
+android_home = os.path.join(user_home, 'Android', 'Sdk')
+android_build_tools_version = '28.0.3'
+android_build_tools = os.path.join(
+    android_home, 'build-tools', android_build_tools_version)
+
 def IsBuiltWithR8(apk):
   script = os.path.join(utils.TOOLS_DIR, 'extractmarker.py')
   return '~~R8' in subprocess.check_output(['python', script, apk]).strip()
@@ -64,6 +98,105 @@
     os.remove(apk_dest)
   os.rename(apk, apk_dest)
 
+def BuildAppWithSelectedShrinkers(app, config, options):
+  git_repo = config['git_repo']
+
+  # Checkout and build in the build directory.
+  checkout_dir = os.path.join(WORKING_DIR, app)
+
+  if not os.path.exists(checkout_dir):
+    with utils.ChangedWorkingDirectory(WORKING_DIR):
+      GitClone(git_repo)
+  else:
+    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)
+
+  with utils.ChangedWorkingDirectory(checkout_dir):
+    for shrinker in SHRINKERS:
+      if options.shrinker is not None and shrinker != options.shrinker:
+        continue
+
+      BuildAppWithShrinker(app, config, shrinker, checkout_dir, options)
+
+    if IsTrackedByGit('gradle.properties'):
+      GitCheckout('gradle.properties')
+
+def BuildAppWithShrinker(app, config, shrinker, checkout_dir, options):
+  print('Building {} with {}'.format(app, shrinker))
+
+  app_module = config.get('app_module', 'app')
+  archives_base_name = config.get(' archives_base_name', app_module)
+  flavor = config.get('flavor')
+
+  # Ensure that gradle.properties are not modified before modifying it to
+  # select shrinker.
+  if IsTrackedByGit('gradle.properties'):
+    GitCheckout('gradle.properties')
+  with open("gradle.properties", "a") as gradle_properties:
+    if 'r8' in shrinker:
+      gradle_properties.write('\nandroid.enableR8=true\n')
+      if shrinker == 'r8full':
+        gradle_properties.write('android.enableR8.fullMode=true\n')
+    else:
+      assert shrinker == 'proguard'
+      gradle_properties.write('\nandroid.enableR8=false\n')
+
+  out = os.path.join(checkout_dir, 'out', shrinker)
+  if not os.path.exists(out):
+    os.makedirs(out)
+
+  env = os.environ.copy()
+  env['ANDROID_HOME'] = android_home
+  env['JAVA_OPTS'] = '-ea'
+  releaseTarget = app_module + ':' + 'assemble' + (
+      flavor.capitalize() if flavor else '') + 'Release'
+
+  cmd = ['./gradlew', '--no-daemon', 'clean', releaseTarget, '--stacktrace']
+  utils.PrintCmd(cmd)
+  subprocess.check_call(cmd, env=env)
+
+  apk_base_name = (archives_base_name
+      + (('-' + flavor) if flavor else '') + '-release')
+  signed_apk_name = config.get('signed-apk-name', apk_base_name + '.apk')
+  unsigned_apk_name = apk_base_name + '-unsigned.apk'
+
+  build_dir = config.get('build_dir', 'build')
+  build_output_apks = os.path.join(app_module, build_dir, 'outputs', 'apk')
+  if flavor:
+    build_output_apks = os.path.join(build_output_apks, flavor, 'release')
+  else:
+    build_output_apks = os.path.join(build_output_apks, 'release')
+
+  signed_apk = os.path.join(build_output_apks, signed_apk_name)
+  unsigned_apk = os.path.join(build_output_apks, unsigned_apk_name)
+
+  if options.sign_apks and not os.path.isfile(signed_apk):
+    assert os.path.isfile(unsigned_apk)
+    if options.sign_apks:
+      keystore = 'app.keystore'
+      keystore_password = 'android'
+      apk_utils.sign_with_apksigner(
+          android_build_tools,
+          unsigned_apk,
+          signed_apk,
+          keystore,
+          keystore_password)
+
+  if os.path.isfile(signed_apk):
+    apk_dest = os.path.join(out, signed_apk_name)
+    MoveApkToDest(signed_apk, apk_dest)
+  else:
+    apk_dest = os.path.join(out, unsigned_apk_name)
+    MoveApkToDest(unsigned_apk, apk_dest)
+
+  assert IsBuiltWithR8(apk_dest) == ('r8' in shrinker), (
+      'Unexpected marker in generated APK for {}'.format(shrinker))
+
 def ParseOptions(argv):
   result = optparse.OptionParser()
   result.add_option('--app',
@@ -87,110 +220,12 @@
   assert not options.use_tot or os.path.isfile(utils.R8_JAR), (
       'Cannot build from ToT without r8.jar')
 
-  # Common environment setup.
-  user_home = os.path.expanduser('~')
-  android_home = os.path.join(user_home, 'Android', 'Sdk')
-  android_build_tools_version = '28.0.3'
-  android_build_tools = os.path.join(
-      android_home, 'build-tools', android_build_tools_version)
-
-  # App setup.
-  app = options.app
-  if not app:
-    raise Exception(
-        "You need to specify '--app={}'".format('|'.join(APPS.keys())))
-  config = APPS.get(app)
-  git_repo = config['git_repo']
-  app_module = config.get('app_module', 'app')
-  archives_base_name = config.get(' archives_base_name', app_module)
-  flavor = config.get('flavor')
-
-  # Checkout and build in the build directory.
-  checkout_dir = os.path.join(WORKING_DIR, app)
-
-  if not os.path.exists(checkout_dir):
-    with utils.ChangedWorkingDirectory(WORKING_DIR):
-      GitClone(git_repo)
+  if options.app:
+    BuildAppWithSelectedShrinkers(options.app, APPS.get(app), options)
   else:
-    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)
-
-  with utils.ChangedWorkingDirectory(checkout_dir):
-    for shrinker in SHRINKERS:
-      if options.shrinker is not None and shrinker != options.shrinker:
-        continue
-
-      print('Building with {}'.format(shrinker))
-
-      # Ensure that gradle.properties are not modified before modifying it to
-      # select shrinker.
-      if IsTrackedByGit('gradle.properties'):
-        GitCheckout('gradle.properties')
-      with open("gradle.properties", "a") as gradle_properties:
-        if 'r8' in shrinker:
-          gradle_properties.write('\nandroid.enableR8=true\n')
-          if shrinker == 'r8full':
-            gradle_properties.write('android.enableR8.fullMode=true\n')
-        else:
-          assert shrinker == 'proguard'
-          gradle_properties.write('\nandroid.enableR8=false\n')
-
-      out = os.path.join(checkout_dir, 'out', shrinker)
-      if not os.path.exists(out):
-        os.makedirs(out)
-
-      env = os.environ.copy()
-      env['ANDROID_HOME'] = android_home
-      env['JAVA_OPTS'] = '-ea'
-      releaseTarget = app_module + ':' + 'assemble' + (
-          flavor.capitalize() if flavor else '') + 'Release'
-
-      cmd = ['./gradlew', '--no-daemon', 'clean', releaseTarget, '--stacktrace']
-      utils.PrintCmd(cmd)
-      subprocess.check_call(cmd, env=env)
-
-      apk_base_name = (archives_base_name
-          + (('-' + flavor) if flavor else '') + '-release')
-      signed_apk_name = apk_base_name + '.apk'
-      unsigned_apk_name = apk_base_name + '-unsigned.apk'
-
-      build_output_apks = os.path.join(app_module, 'build', 'outputs', 'apk')
-      if flavor:
-        build_output_apks = os.path.join(build_output_apks, flavor, 'release')
-      else:
-        build_output_apks = os.path.join(build_output_apks, 'release')
-
-      signed_apk = os.path.join(build_output_apks, signed_apk_name)
-      unsigned_apk = os.path.join(build_output_apks, unsigned_apk_name)
-
-      if options.sign_apks and not os.path.isfile(signed_apk):
-        assert os.path.isfile(unsigned_apk)
-        if options.sign_apks:
-          keystore = 'app.keystore'
-          keystore_password = 'android'
-          apk_utils.sign_with_apksigner(
-              android_build_tools,
-              unsigned_apk,
-              signed_apk,
-              keystore,
-              keystore_password)
-
-      if os.path.isfile(signed_apk):
-        apk_dest = os.path.join(out, signed_apk_name)
-        MoveApkToDest(signed_apk, apk_dest)
-      else:
-        apk_dest = os.path.join(out, unsigned_apk_name)
-        MoveApkToDest(unsigned_apk, apk_dest)
-
-      assert IsBuiltWithR8(apk_dest) == ('r8' in shrinker)
-
-    if IsTrackedByGit('gradle.properties'):
-      GitCheckout('gradle.properties')
+    for app, config in APPS.iteritems():
+      if not config.get('skip', False):
+        BuildAppWithSelectedShrinkers(app, config, options)
 
 if __name__ == '__main__':
   sys.exit(main(sys.argv[1:]))