diff --git a/tools/run_on_app_dump.py b/tools/run_on_app_dump.py
index 172f8b7..902c675 100755
--- a/tools/run_on_app_dump.py
+++ b/tools/run_on_app_dump.py
@@ -23,13 +23,15 @@
 import update_prebuilds_in_android
 import utils
 
-GOLEM_BUILD_TARGETS = [utils.GRADLE_TASK_R8LIB,
-                       utils.GRADLE_TASK_RETRACE]
+GOLEM_BUILD_TARGETS = [utils.GRADLE_TASK_R8LIB, utils.GRADLE_TASK_RETRACE]
 SHRINKERS = ['r8', 'r8-full', 'r8-nolib', 'r8-nolib-full']
 
+
 class AttrDict(dict):
-  def __getattr__(self, name):
-    return self.get(name, None)
+
+    def __getattr__(self, name):
+        return self.get(name, None)
+
 
 # To generate the files for a new app, navigate to the app source folder and
 # run:
@@ -40,1230 +42,1314 @@
 # ./gradlew assembleAndroidTest -Dcom.android.tools.r8.dumpinputtodirectory=<path>
 # will also generate dumps and apk for tests.
 
+
 class App(object):
-  def __init__(self, fields):
-    defaults = {
-      'id': None,
-      'name': None,
-      'collections': [],
-      'dump_app': None,
-      'apk_app': None,
-      'dump_test': None,
-      'apk_test': None,
-      'skip': False,
-      'url': None,  # url is not used but nice to have for updating apps
-      'revision': None,
-      'folder': None,
-      'skip_recompilation': False,
-      'compiler_properties': [],
-      'internal': False,
-      'golem_duration': None,
-    }
-    # This below does not work in python3
-    defaults.update(fields.items())
-    self.__dict__ = defaults
+
+    def __init__(self, fields):
+        defaults = {
+            'id': None,
+            'name': None,
+            'collections': [],
+            'dump_app': None,
+            'apk_app': None,
+            'dump_test': None,
+            'apk_test': None,
+            'skip': False,
+            'url': None,  # url is not used but nice to have for updating apps
+            'revision': None,
+            'folder': None,
+            'skip_recompilation': False,
+            'compiler_properties': [],
+            'internal': False,
+            'golem_duration': None,
+        }
+        # This below does not work in python3
+        defaults.update(fields.items())
+        self.__dict__ = defaults
 
 
 class AppCollection(object):
-  def __init__(self, fields):
-    defaults = {
-      'name': None
-    }
-    # This below does not work in python3
-    defaults.update(fields.items())
-    self.__dict__ = defaults
+
+    def __init__(self, fields):
+        defaults = {'name': None}
+        # This below does not work in python3
+        defaults.update(fields.items())
+        self.__dict__ = defaults
 
 
 APPS = [
-  App({
-    'id': 'com.numix.calculator',
-    'name': 'Calculator',
-    'dump_app': 'dump_app.zip',
-    'apk_app': 'app-release.apk',
-    # Compiling tests fail: Library class android.content.res.XmlResourceParser
-    # implements program class org.xmlpull.v1.XmlPullParser. Nothing to really
-    # do about that.
-    'id_test': 'com.numix.calculator.test',
-    'dump_test': 'dump_test.zip',
-    'apk_test': 'app-release-androidTest.apk',
-    'url': 'https://github.com/numixproject/android-suite/tree/master/Calculator',
-    'revision': 'f58e1b53f7278c9b675d5855842c6d8a44cccb1f',
-    'folder': 'android-suite-calculator',
-  }),
-  App({
-    'id': 'dev.dworks.apps.anexplorer.pro',
-    'name': 'AnExplorer',
-    'dump_app': 'dump_app.zip',
-    'apk_app': 'AnExplorer-googleMobileProRelease-4.0.3.apk',
-    'url': 'https://github.com/christofferqa/AnExplorer',
-    'revision': '365927477b8eab4052a1882d5e358057ae3dee4d',
-    'folder': 'anexplorer',
-  }),
-  App({
-    'id': 'de.danoeh.antennapod',
-    'name': 'AntennaPod',
-    'dump_app': 'dump_app.zip',
-    'apk_app': 'app-free-release.apk',
-    # TODO(b/172452102): Tests and monkey do not work
-    'id_test': 'de.danoeh.antennapod.test',
-    'dump_test': 'dump_test.zip',
-    'apk_test': 'app-free-release-androidTest.apk',
-    'url': 'https://github.com/christofferqa/AntennaPod.git',
-    'revision': '77e94f4783a16abe9cc5b78dc2d2b2b1867d8c06',
-    'folder': 'antennapod',
-  }),
-  App({
-    'id': 'com.example.applymapping',
-    'name': 'applymapping',
-    'dump_app': 'dump_app.zip',
-    'apk_app': 'app-release.apk',
-    'id_test': 'com.example.applymapping.test',
-    'dump_test': 'dump_test.zip',
-    'apk_test': 'app-release-androidTest.apk',
-    'url': 'https://github.com/mkj-gram/applymapping',
-    'revision': 'e3ae14b8c16fa4718e5dea8f7ad00937701b3c48',
-    'folder': 'applymapping',
-  }),
-  App({
-    'id': 'com.chanapps.four.activity',
-    'name': 'chanu',
-    'dump_app': 'dump_app.zip',
-    'apk_app': 'app-release.apk',
-    'url': 'https://github.com/mkj-gram/chanu.git',
-    'revision': '6e53458f167b6d78398da60c20fd0da01a232617',
-    'folder': 'chanu',
-    # The app depends on a class file that has access flags interface but
-    # not abstract
-    'compiler_properties': ['-Dcom.android.tools.r8.allowInvalidCfAccessFlags=true']
-  }),
-  App({
-    'id': 'com.example.myapplication',
-    'name': 'empty-activity',
-    'dump_app': 'dump_app.zip',
-    'apk_app': 'app-release.apk',
-    'url': 'https://github.com/christofferqa/empty_android_activity.git',
-    'revision': '2d297ec3373dadb03cbae916b9feba4792563156',
-    'folder': 'empty-activity',
-  }),
-  App({
-    'id': 'com.example.emptycomposeactivity',
-    'name': 'empty-compose-activity',
-    'dump_app': 'dump_app.zip',
-    'apk_app': 'app-release.apk',
-    'url': 'https://github.com/christofferqa/empty_android_compose_activity.git',
-    'revision': '3c8111b8b7d6e9184049a07e2b96702d7b33d03e',
-    'folder': 'empty-compose-activity',
-  }),
-  # TODO(b/172539375): Monkey runner fails on recompilation.
-  App({
-    'id': 'com.google.firebase.example.fireeats',
-    'name': 'FriendlyEats',
-    'dump_app': 'dump_app.zip',
-    'apk_app': 'app-release-unsigned.apk',
-    'url': 'https://github.com/firebase/friendlyeats-android',
-    'revision': '7c6dd016fc31ea5ecb948d5166b8479efc3775cc',
-    'folder': 'friendlyeats',
-  }),
-  App({
-    'id': 'com.google.samples.apps.sunflower',
-    'name': 'Sunflower',
-    'dump_app': 'dump_app.zip',
-    'apk_app': 'app-debug.apk',
-    # TODO(b/172549283): Compiling tests fails
-    'id_test': 'com.google.samples.apps.sunflower.test',
-    'dump_test': 'dump_test.zip',
-    'apk_test': 'app-debug-androidTest.apk',
-    'url': 'https://github.com/android/sunflower',
-    'revision': '0c4c88fdad2a74791199dffd1a6559559b1dbd4a',
-    'folder': 'sunflower',
-  }),
-  # TODO(b/172565385): Monkey runner fails on recompilation
-  App({
-    'id': 'com.google.samples.apps.iosched',
-    'name': 'iosched',
-    'dump_app': 'dump_app.zip',
-    'apk_app': 'mobile-release.apk',
-    'url': 'https://github.com/christofferqa/iosched.git',
-    'revision': '581cbbe2253711775dbccb753cdb53e7e506cb02',
-    'folder': 'iosched',
-  }),
-  App({
-    'id': 'fr.neamar.kiss',
-    'name': 'KISS',
-    'dump_app': 'dump_app.zip',
-    'apk_app': 'app-release.apk',
-    # TODO(b/172569220): Running tests fails due to missing keep rules
-    'id_test': 'fr.neamar.kiss.test',
-    'dump_test': 'dump_test.zip',
-    'apk_test': 'app-release-androidTest.apk',
-    'url': 'https://github.com/Neamar/KISS',
-    'revision': '8ccffaadaf0d0b8fc4418ed2b4281a0935d3d971',
-    'folder': 'kiss',
-  }),
-  # TODO(b/172577344): Monkey runner not working.
-  App({
-    'id': 'io.github.hidroh.materialistic',
-    'name': 'materialistic',
-    'dump_app': 'dump_app.zip',
-    'apk_app': 'app-release.apk',
-    'url': 'https://github.com/christofferqa/materialistic.git',
-    'revision': '2b2b2ee25ce9e672d5aab1dc90a354af1522b1d9',
-    'folder': 'materialistic',
-  }),
-  App({
-    'id': 'com.avjindersinghsekhon.minimaltodo',
-    'name': 'MinimalTodo',
-    'dump_app': 'dump_app.zip',
-    'apk_app': 'app-release.apk',
-    'url': 'https://github.com/christofferqa/Minimal-Todo',
-    'revision': '9d8c73746762cd376b718858ec1e8783ca07ba7c',
-    'folder': 'minimal-todo',
-  }),
-  App({
-    'id': 'net.nurik.roman.muzei',
-    'name': 'muzei',
-    'dump_app': 'dump_app.zip',
-    'apk_app': 'muzei-release.apk',
-    'url': 'https://github.com/romannurik/muzei',
-    'revision': '9eac6e98aebeaf0ae40bdcd85f16dd2886551138',
-    'folder': 'muzei',
-  }),
-  # TODO(b/172806281): Monkey runner does not work.
-  App({
-    'id': 'org.schabi.newpipe',
-    'name': 'NewPipe',
-    'dump_app': 'dump_app.zip',
-    'apk_app': 'app-release-unsigned.apk',
-    'url': 'https://github.com/TeamNewPipe/NewPipe',
-    'revision': 'f4435f90313281beece70c544032f784418d85fa',
-    'folder': 'newpipe',
-  }),
-  # TODO(b/172806808): Monkey runner does not work.
-  App({
-    'id': 'io.rover.app.debug',
-    'name': 'Rover',
-    'dump_app': 'dump_app.zip',
-    'apk_app': 'example-app-release-unsigned.apk',
-    'url': 'https://github.com/RoverPlatform/rover-android',
-    'revision': '94342117097770ea3ca2c6df6ab496a1a55c3ce7',
-    'folder': 'rover-android',
-  }),
-  # TODO(b/172808159): Monkey runner does not work
-  App({
-    'id': 'com.google.android.apps.santatracker',
-    'name': 'SantaTracker',
-    'dump_app': 'dump_app.zip',
-    'apk_app': 'santa-tracker-release.apk',
-    'url': 'https://github.com/christofferqa/santa-tracker-android',
-    'revision': '8dee74be7d9ee33c69465a07088c53087d24a6dd',
-    'folder': 'santa-tracker',
-  }),
-  App({
-    'id': 'org.thoughtcrime.securesms',
-    'name': 'Signal',
-    'dump_app': 'dump_app.zip',
-    'apk_app': 'Signal-Android-play-prod-universal-release-4.76.2.apk',
-    # TODO(b/172812839): Instrumentation test fails.
-    'id_test': 'org.thoughtcrime.securesms.test',
-    'dump_test': 'dump_test.zip',
-    'apk_test': 'Signal-Android-play-prod-release-androidTest.apk',
-    'url': 'https://github.com/signalapp/Signal-Android',
-    'revision': '91ca19f294362ccee2c2b43c247eba228e2b30a1',
-    'folder': 'signal-android',
-  }),
-  # TODO(b/172815827): Monkey runner does not work
-  App({
-    'id': 'com.simplemobiletools.calendar.pro',
-    'name': 'Simple-Calendar',
-    'dump_app': 'dump_app.zip',
-    'apk_app': 'calendar-release.apk',
-    'url': 'https://github.com/SimpleMobileTools/Simple-Calendar',
-    'revision': '906209874d0a091c7fce5a57972472f272d6b068',
-    'folder': 'simple-calendar',
-  }),
-  # TODO(b/172815534): Monkey runner does not work
-  App({
-    'id': 'com.simplemobiletools.camera.pro',
-    'name': 'Simple-Camera',
-    'dump_app': 'dump_app.zip',
-    'apk_app': 'camera-release.apk',
-    'url': 'https://github.com/SimpleMobileTools/Simple-Camera',
-    'revision': 'ebf9820c51e960912b3238287e30a131244fdee6',
-    'folder': 'simple-camera',
-  }),
-  App({
-    'id': 'com.simplemobiletools.filemanager.pro',
-    'name': 'Simple-File-Manager',
-    'dump_app': 'dump_app.zip',
-    'apk_app': 'file-manager-release.apk',
-    'url': 'https://github.com/SimpleMobileTools/Simple-File-Manager',
-    'revision': '2b7fa68ea251222cc40cf6d62ad1de260a6f54d9',
-    'folder': 'simple-file-manager',
-  }),
-  App({
-    'id': 'com.simplemobiletools.gallery.pro',
-    'name': 'Simple-Gallery',
-    'dump_app': 'dump_app.zip',
-    'apk_app': 'gallery-326-foss-release.apk',
-    'url': 'https://github.com/SimpleMobileTools/Simple-Gallery',
-    'revision': '564e56b20d33b28d0018c8087ec705beeb60785e',
-    'folder': 'simple-gallery',
-  }),
-  App({
-    'id': 'com.example.sqldelight.hockey',
-    'name': 'SQLDelight',
-    'dump_app': 'dump_app.zip',
-    'apk_app': 'android-release.apk',
-    'url': 'https://github.com/christofferqa/sqldelight',
-    'revision': '2e67a1126b6df05e4119d1e3a432fde51d76cdc8',
-    'folder': 'sqldelight',
-  }),
-  # TODO(b/172824096): Monkey runner does not work.
-  App({
-    'id': 'eu.kanade.tachiyomi',
-    'name': 'Tachiyomi',
-    'dump_app': 'dump_app.zip',
-    'apk_app': 'app-dev-release.apk',
-    'url': 'https://github.com/inorichi/tachiyomi',
-    'revision': '8aa6486bf76ab9a61a5494bee284b1a5e9180bf3',
-    'folder': 'tachiyomi',
-  }),
-  # TODO(b/172862042): Monkey runner does not work.
-  App({
-    'id': 'app.tivi',
-    'name': 'Tivi',
-    'dump_app': 'dump_app.zip',
-    'apk_app': 'app-release.apk',
-    'url': 'https://github.com/chrisbanes/tivi',
-    'revision': '5c6d9ed338885c59b1fc64050d92d056417bb4de',
-    'folder': 'tivi',
-    'golem_duration': 300
-  }),
-  App({
-    'id': 'com.keylesspalace.tusky',
-    'name': 'Tusky',
-    'dump_app': 'dump_app.zip',
-    'apk_app': 'app-blue-release.apk',
-    'url': 'https://github.com/tuskyapp/Tusky',
-    'revision': '814a9b8f9bacf8d26f712b06a0313a3534a2be95',
-    'folder': 'tusky',
-  }),
-  App({
-    'id': 'org.wikipedia',
-    'name': 'Wikipedia',
-    'dump_app': 'dump_app.zip',
-    'apk_app': 'app-prod-release.apk',
-    'url': 'https://github.com/wikimedia/apps-android-wikipedia',
-    'revision': '0fa7cad843c66313be8e25790ef084cf1a1fa67e',
-    'folder': 'wikipedia',
-  }),
-  # TODO(b/173167253): Check if monkey testing works.
-  App({
-    'id': 'androidx.compose.samples.crane',
-    'name': 'compose-crane',
-    'collections': ['compose-samples'],
-    'dump_app': 'dump_app.zip',
-    'apk_app': 'app-release-unsigned.apk',
-    'url': 'https://github.com/android/compose-samples',
-    'revision': '779cf9e187b8ee2c6b620b2abb4524719b3f10f8',
-    'folder': 'android/compose-samples/crane',
-    'golem_duration': 240
-  }),
-  # TODO(b/173167253): Check if monkey testing works.
-  App({
-    'id': 'com.example.jetcaster',
-    'name': 'compose-jetcaster',
-    'collections': ['compose-samples'],
-    'dump_app': 'dump_app.zip',
-    'apk_app': 'app-release-unsigned.apk',
-    'url': 'https://github.com/android/compose-samples',
-    'revision': '779cf9e187b8ee2c6b620b2abb4524719b3f10f8',
-    'folder': 'android/compose-samples/jetcaster',
-  }),
-  # TODO(b/173167253): Check if monkey testing works.
-  App({
-    'id': 'com.example.compose.jetchat',
-    'name': 'compose-jetchat',
-    'collections': ['compose-samples'],
-    'dump_app': 'dump_app.zip',
-    'apk_app': 'app-release-unsigned.apk',
-    'url': 'https://github.com/android/compose-samples',
-    'revision': '779cf9e187b8ee2c6b620b2abb4524719b3f10f8',
-    'folder': 'android/compose-samples/jetchat',
-  }),
-  # TODO(b/173167253): Check if monkey testing works.
-  App({
-    'id': 'com.example.jetnews',
-    'name': 'compose-jetnews',
-    'collections': ['compose-samples'],
-    'dump_app': 'dump_app.zip',
-    'apk_app': 'app-release-unsigned.apk',
-    'url': 'https://github.com/android/compose-samples',
-    'revision': '779cf9e187b8ee2c6b620b2abb4524719b3f10f8',
-    'folder': 'android/compose-samples/jetnews',
-  }),
-  # TODO(b/173167253): Check if monkey testing works.
-  App({
-    'id': 'com.example.jetsnack',
-    'name': 'compose-jetsnack',
-    'collections': ['compose-samples'],
-    'dump_app': 'dump_app.zip',
-    'apk_app': 'app-release-unsigned.apk',
-    'url': 'https://github.com/android/compose-samples',
-    'revision': '779cf9e187b8ee2c6b620b2abb4524719b3f10f8',
-    'folder': 'android/compose-samples/jetsnack',
-  }),
-  # TODO(b/173167253): Check if monkey testing works.
-  App({
-    'id': 'com.example.compose.jetsurvey',
-    'name': 'compose-jetsurvey',
-    'collections': ['compose-samples'],
-    'dump_app': 'dump_app.zip',
-    'apk_app': 'app-release-unsigned.apk',
-    'url': 'https://github.com/android/compose-samples',
-    'revision': '779cf9e187b8ee2c6b620b2abb4524719b3f10f8',
-    'folder': 'android/compose-samples/jetsurvey',
-  }),
-  # TODO(b/173167253): Check if monkey testing works.
-  App({
-    'id': 'com.example.owl',
-    'name': 'compose-owl',
-    'collections': ['compose-samples'],
-    'dump_app': 'dump_app.zip',
-    'apk_app': 'app-release-unsigned.apk',
-    'url': 'https://github.com/android/compose-samples',
-    'revision': '779cf9e187b8ee2c6b620b2abb4524719b3f10f8',
-    'folder': 'android/compose-samples/owl',
-  }),
-  # TODO(b/173167253): Check if monkey testing works.
-  App({
-    'id': 'com.example.compose.rally',
-    'name': 'compose-rally',
-    'collections': ['compose-samples'],
-    'dump_app': 'dump_app.zip',
-    'apk_app': 'app-release-unsigned.apk',
-    'url': 'https://github.com/android/compose-samples',
-    'revision': '779cf9e187b8ee2c6b620b2abb4524719b3f10f8',
-    'folder': 'android/compose-samples/rally',
-  }),
+    App({
+        'id':
+            'com.numix.calculator',
+        'name':
+            'Calculator',
+        'dump_app':
+            'dump_app.zip',
+        'apk_app':
+            'app-release.apk',
+        # Compiling tests fail: Library class android.content.res.XmlResourceParser
+        # implements program class org.xmlpull.v1.XmlPullParser. Nothing to really
+        # do about that.
+        'id_test':
+            'com.numix.calculator.test',
+        'dump_test':
+            'dump_test.zip',
+        'apk_test':
+            'app-release-androidTest.apk',
+        'url':
+            'https://github.com/numixproject/android-suite/tree/master/Calculator',
+        'revision':
+            'f58e1b53f7278c9b675d5855842c6d8a44cccb1f',
+        'folder':
+            'android-suite-calculator',
+    }),
+    App({
+        'id': 'dev.dworks.apps.anexplorer.pro',
+        'name': 'AnExplorer',
+        'dump_app': 'dump_app.zip',
+        'apk_app': 'AnExplorer-googleMobileProRelease-4.0.3.apk',
+        'url': 'https://github.com/christofferqa/AnExplorer',
+        'revision': '365927477b8eab4052a1882d5e358057ae3dee4d',
+        'folder': 'anexplorer',
+    }),
+    App({
+        'id': 'de.danoeh.antennapod',
+        'name': 'AntennaPod',
+        'dump_app': 'dump_app.zip',
+        'apk_app': 'app-free-release.apk',
+        # TODO(b/172452102): Tests and monkey do not work
+        'id_test': 'de.danoeh.antennapod.test',
+        'dump_test': 'dump_test.zip',
+        'apk_test': 'app-free-release-androidTest.apk',
+        'url': 'https://github.com/christofferqa/AntennaPod.git',
+        'revision': '77e94f4783a16abe9cc5b78dc2d2b2b1867d8c06',
+        'folder': 'antennapod',
+    }),
+    App({
+        'id': 'com.example.applymapping',
+        'name': 'applymapping',
+        'dump_app': 'dump_app.zip',
+        'apk_app': 'app-release.apk',
+        'id_test': 'com.example.applymapping.test',
+        'dump_test': 'dump_test.zip',
+        'apk_test': 'app-release-androidTest.apk',
+        'url': 'https://github.com/mkj-gram/applymapping',
+        'revision': 'e3ae14b8c16fa4718e5dea8f7ad00937701b3c48',
+        'folder': 'applymapping',
+    }),
+    App({
+        'id':
+            'com.chanapps.four.activity',
+        'name':
+            'chanu',
+        'dump_app':
+            'dump_app.zip',
+        'apk_app':
+            'app-release.apk',
+        'url':
+            'https://github.com/mkj-gram/chanu.git',
+        'revision':
+            '6e53458f167b6d78398da60c20fd0da01a232617',
+        'folder':
+            'chanu',
+        # The app depends on a class file that has access flags interface but
+        # not abstract
+        'compiler_properties': [
+            '-Dcom.android.tools.r8.allowInvalidCfAccessFlags=true'
+        ]
+    }),
+    App({
+        'id': 'com.example.myapplication',
+        'name': 'empty-activity',
+        'dump_app': 'dump_app.zip',
+        'apk_app': 'app-release.apk',
+        'url': 'https://github.com/christofferqa/empty_android_activity.git',
+        'revision': '2d297ec3373dadb03cbae916b9feba4792563156',
+        'folder': 'empty-activity',
+    }),
+    App({
+        'id':
+            'com.example.emptycomposeactivity',
+        'name':
+            'empty-compose-activity',
+        'dump_app':
+            'dump_app.zip',
+        'apk_app':
+            'app-release.apk',
+        'url':
+            'https://github.com/christofferqa/empty_android_compose_activity.git',
+        'revision':
+            '3c8111b8b7d6e9184049a07e2b96702d7b33d03e',
+        'folder':
+            'empty-compose-activity',
+    }),
+    # TODO(b/172539375): Monkey runner fails on recompilation.
+    App({
+        'id': 'com.google.firebase.example.fireeats',
+        'name': 'FriendlyEats',
+        'dump_app': 'dump_app.zip',
+        'apk_app': 'app-release-unsigned.apk',
+        'url': 'https://github.com/firebase/friendlyeats-android',
+        'revision': '7c6dd016fc31ea5ecb948d5166b8479efc3775cc',
+        'folder': 'friendlyeats',
+    }),
+    App({
+        'id': 'com.google.samples.apps.sunflower',
+        'name': 'Sunflower',
+        'dump_app': 'dump_app.zip',
+        'apk_app': 'app-debug.apk',
+        # TODO(b/172549283): Compiling tests fails
+        'id_test': 'com.google.samples.apps.sunflower.test',
+        'dump_test': 'dump_test.zip',
+        'apk_test': 'app-debug-androidTest.apk',
+        'url': 'https://github.com/android/sunflower',
+        'revision': '0c4c88fdad2a74791199dffd1a6559559b1dbd4a',
+        'folder': 'sunflower',
+    }),
+    # TODO(b/172565385): Monkey runner fails on recompilation
+    App({
+        'id': 'com.google.samples.apps.iosched',
+        'name': 'iosched',
+        'dump_app': 'dump_app.zip',
+        'apk_app': 'mobile-release.apk',
+        'url': 'https://github.com/christofferqa/iosched.git',
+        'revision': '581cbbe2253711775dbccb753cdb53e7e506cb02',
+        'folder': 'iosched',
+    }),
+    App({
+        'id': 'fr.neamar.kiss',
+        'name': 'KISS',
+        'dump_app': 'dump_app.zip',
+        'apk_app': 'app-release.apk',
+        # TODO(b/172569220): Running tests fails due to missing keep rules
+        'id_test': 'fr.neamar.kiss.test',
+        'dump_test': 'dump_test.zip',
+        'apk_test': 'app-release-androidTest.apk',
+        'url': 'https://github.com/Neamar/KISS',
+        'revision': '8ccffaadaf0d0b8fc4418ed2b4281a0935d3d971',
+        'folder': 'kiss',
+    }),
+    # TODO(b/172577344): Monkey runner not working.
+    App({
+        'id': 'io.github.hidroh.materialistic',
+        'name': 'materialistic',
+        'dump_app': 'dump_app.zip',
+        'apk_app': 'app-release.apk',
+        'url': 'https://github.com/christofferqa/materialistic.git',
+        'revision': '2b2b2ee25ce9e672d5aab1dc90a354af1522b1d9',
+        'folder': 'materialistic',
+    }),
+    App({
+        'id': 'com.avjindersinghsekhon.minimaltodo',
+        'name': 'MinimalTodo',
+        'dump_app': 'dump_app.zip',
+        'apk_app': 'app-release.apk',
+        'url': 'https://github.com/christofferqa/Minimal-Todo',
+        'revision': '9d8c73746762cd376b718858ec1e8783ca07ba7c',
+        'folder': 'minimal-todo',
+    }),
+    App({
+        'id': 'net.nurik.roman.muzei',
+        'name': 'muzei',
+        'dump_app': 'dump_app.zip',
+        'apk_app': 'muzei-release.apk',
+        'url': 'https://github.com/romannurik/muzei',
+        'revision': '9eac6e98aebeaf0ae40bdcd85f16dd2886551138',
+        'folder': 'muzei',
+    }),
+    # TODO(b/172806281): Monkey runner does not work.
+    App({
+        'id': 'org.schabi.newpipe',
+        'name': 'NewPipe',
+        'dump_app': 'dump_app.zip',
+        'apk_app': 'app-release-unsigned.apk',
+        'url': 'https://github.com/TeamNewPipe/NewPipe',
+        'revision': 'f4435f90313281beece70c544032f784418d85fa',
+        'folder': 'newpipe',
+    }),
+    # TODO(b/172806808): Monkey runner does not work.
+    App({
+        'id': 'io.rover.app.debug',
+        'name': 'Rover',
+        'dump_app': 'dump_app.zip',
+        'apk_app': 'example-app-release-unsigned.apk',
+        'url': 'https://github.com/RoverPlatform/rover-android',
+        'revision': '94342117097770ea3ca2c6df6ab496a1a55c3ce7',
+        'folder': 'rover-android',
+    }),
+    # TODO(b/172808159): Monkey runner does not work
+    App({
+        'id': 'com.google.android.apps.santatracker',
+        'name': 'SantaTracker',
+        'dump_app': 'dump_app.zip',
+        'apk_app': 'santa-tracker-release.apk',
+        'url': 'https://github.com/christofferqa/santa-tracker-android',
+        'revision': '8dee74be7d9ee33c69465a07088c53087d24a6dd',
+        'folder': 'santa-tracker',
+    }),
+    App({
+        'id': 'org.thoughtcrime.securesms',
+        'name': 'Signal',
+        'dump_app': 'dump_app.zip',
+        'apk_app': 'Signal-Android-play-prod-universal-release-4.76.2.apk',
+        # TODO(b/172812839): Instrumentation test fails.
+        'id_test': 'org.thoughtcrime.securesms.test',
+        'dump_test': 'dump_test.zip',
+        'apk_test': 'Signal-Android-play-prod-release-androidTest.apk',
+        'url': 'https://github.com/signalapp/Signal-Android',
+        'revision': '91ca19f294362ccee2c2b43c247eba228e2b30a1',
+        'folder': 'signal-android',
+    }),
+    # TODO(b/172815827): Monkey runner does not work
+    App({
+        'id': 'com.simplemobiletools.calendar.pro',
+        'name': 'Simple-Calendar',
+        'dump_app': 'dump_app.zip',
+        'apk_app': 'calendar-release.apk',
+        'url': 'https://github.com/SimpleMobileTools/Simple-Calendar',
+        'revision': '906209874d0a091c7fce5a57972472f272d6b068',
+        'folder': 'simple-calendar',
+    }),
+    # TODO(b/172815534): Monkey runner does not work
+    App({
+        'id': 'com.simplemobiletools.camera.pro',
+        'name': 'Simple-Camera',
+        'dump_app': 'dump_app.zip',
+        'apk_app': 'camera-release.apk',
+        'url': 'https://github.com/SimpleMobileTools/Simple-Camera',
+        'revision': 'ebf9820c51e960912b3238287e30a131244fdee6',
+        'folder': 'simple-camera',
+    }),
+    App({
+        'id': 'com.simplemobiletools.filemanager.pro',
+        'name': 'Simple-File-Manager',
+        'dump_app': 'dump_app.zip',
+        'apk_app': 'file-manager-release.apk',
+        'url': 'https://github.com/SimpleMobileTools/Simple-File-Manager',
+        'revision': '2b7fa68ea251222cc40cf6d62ad1de260a6f54d9',
+        'folder': 'simple-file-manager',
+    }),
+    App({
+        'id': 'com.simplemobiletools.gallery.pro',
+        'name': 'Simple-Gallery',
+        'dump_app': 'dump_app.zip',
+        'apk_app': 'gallery-326-foss-release.apk',
+        'url': 'https://github.com/SimpleMobileTools/Simple-Gallery',
+        'revision': '564e56b20d33b28d0018c8087ec705beeb60785e',
+        'folder': 'simple-gallery',
+    }),
+    App({
+        'id': 'com.example.sqldelight.hockey',
+        'name': 'SQLDelight',
+        'dump_app': 'dump_app.zip',
+        'apk_app': 'android-release.apk',
+        'url': 'https://github.com/christofferqa/sqldelight',
+        'revision': '2e67a1126b6df05e4119d1e3a432fde51d76cdc8',
+        'folder': 'sqldelight',
+    }),
+    # TODO(b/172824096): Monkey runner does not work.
+    App({
+        'id': 'eu.kanade.tachiyomi',
+        'name': 'Tachiyomi',
+        'dump_app': 'dump_app.zip',
+        'apk_app': 'app-dev-release.apk',
+        'url': 'https://github.com/inorichi/tachiyomi',
+        'revision': '8aa6486bf76ab9a61a5494bee284b1a5e9180bf3',
+        'folder': 'tachiyomi',
+    }),
+    # TODO(b/172862042): Monkey runner does not work.
+    App({
+        'id': 'app.tivi',
+        'name': 'Tivi',
+        'dump_app': 'dump_app.zip',
+        'apk_app': 'app-release.apk',
+        'url': 'https://github.com/chrisbanes/tivi',
+        'revision': '5c6d9ed338885c59b1fc64050d92d056417bb4de',
+        'folder': 'tivi',
+        'golem_duration': 300
+    }),
+    App({
+        'id': 'com.keylesspalace.tusky',
+        'name': 'Tusky',
+        'dump_app': 'dump_app.zip',
+        'apk_app': 'app-blue-release.apk',
+        'url': 'https://github.com/tuskyapp/Tusky',
+        'revision': '814a9b8f9bacf8d26f712b06a0313a3534a2be95',
+        'folder': 'tusky',
+    }),
+    App({
+        'id': 'org.wikipedia',
+        'name': 'Wikipedia',
+        'dump_app': 'dump_app.zip',
+        'apk_app': 'app-prod-release.apk',
+        'url': 'https://github.com/wikimedia/apps-android-wikipedia',
+        'revision': '0fa7cad843c66313be8e25790ef084cf1a1fa67e',
+        'folder': 'wikipedia',
+    }),
+    # TODO(b/173167253): Check if monkey testing works.
+    App({
+        'id': 'androidx.compose.samples.crane',
+        'name': 'compose-crane',
+        'collections': ['compose-samples'],
+        'dump_app': 'dump_app.zip',
+        'apk_app': 'app-release-unsigned.apk',
+        'url': 'https://github.com/android/compose-samples',
+        'revision': '779cf9e187b8ee2c6b620b2abb4524719b3f10f8',
+        'folder': 'android/compose-samples/crane',
+        'golem_duration': 240
+    }),
+    # TODO(b/173167253): Check if monkey testing works.
+    App({
+        'id': 'com.example.jetcaster',
+        'name': 'compose-jetcaster',
+        'collections': ['compose-samples'],
+        'dump_app': 'dump_app.zip',
+        'apk_app': 'app-release-unsigned.apk',
+        'url': 'https://github.com/android/compose-samples',
+        'revision': '779cf9e187b8ee2c6b620b2abb4524719b3f10f8',
+        'folder': 'android/compose-samples/jetcaster',
+    }),
+    # TODO(b/173167253): Check if monkey testing works.
+    App({
+        'id': 'com.example.compose.jetchat',
+        'name': 'compose-jetchat',
+        'collections': ['compose-samples'],
+        'dump_app': 'dump_app.zip',
+        'apk_app': 'app-release-unsigned.apk',
+        'url': 'https://github.com/android/compose-samples',
+        'revision': '779cf9e187b8ee2c6b620b2abb4524719b3f10f8',
+        'folder': 'android/compose-samples/jetchat',
+    }),
+    # TODO(b/173167253): Check if monkey testing works.
+    App({
+        'id': 'com.example.jetnews',
+        'name': 'compose-jetnews',
+        'collections': ['compose-samples'],
+        'dump_app': 'dump_app.zip',
+        'apk_app': 'app-release-unsigned.apk',
+        'url': 'https://github.com/android/compose-samples',
+        'revision': '779cf9e187b8ee2c6b620b2abb4524719b3f10f8',
+        'folder': 'android/compose-samples/jetnews',
+    }),
+    # TODO(b/173167253): Check if monkey testing works.
+    App({
+        'id': 'com.example.jetsnack',
+        'name': 'compose-jetsnack',
+        'collections': ['compose-samples'],
+        'dump_app': 'dump_app.zip',
+        'apk_app': 'app-release-unsigned.apk',
+        'url': 'https://github.com/android/compose-samples',
+        'revision': '779cf9e187b8ee2c6b620b2abb4524719b3f10f8',
+        'folder': 'android/compose-samples/jetsnack',
+    }),
+    # TODO(b/173167253): Check if monkey testing works.
+    App({
+        'id': 'com.example.compose.jetsurvey',
+        'name': 'compose-jetsurvey',
+        'collections': ['compose-samples'],
+        'dump_app': 'dump_app.zip',
+        'apk_app': 'app-release-unsigned.apk',
+        'url': 'https://github.com/android/compose-samples',
+        'revision': '779cf9e187b8ee2c6b620b2abb4524719b3f10f8',
+        'folder': 'android/compose-samples/jetsurvey',
+    }),
+    # TODO(b/173167253): Check if monkey testing works.
+    App({
+        'id': 'com.example.owl',
+        'name': 'compose-owl',
+        'collections': ['compose-samples'],
+        'dump_app': 'dump_app.zip',
+        'apk_app': 'app-release-unsigned.apk',
+        'url': 'https://github.com/android/compose-samples',
+        'revision': '779cf9e187b8ee2c6b620b2abb4524719b3f10f8',
+        'folder': 'android/compose-samples/owl',
+    }),
+    # TODO(b/173167253): Check if monkey testing works.
+    App({
+        'id': 'com.example.compose.rally',
+        'name': 'compose-rally',
+        'collections': ['compose-samples'],
+        'dump_app': 'dump_app.zip',
+        'apk_app': 'app-release-unsigned.apk',
+        'url': 'https://github.com/android/compose-samples',
+        'revision': '779cf9e187b8ee2c6b620b2abb4524719b3f10f8',
+        'folder': 'android/compose-samples/rally',
+    }),
 ]
 
-
-APP_COLLECTIONS = [
-  AppCollection({
+APP_COLLECTIONS = [AppCollection({
     'name': 'compose-samples',
-  })
-]
+})]
 
 
 def remove_print_lines(file):
-  with open(file) as f:
-    lines = f.readlines()
-  with open(file, 'w') as f:
-    for line in lines:
-      if '-printconfiguration' not in line:
-        f.write(line)
+    with open(file) as f:
+        lines = f.readlines()
+    with open(file, 'w') as f:
+        for line in lines:
+            if '-printconfiguration' not in line:
+                f.write(line)
 
 
 def download_sha(app_sha, internal, quiet=False):
-  if internal:
-    utils.DownloadFromX20(app_sha)
-  else:
-    utils.DownloadFromGoogleCloudStorage(app_sha, quiet=quiet)
+    if internal:
+        utils.DownloadFromX20(app_sha)
+    else:
+        utils.DownloadFromGoogleCloudStorage(app_sha, quiet=quiet)
 
 
 def is_logging_enabled_for(app, options):
-  if options.no_logging:
-    return False
-  if options.app_logging_filter and app.name not in options.app_logging_filter:
-    return False
-  return True
+    if options.no_logging:
+        return False
+    if options.app_logging_filter and app.name not in options.app_logging_filter:
+        return False
+    return True
 
 
 def is_minified_r8(shrinker):
-  return '-nolib' not in shrinker
+    return '-nolib' not in shrinker
 
 
 def is_full_r8(shrinker):
-  return '-full' in shrinker
+    return '-full' in shrinker
 
 
 def version_is_built_jar(version):
-  return version != 'main' and version != 'source'
+    return version != 'main' and version != 'source'
 
 
 def compute_size_of_dex_files_in_package(path):
-  dex_size = 0
-  z = zipfile.ZipFile(path, 'r')
-  for filename in z.namelist():
-    if filename.endswith('.dex'):
-      dex_size += z.getinfo(filename).file_size
-  return dex_size
+    dex_size = 0
+    z = zipfile.ZipFile(path, 'r')
+    for filename in z.namelist():
+        if filename.endswith('.dex'):
+            dex_size += z.getinfo(filename).file_size
+    return dex_size
 
 
 def dump_for_app(app_dir, app):
-  return os.path.join(app_dir, app.dump_app)
+    return os.path.join(app_dir, app.dump_app)
 
 
 def dump_test_for_app(app_dir, app):
-  return os.path.join(app_dir, app.dump_test)
+    return os.path.join(app_dir, app.dump_test)
 
 
 def get_r8_jar(options, temp_dir, shrinker):
-  if (options.version == 'source'):
-    return None
-  jar = os.path.abspath(
-      os.path.join(
-          temp_dir,
-          '..',
-          'r8lib.jar' if is_minified_r8(shrinker) else 'r8.jar'))
-  return jar
+    if (options.version == 'source'):
+        return None
+    jar = os.path.abspath(
+        os.path.join(temp_dir, '..',
+                     'r8lib.jar' if is_minified_r8(shrinker) else 'r8.jar'))
+    return jar
 
 
 def get_results_for_app(app, options, temp_dir, worker_id):
-  app_folder = app.folder if app.folder else app.name + "_" + app.revision
-  # Golem extraction will extract to the basename under the benchmarks dir.
-  app_location = os.path.basename(app_folder) if options.golem else app_folder
-  opensource_basedir = (os.path.join('benchmarks', app.name) if options.golem
-                        else utils.OPENSOURCE_DUMPS_DIR)
-  app_dir = (os.path.join(utils.INTERNAL_DUMPS_DIR, app_location) if app.internal
-              else os.path.join(opensource_basedir, app_location))
-  if not os.path.exists(app_dir) and not options.golem:
-    # Download the app from google storage.
-    download_sha(app_dir + ".tar.gz.sha1", app.internal)
+    app_folder = app.folder if app.folder else app.name + "_" + app.revision
+    # Golem extraction will extract to the basename under the benchmarks dir.
+    app_location = os.path.basename(app_folder) if options.golem else app_folder
+    opensource_basedir = (os.path.join('benchmarks', app.name)
+                          if options.golem else utils.OPENSOURCE_DUMPS_DIR)
+    app_dir = (os.path.join(utils.INTERNAL_DUMPS_DIR, app_location) if
+               app.internal else os.path.join(opensource_basedir, app_location))
+    if not os.path.exists(app_dir) and not options.golem:
+        # Download the app from google storage.
+        download_sha(app_dir + ".tar.gz.sha1", app.internal)
 
-  # Ensure that the dumps are in place
-  assert os.path.isfile(dump_for_app(app_dir, app)), "Could not find dump " \
-                                                     "for app " + app.name
+    # Ensure that the dumps are in place
+    assert os.path.isfile(dump_for_app(app_dir, app)), "Could not find dump " \
+                                                       "for app " + app.name
 
-  result = {}
-  result['status'] = 'success'
-  result_per_shrinker = build_app_with_shrinkers(
-    app, options, temp_dir, app_dir, worker_id=worker_id)
-  for shrinker, shrinker_result in result_per_shrinker.items():
-    result[shrinker] = shrinker_result
-  return result
+    result = {}
+    result['status'] = 'success'
+    result_per_shrinker = build_app_with_shrinkers(app,
+                                                   options,
+                                                   temp_dir,
+                                                   app_dir,
+                                                   worker_id=worker_id)
+    for shrinker, shrinker_result in result_per_shrinker.items():
+        result[shrinker] = shrinker_result
+    return result
 
 
 def build_app_with_shrinkers(app, options, temp_dir, app_dir, worker_id):
-  result_per_shrinker = {}
-  for shrinker in options.shrinker:
-    results = []
-    build_app_and_run_with_shrinker(
-      app, options, temp_dir, app_dir, shrinker, results, worker_id=worker_id)
-    result_per_shrinker[shrinker] = results
-  if len(options.apps) > 1:
-    print_thread('', worker_id)
-    log_results_for_app(app, result_per_shrinker, options, worker_id=worker_id)
-    print_thread('', worker_id)
+    result_per_shrinker = {}
+    for shrinker in options.shrinker:
+        results = []
+        build_app_and_run_with_shrinker(app,
+                                        options,
+                                        temp_dir,
+                                        app_dir,
+                                        shrinker,
+                                        results,
+                                        worker_id=worker_id)
+        result_per_shrinker[shrinker] = results
+    if len(options.apps) > 1:
+        print_thread('', worker_id)
+        log_results_for_app(app,
+                            result_per_shrinker,
+                            options,
+                            worker_id=worker_id)
+        print_thread('', worker_id)
 
-  return result_per_shrinker
+    return result_per_shrinker
 
 
 def is_last_build(index, compilation_steps):
-  return index == compilation_steps - 1
+    return index == compilation_steps - 1
 
 
 def build_app_and_run_with_shrinker(app, options, temp_dir, app_dir, shrinker,
                                     results, worker_id):
-  print_thread(
-      '[{}] Building {} with {}'.format(
-          datetime.now().strftime("%H:%M:%S"),
-          app.name,
-          shrinker),
-      worker_id)
-  print_thread(
-      'To compile locally: '
-          'tools/run_on_app_dump.py --shrinker {} --r8-compilation-steps {} '
-          '--app {} --minify {} --optimize {} --shrink {}'.format(
-              shrinker,
-              options.r8_compilation_steps,
-              app.name,
-              options.minify,
-              options.optimize,
-              options.shrink),
-      worker_id)
-  print_thread(
-      'HINT: use --shrinker r8-nolib --no-build if you have a local R8.jar',
-      worker_id)
-  recomp_jar = None
-  status = 'success'
-  if options.r8_compilation_steps < 1:
-    return
-  compilation_steps = 1 if app.skip_recompilation else options.r8_compilation_steps
-  for compilation_step in range(0, compilation_steps):
-    if status != 'success':
-      break
     print_thread(
-        'Compiling {} of {}'.format(compilation_step + 1, compilation_steps),
+        '[{}] Building {} with {}'.format(datetime.now().strftime("%H:%M:%S"),
+                                          app.name, shrinker), worker_id)
+    print_thread(
+        'To compile locally: '
+        'tools/run_on_app_dump.py --shrinker {} --r8-compilation-steps {} '
+        '--app {} --minify {} --optimize {} --shrink {}'.format(
+            shrinker, options.r8_compilation_steps, app.name, options.minify,
+            options.optimize, options.shrink), worker_id)
+    print_thread(
+        'HINT: use --shrinker r8-nolib --no-build if you have a local R8.jar',
         worker_id)
-    result = {}
-    try:
-      start = time.time()
-      (app_jar, mapping, new_recomp_jar) = \
-        build_app_with_shrinker(
-          app, options, temp_dir, app_dir, shrinker, compilation_step,
-          compilation_steps, recomp_jar, worker_id=worker_id)
-      end = time.time()
-      dex_size = compute_size_of_dex_files_in_package(app_jar)
-      result['build_status'] = 'success'
-      result['recompilation_status'] = 'success'
-      result['output_jar'] = app_jar
-      result['output_mapping'] = mapping
-      result['dex_size'] = dex_size
-      result['duration'] = int((end - start) * 1000)  # Wall time
-      if (new_recomp_jar is None
-          and not is_last_build(compilation_step, compilation_steps)):
-        result['recompilation_status'] = 'failed'
-        warn('Failed to build {} with {}'.format(app.name, shrinker))
-      recomp_jar = new_recomp_jar
-    except Exception as e:
-      warn('Failed to build {} with {}'.format(app.name, shrinker))
-      if e:
-        print_thread('Error: ' + str(e), worker_id)
-      result['build_status'] = 'failed'
-      status = 'failed'
+    recomp_jar = None
+    status = 'success'
+    if options.r8_compilation_steps < 1:
+        return
+    compilation_steps = 1 if app.skip_recompilation else options.r8_compilation_steps
+    for compilation_step in range(0, compilation_steps):
+        if status != 'success':
+            break
+        print_thread(
+            'Compiling {} of {}'.format(compilation_step + 1,
+                                        compilation_steps), worker_id)
+        result = {}
+        try:
+            start = time.time()
+            (app_jar, mapping, new_recomp_jar) = \
+              build_app_with_shrinker(
+                app, options, temp_dir, app_dir, shrinker, compilation_step,
+                compilation_steps, recomp_jar, worker_id=worker_id)
+            end = time.time()
+            dex_size = compute_size_of_dex_files_in_package(app_jar)
+            result['build_status'] = 'success'
+            result['recompilation_status'] = 'success'
+            result['output_jar'] = app_jar
+            result['output_mapping'] = mapping
+            result['dex_size'] = dex_size
+            result['duration'] = int((end - start) * 1000)  # Wall time
+            if (new_recomp_jar is None and
+                    not is_last_build(compilation_step, compilation_steps)):
+                result['recompilation_status'] = 'failed'
+                warn('Failed to build {} with {}'.format(app.name, shrinker))
+            recomp_jar = new_recomp_jar
+        except Exception as e:
+            warn('Failed to build {} with {}'.format(app.name, shrinker))
+            if e:
+                print_thread('Error: ' + str(e), worker_id)
+            result['build_status'] = 'failed'
+            status = 'failed'
 
-    original_app_apk = os.path.join(app_dir, app.apk_app)
-    app_apk_destination = os.path.join(
-      temp_dir,"{}_{}.apk".format(app.id, compilation_step))
+        original_app_apk = os.path.join(app_dir, app.apk_app)
+        app_apk_destination = os.path.join(
+            temp_dir, "{}_{}.apk".format(app.id, compilation_step))
 
-    if result.get('build_status') == 'success' and options.monkey:
-      # Make a copy of the given APK, move the newly generated dex files into the
-      # copied APK, and then sign the APK.
-      apk_masseur.masseur(
-        original_app_apk, dex=app_jar, resources='META-INF/services/*',
-        out=app_apk_destination,
-        quiet=options.quiet, logging=is_logging_enabled_for(app, options),
-        keystore=options.keystore)
+        if result.get('build_status') == 'success' and options.monkey:
+            # Make a copy of the given APK, move the newly generated dex files into the
+            # copied APK, and then sign the APK.
+            apk_masseur.masseur(original_app_apk,
+                                dex=app_jar,
+                                resources='META-INF/services/*',
+                                out=app_apk_destination,
+                                quiet=options.quiet,
+                                logging=is_logging_enabled_for(app, options),
+                                keystore=options.keystore)
 
-      result['monkey_status'] = 'success' if adb.run_monkey(
-        app.id, options.emulator_id, app_apk_destination, options.monkey_events,
-        options.quiet, is_logging_enabled_for(app, options)) else 'failed'
+            result['monkey_status'] = 'success' if adb.run_monkey(
+                app.id, options.emulator_id, app_apk_destination,
+                options.monkey_events, options.quiet,
+                is_logging_enabled_for(app, options)) else 'failed'
 
-    if (result.get('build_status') == 'success'
-        and options.run_tests and app.dump_test):
-      if not os.path.isfile(app_apk_destination):
-        apk_masseur.masseur(
-          original_app_apk, dex=app_jar, resources='META-INF/services/*',
-          out=app_apk_destination,
-          quiet=options.quiet, logging=is_logging_enabled_for(app, options),
-          keystore=options.keystore)
+        if (result.get('build_status') == 'success' and options.run_tests and
+                app.dump_test):
+            if not os.path.isfile(app_apk_destination):
+                apk_masseur.masseur(original_app_apk,
+                                    dex=app_jar,
+                                    resources='META-INF/services/*',
+                                    out=app_apk_destination,
+                                    quiet=options.quiet,
+                                    logging=is_logging_enabled_for(
+                                        app, options),
+                                    keystore=options.keystore)
 
-      # Compile the tests with the mapping file.
-      test_jar = build_test_with_shrinker(
-        app, options, temp_dir, app_dir,shrinker, compilation_step,
-        result['output_mapping'])
-      if not test_jar:
-        result['instrumentation_test_status'] = 'compilation_failed'
-      else:
-        original_test_apk = os.path.join(app_dir, app.apk_test)
-        test_apk_destination = os.path.join(
-          temp_dir,"{}_{}.test.apk".format(app.id_test, compilation_step))
-        apk_masseur.masseur(
-          original_test_apk, dex=test_jar, resources='META-INF/services/*',
-          out=test_apk_destination,
-          quiet=options.quiet, logging=is_logging_enabled_for(app, options),
-          keystore=options.keystore)
-        result['instrumentation_test_status'] = 'success' if adb.run_instrumented(
-          app.id, app.id_test, options.emulator_id, app_apk_destination,
-          test_apk_destination, options.quiet,
-          is_logging_enabled_for(app, options)) else 'failed'
+            # Compile the tests with the mapping file.
+            test_jar = build_test_with_shrinker(app, options, temp_dir, app_dir,
+                                                shrinker, compilation_step,
+                                                result['output_mapping'])
+            if not test_jar:
+                result['instrumentation_test_status'] = 'compilation_failed'
+            else:
+                original_test_apk = os.path.join(app_dir, app.apk_test)
+                test_apk_destination = os.path.join(
+                    temp_dir, "{}_{}.test.apk".format(app.id_test,
+                                                      compilation_step))
+                apk_masseur.masseur(original_test_apk,
+                                    dex=test_jar,
+                                    resources='META-INF/services/*',
+                                    out=test_apk_destination,
+                                    quiet=options.quiet,
+                                    logging=is_logging_enabled_for(
+                                        app, options),
+                                    keystore=options.keystore)
+                result[
+                    'instrumentation_test_status'] = 'success' if adb.run_instrumented(
+                        app.id, app.id_test, options.emulator_id,
+                        app_apk_destination,
+                        test_apk_destination, options.quiet,
+                        is_logging_enabled_for(app, options)) else 'failed'
 
-    results.append(result)
-    if result.get('recompilation_status') != 'success':
-      break
+        results.append(result)
+        if result.get('recompilation_status') != 'success':
+            break
+
 
 def get_jdk_home(options, app):
-  if options.golem:
-    return os.path.join('benchmarks', app.name, 'linux')
-  return None
+    if options.golem:
+        return os.path.join('benchmarks', app.name, 'linux')
+    return None
+
 
 def build_app_with_shrinker(app, options, temp_dir, app_dir, shrinker,
                             compilation_step_index, compilation_steps,
                             prev_recomp_jar, worker_id):
-  def config_files_consumer(files):
-    for file in files:
-      compiledump.clean_config(file, options)
-      remove_print_lines(file)
-  args = AttrDict({
-    'dump': dump_for_app(app_dir, app),
-    'r8_jar': get_r8_jar(options, temp_dir, shrinker),
-    'r8_flags': options.r8_flags,
-    'disable_assertions': options.disable_assertions,
-    'version': options.version,
-    'compiler': 'r8full' if is_full_r8(shrinker) else 'r8',
-    'debug_agent': options.debug_agent,
-    'program_jar': prev_recomp_jar,
-    'nolib': not is_minified_r8(shrinker),
-    'config_files_consumer': config_files_consumer,
-    'properties': app.compiler_properties,
-    'disable_desugared_lib': False,
-    'print_times': options.print_times,
-  })
 
-  app_jar = os.path.join(
-    temp_dir, '{}_{}_{}_dex_out.jar'.format(
-      app.name, shrinker, compilation_step_index))
-  app_mapping = os.path.join(
-    temp_dir, '{}_{}_{}_dex_out.jar.map'.format(
-      app.name, shrinker, compilation_step_index))
-  recomp_jar = None
-  jdkhome = get_jdk_home(options, app)
-  with utils.TempDir() as compile_temp_dir:
-    compile_result = compiledump.run1(
-        compile_temp_dir, args, [], jdkhome, worker_id=worker_id)
-    out_jar = os.path.join(compile_temp_dir, "out.jar")
-    out_mapping = os.path.join(compile_temp_dir, "out.jar.map")
+    def config_files_consumer(files):
+        for file in files:
+            compiledump.clean_config(file, options)
+            remove_print_lines(file)
 
-    if compile_result != 0 or not os.path.isfile(out_jar):
-      assert False, 'Compilation of {} failed'.format(dump_for_app(app_dir, app))
-    shutil.move(out_jar, app_jar)
-    shutil.move(out_mapping, app_mapping)
+    args = AttrDict({
+        'dump': dump_for_app(app_dir, app),
+        'r8_jar': get_r8_jar(options, temp_dir, shrinker),
+        'r8_flags': options.r8_flags,
+        'disable_assertions': options.disable_assertions,
+        'version': options.version,
+        'compiler': 'r8full' if is_full_r8(shrinker) else 'r8',
+        'debug_agent': options.debug_agent,
+        'program_jar': prev_recomp_jar,
+        'nolib': not is_minified_r8(shrinker),
+        'config_files_consumer': config_files_consumer,
+        'properties': app.compiler_properties,
+        'disable_desugared_lib': False,
+        'print_times': options.print_times,
+    })
 
-    if compilation_step_index < compilation_steps - 1:
-      args['classfile'] = True
-      args['min_api'] = "10000"
-      args['disable_desugared_lib'] = True
-      compile_result = compiledump.run1(compile_temp_dir, args, [], jdkhome)
-      if compile_result == 0:
-        recomp_jar = os.path.join(
-          temp_dir, '{}_{}_{}_cf_out.jar'.format(
-            app.name, shrinker, compilation_step_index))
-        shutil.move(out_jar, recomp_jar)
+    app_jar = os.path.join(
+        temp_dir, '{}_{}_{}_dex_out.jar'.format(app.name, shrinker,
+                                                compilation_step_index))
+    app_mapping = os.path.join(
+        temp_dir, '{}_{}_{}_dex_out.jar.map'.format(app.name, shrinker,
+                                                    compilation_step_index))
+    recomp_jar = None
+    jdkhome = get_jdk_home(options, app)
+    with utils.TempDir() as compile_temp_dir:
+        compile_result = compiledump.run1(compile_temp_dir,
+                                          args, [],
+                                          jdkhome,
+                                          worker_id=worker_id)
+        out_jar = os.path.join(compile_temp_dir, "out.jar")
+        out_mapping = os.path.join(compile_temp_dir, "out.jar.map")
 
-  return (app_jar, app_mapping, recomp_jar)
+        if compile_result != 0 or not os.path.isfile(out_jar):
+            assert False, 'Compilation of {} failed'.format(
+                dump_for_app(app_dir, app))
+        shutil.move(out_jar, app_jar)
+        shutil.move(out_mapping, app_mapping)
+
+        if compilation_step_index < compilation_steps - 1:
+            args['classfile'] = True
+            args['min_api'] = "10000"
+            args['disable_desugared_lib'] = True
+            compile_result = compiledump.run1(compile_temp_dir, args, [],
+                                              jdkhome)
+            if compile_result == 0:
+                recomp_jar = os.path.join(
+                    temp_dir,
+                    '{}_{}_{}_cf_out.jar'.format(app.name, shrinker,
+                                                 compilation_step_index))
+                shutil.move(out_jar, recomp_jar)
+
+    return (app_jar, app_mapping, recomp_jar)
 
 
 def build_test_with_shrinker(app, options, temp_dir, app_dir, shrinker,
                              compilation_step_index, mapping):
 
-  def rewrite_files(files):
-    add_applymapping = True
-    for file in files:
-      compiledump.clean_config(file, options)
-      remove_print_lines(file)
-      with open(file) as f:
-        lines = f.readlines()
-      with open(file, 'w') as f:
-        for line in lines:
-          if '-applymapping' not in line:
-            f.write(line + '\n')
-        if add_applymapping:
-          f.write("-applymapping " + mapping + '\n')
-          add_applymapping = False
+    def rewrite_files(files):
+        add_applymapping = True
+        for file in files:
+            compiledump.clean_config(file, options)
+            remove_print_lines(file)
+            with open(file) as f:
+                lines = f.readlines()
+            with open(file, 'w') as f:
+                for line in lines:
+                    if '-applymapping' not in line:
+                        f.write(line + '\n')
+                if add_applymapping:
+                    f.write("-applymapping " + mapping + '\n')
+                    add_applymapping = False
 
-  args = AttrDict({
-    'dump': dump_test_for_app(app_dir, app),
-    'r8_jar': get_r8_jar(options, temp_dir, shrinker),
-    'disable_assertions': options.disable_assertions,
-    'version': options.version,
-    'compiler': 'r8full' if is_full_r8(shrinker) else 'r8',
-    'debug_agent': options.debug_agent,
-    'nolib': not is_minified_r8(shrinker),
-    # The config file will have an -applymapping reference to an old map.
-    # Update it to point to mapping file build in the compilation of the app.
-    'config_files_consumer': rewrite_files,
-  })
+    args = AttrDict({
+        'dump': dump_test_for_app(app_dir, app),
+        'r8_jar': get_r8_jar(options, temp_dir, shrinker),
+        'disable_assertions': options.disable_assertions,
+        'version': options.version,
+        'compiler': 'r8full' if is_full_r8(shrinker) else 'r8',
+        'debug_agent': options.debug_agent,
+        'nolib': not is_minified_r8(shrinker),
+        # The config file will have an -applymapping reference to an old map.
+        # Update it to point to mapping file build in the compilation of the app.
+        'config_files_consumer': rewrite_files,
+    })
 
-  test_jar = os.path.join(
-    temp_dir, '{}_{}_{}_test_out.jar'.format(
-      app.name, shrinker, compilation_step_index))
+    test_jar = os.path.join(
+        temp_dir, '{}_{}_{}_test_out.jar'.format(app.name, shrinker,
+                                                 compilation_step_index))
 
-  with utils.TempDir() as compile_temp_dir:
-    jdkhome = get_jdk_home(options, app)
-    compile_result = compiledump.run1(compile_temp_dir, args, [], jdkhome)
-    out_jar = os.path.join(compile_temp_dir, "out.jar")
-    if compile_result != 0 or not os.path.isfile(out_jar):
-      return None
-    shutil.move(out_jar, test_jar)
+    with utils.TempDir() as compile_temp_dir:
+        jdkhome = get_jdk_home(options, app)
+        compile_result = compiledump.run1(compile_temp_dir, args, [], jdkhome)
+        out_jar = os.path.join(compile_temp_dir, "out.jar")
+        if compile_result != 0 or not os.path.isfile(out_jar):
+            return None
+        shutil.move(out_jar, test_jar)
 
-  return test_jar
+    return test_jar
 
 
 def log_results_for_apps(result_per_shrinker_per_app, options):
-  print('')
-  app_errors = 0
-  for (app, result_per_shrinker) in result_per_shrinker_per_app:
-    app_errors += (1 if log_results_for_app(app, result_per_shrinker, options)
-                   else 0)
-  return app_errors
+    print('')
+    app_errors = 0
+    for (app, result_per_shrinker) in result_per_shrinker_per_app:
+        app_errors += (1 if log_results_for_app(app, result_per_shrinker,
+                                                options) else 0)
+    return app_errors
 
 
 def log_results_for_app(app, result_per_shrinker, options, worker_id=None):
-  if options.print_dexsegments:
-    log_segments_for_app(app, result_per_shrinker, options, worker_id=worker_id)
-    return False
-  else:
-    return log_comparison_results_for_app(app, result_per_shrinker, options, worker_id=worker_id)
+    if options.print_dexsegments:
+        log_segments_for_app(app,
+                             result_per_shrinker,
+                             options,
+                             worker_id=worker_id)
+        return False
+    else:
+        return log_comparison_results_for_app(app,
+                                              result_per_shrinker,
+                                              options,
+                                              worker_id=worker_id)
 
 
 def log_segments_for_app(app, result_per_shrinker, options, worker_id):
-  for shrinker in SHRINKERS:
-    if shrinker not in result_per_shrinker:
-      continue
-    for result in result_per_shrinker.get(shrinker):
-      benchmark_name = '{}-{}'.format(options.print_dexsegments, app.name)
-      utils.print_dexsegments(
-        benchmark_name, [result.get('output_jar')], worker_id=worker_id)
-      duration = result.get('duration')
-      print_thread(
-        '%s-Total(RunTimeRaw): %s ms' % (benchmark_name, duration),
-        worker_id)
-      print_thread(
-        '%s-Total(CodeSize): %s' % (benchmark_name, result.get('dex_size')),
-        worker_id)
+    for shrinker in SHRINKERS:
+        if shrinker not in result_per_shrinker:
+            continue
+        for result in result_per_shrinker.get(shrinker):
+            benchmark_name = '{}-{}'.format(options.print_dexsegments, app.name)
+            utils.print_dexsegments(benchmark_name, [result.get('output_jar')],
+                                    worker_id=worker_id)
+            duration = result.get('duration')
+            print_thread(
+                '%s-Total(RunTimeRaw): %s ms' % (benchmark_name, duration),
+                worker_id)
+            print_thread(
+                '%s-Total(CodeSize): %s' %
+                (benchmark_name, result.get('dex_size')), worker_id)
 
 
 def percentage_diff_as_string(before, after):
-  if after < before:
-    return '-' + str(round((1.0 - after / before) * 100)) + '%'
-  else:
-    return '+' + str(round((after - before) / before * 100)) + '%'
+    if after < before:
+        return '-' + str(round((1.0 - after / before) * 100)) + '%'
+    else:
+        return '+' + str(round((after - before) / before * 100)) + '%'
 
 
-def log_comparison_results_for_app(app, result_per_shrinker, options, worker_id):
-  print_thread(app.name + ':', worker_id)
-  app_error = False
-  if result_per_shrinker.get('status', 'success') != 'success':
-    error_message = result_per_shrinker.get('error_message')
-    print_thread('  skipped ({})'.format(error_message), worker_id)
-    return
+def log_comparison_results_for_app(app, result_per_shrinker, options,
+                                   worker_id):
+    print_thread(app.name + ':', worker_id)
+    app_error = False
+    if result_per_shrinker.get('status', 'success') != 'success':
+        error_message = result_per_shrinker.get('error_message')
+        print_thread('  skipped ({})'.format(error_message), worker_id)
+        return
 
-  proguard_result = result_per_shrinker.get('pg', {})
-  proguard_dex_size = float(proguard_result.get('dex_size', -1))
+    proguard_result = result_per_shrinker.get('pg', {})
+    proguard_dex_size = float(proguard_result.get('dex_size', -1))
 
-  for shrinker in SHRINKERS:
-    if shrinker not in result_per_shrinker:
-      continue
-    compilation_index = 1
-    for result in result_per_shrinker.get(shrinker):
-      build_status = result.get('build_status')
-      if build_status != 'success' and build_status is not None:
-        app_error = True
-        warn('  {}-#{}: {}'.format(shrinker, compilation_index, build_status))
-        continue
+    for shrinker in SHRINKERS:
+        if shrinker not in result_per_shrinker:
+            continue
+        compilation_index = 1
+        for result in result_per_shrinker.get(shrinker):
+            build_status = result.get('build_status')
+            if build_status != 'success' and build_status is not None:
+                app_error = True
+                warn('  {}-#{}: {}'.format(shrinker, compilation_index,
+                                           build_status))
+                continue
 
-      if options.golem:
-        print_thread(
-          '%s(RunTimeRaw): %s ms' % (app.name, result.get('duration')),
-          worker_id)
-        print_thread(
-          '%s(CodeSize): %s' % (app.name, result.get('dex_size')), worker_id)
-        continue
+            if options.golem:
+                print_thread(
+                    '%s(RunTimeRaw): %s ms' %
+                    (app.name, result.get('duration')), worker_id)
+                print_thread(
+                    '%s(CodeSize): %s' % (app.name, result.get('dex_size')),
+                    worker_id)
+                continue
 
-      print_thread('  {}-#{}:'.format(shrinker, compilation_index), worker_id)
-      dex_size = result.get('dex_size')
-      msg = '    dex size: {}'.format(dex_size)
-      if options.print_runtimeraw:
-        print_thread(
-            '    run time raw: {} ms'.format(result.get('duration')), worker_id)
-      if dex_size != proguard_dex_size and proguard_dex_size >= 0:
-        msg = '{} ({}, {})'.format(
-          msg, dex_size - proguard_dex_size,
-          percentage_diff_as_string(proguard_dex_size, dex_size))
-        success(msg) if dex_size < proguard_dex_size else warn(msg)
-      else:
-        print_thread(msg, worker_id)
+            print_thread('  {}-#{}:'.format(shrinker, compilation_index),
+                         worker_id)
+            dex_size = result.get('dex_size')
+            msg = '    dex size: {}'.format(dex_size)
+            if options.print_runtimeraw:
+                print_thread(
+                    '    run time raw: {} ms'.format(result.get('duration')),
+                    worker_id)
+            if dex_size != proguard_dex_size and proguard_dex_size >= 0:
+                msg = '{} ({}, {})'.format(
+                    msg, dex_size - proguard_dex_size,
+                    percentage_diff_as_string(proguard_dex_size, dex_size))
+                success(msg) if dex_size < proguard_dex_size else warn(msg)
+            else:
+                print_thread(msg, worker_id)
 
-      if options.monkey:
-        monkey_status = result.get('monkey_status')
-        if monkey_status != 'success':
-          app_error = True
-          warn('    monkey: {}'.format(monkey_status))
-        else:
-          success('    monkey: {}'.format(monkey_status))
+            if options.monkey:
+                monkey_status = result.get('monkey_status')
+                if monkey_status != 'success':
+                    app_error = True
+                    warn('    monkey: {}'.format(monkey_status))
+                else:
+                    success('    monkey: {}'.format(monkey_status))
 
-      if options.run_tests and 'instrumentation_test_status' in result:
-        test_status = result.get('instrumentation_test_status')
-        if test_status != 'success':
-          warn('    instrumentation_tests: {}'.format(test_status))
-        else:
-          success('    instrumentation_tests: {}'.format(test_status))
+            if options.run_tests and 'instrumentation_test_status' in result:
+                test_status = result.get('instrumentation_test_status')
+                if test_status != 'success':
+                    warn('    instrumentation_tests: {}'.format(test_status))
+                else:
+                    success('    instrumentation_tests: {}'.format(test_status))
 
-      recompilation_status = result.get('recompilation_status', '')
-      if recompilation_status == 'failed':
-        app_error = True
-        warn('    recompilation {}-#{}: failed'.format(shrinker,
-                                                       compilation_index))
-        continue
+            recompilation_status = result.get('recompilation_status', '')
+            if recompilation_status == 'failed':
+                app_error = True
+                warn('    recompilation {}-#{}: failed'.format(
+                    shrinker, compilation_index))
+                continue
 
-      compilation_index += 1
+            compilation_index += 1
 
-  return app_error
+    return app_error
 
 
 def parse_options(argv):
-  result = argparse.ArgumentParser(description = 'Run/compile dump artifacts.')
-  result.add_argument('--app',
-                      help='What app to run on',
-                      choices=[app.name for app in APPS],
-                      action='append')
-  result.add_argument('--app-collection', '--app_collection',
-                      help='What app collection to run',
-                      choices=[collection.name for collection in
-                               APP_COLLECTIONS],
-                      action='append')
-  result.add_argument('--app-logging-filter', '--app_logging_filter',
-                      help='The apps for which to turn on logging',
-                      action='append')
-  result.add_argument('--bot',
-                      help='Running on bot, use third_party dependency.',
-                      default=False,
-                      action='store_true')
-  result.add_argument('--generate-golem-config', '--generate_golem_config',
-                      help='Generate a new config for golem.',
-                      default=False,
-                      action='store_true')
-  result.add_argument('--debug-agent',
-                      help='Enable Java debug agent and suspend compilation '
-                           '(default disabled)',
-                      default=False,
-                      action='store_true')
-  result.add_argument('--disable-assertions', '--disable_assertions', '-da',
-                      help='Disable Java assertions when running the compiler '
-                           '(default enabled)',
-                      default=False,
-                      action='store_true')
-  result.add_argument('--emulator-id', '--emulator_id',
-                      help='Id of the emulator to use',
-                      default='emulator-5554')
-  result.add_argument('--golem',
-                      help='Running on golem, do not download',
-                      default=False,
-                      action='store_true')
-  result.add_argument('--hash',
-                      help='The commit of R8 to use')
-  result.add_argument('--internal',
-                      help='Run internal apps if set, otherwise run opensource',
-                      default=False,
-                      action='store_true')
-  result.add_argument('--keystore',
-                      help='Path to app.keystore',
-                      default=os.path.join(utils.TOOLS_DIR, 'debug.keystore'))
-  result.add_argument('--keystore-password', '--keystore_password',
-                      help='Password for app.keystore',
-                      default='android')
-  result.add_argument('--minify',
-                      help='Force enable/disable minification' +
-                           ' (defaults to app proguard config)',
-                      choices=['default', 'force-enable', 'force-disable'],
-                      default='default')
-  result.add_argument('--monkey',
-                      help='Whether to install and run app(s) with monkey',
-                      default=False,
-                      action='store_true')
-  result.add_argument('--monkey-events', '--monkey_events',
-                      help='Number of events that the monkey should trigger',
-                      default=250,
-                      type=int)
-  result.add_argument('--no-build', '--no_build',
-                      help='Run without building first (only when using ToT)',
-                      default=False,
-                      action='store_true')
-  result.add_argument('--no-logging', '--no_logging',
-                      help='Disable logging except for errors',
-                      default=False,
-                      action='store_true')
-  result.add_argument('--optimize',
-                      help='Force enable/disable optimizations' +
-                           ' (defaults to app proguard config)',
-                      choices=['default', 'force-enable', 'force-disable'],
-                      default='default')
-  result.add_argument('--print-times',
-                      help='Print timing information from r8',
-                      default=False,
-                      action='store_true')
-  result.add_argument('--print-dexsegments',
-                      metavar='BENCHMARKNAME',
-                      help='Print the sizes of individual dex segments as ' +
-                           '\'<BENCHMARKNAME>-<APP>-<segment>(CodeSize): '
-                           '<bytes>\'')
-  result.add_argument('--print-runtimeraw',
-                      metavar='BENCHMARKNAME',
-                      help='Print the line \'<BENCHMARKNAME>(RunTimeRaw):' +
-                           ' <elapsed> ms\' at the end where <elapsed> is' +
-                           ' the elapsed time in milliseconds.')
-  result.add_argument('--quiet',
-                      help='Disable verbose logging',
-                      default=False,
-                      action='store_true')
-  result.add_argument('--r8-compilation-steps', '--r8_compilation_steps',
-                      help='Number of times R8 should be run on each app',
-                      default=2,
-                      type=int)
-  result.add_argument('--r8-flags', '--r8_flags',
-                      help='Additional option(s) for the compiler.')
-  result.add_argument('--run-tests', '--run_tests',
-                      help='Whether to run instrumentation tests',
-                      default=False,
-                      action='store_true')
-  result.add_argument('--shrink',
-                      help='Force enable/disable shrinking' +
-                           ' (defaults to app proguard config)',
-                      choices=['default', 'force-enable', 'force-disable'],
-                      default='default')
-  result.add_argument('--sign-apks', '--sign_apks',
-                      help='Whether the APKs should be signed',
-                      default=False,
-                      action='store_true')
-  result.add_argument('--shrinker',
-                      help='The shrinkers to use (by default, all are run)',
-                      action='append')
-  result.add_argument('--temp',
-                      help='A directory to use for temporaries and outputs.',
-                      default=None)
-  result.add_argument('--version',
-                      default='main',
-                      help='The version of R8 to use (e.g., 1.4.51)')
-  result.add_argument('--workers',
-                      help='Number of workers to use',
-                      default=1,
-                      type=int)
-  (options, args) = result.parse_known_args(argv)
+    result = argparse.ArgumentParser(description='Run/compile dump artifacts.')
+    result.add_argument('--app',
+                        help='What app to run on',
+                        choices=[app.name for app in APPS],
+                        action='append')
+    result.add_argument(
+        '--app-collection',
+        '--app_collection',
+        help='What app collection to run',
+        choices=[collection.name for collection in APP_COLLECTIONS],
+        action='append')
+    result.add_argument('--app-logging-filter',
+                        '--app_logging_filter',
+                        help='The apps for which to turn on logging',
+                        action='append')
+    result.add_argument('--bot',
+                        help='Running on bot, use third_party dependency.',
+                        default=False,
+                        action='store_true')
+    result.add_argument('--generate-golem-config',
+                        '--generate_golem_config',
+                        help='Generate a new config for golem.',
+                        default=False,
+                        action='store_true')
+    result.add_argument('--debug-agent',
+                        help='Enable Java debug agent and suspend compilation '
+                        '(default disabled)',
+                        default=False,
+                        action='store_true')
+    result.add_argument(
+        '--disable-assertions',
+        '--disable_assertions',
+        '-da',
+        help='Disable Java assertions when running the compiler '
+        '(default enabled)',
+        default=False,
+        action='store_true')
+    result.add_argument('--emulator-id',
+                        '--emulator_id',
+                        help='Id of the emulator to use',
+                        default='emulator-5554')
+    result.add_argument('--golem',
+                        help='Running on golem, do not download',
+                        default=False,
+                        action='store_true')
+    result.add_argument('--hash', help='The commit of R8 to use')
+    result.add_argument(
+        '--internal',
+        help='Run internal apps if set, otherwise run opensource',
+        default=False,
+        action='store_true')
+    result.add_argument('--keystore',
+                        help='Path to app.keystore',
+                        default=os.path.join(utils.TOOLS_DIR, 'debug.keystore'))
+    result.add_argument('--keystore-password',
+                        '--keystore_password',
+                        help='Password for app.keystore',
+                        default='android')
+    result.add_argument('--minify',
+                        help='Force enable/disable minification' +
+                        ' (defaults to app proguard config)',
+                        choices=['default', 'force-enable', 'force-disable'],
+                        default='default')
+    result.add_argument('--monkey',
+                        help='Whether to install and run app(s) with monkey',
+                        default=False,
+                        action='store_true')
+    result.add_argument('--monkey-events',
+                        '--monkey_events',
+                        help='Number of events that the monkey should trigger',
+                        default=250,
+                        type=int)
+    result.add_argument('--no-build',
+                        '--no_build',
+                        help='Run without building first (only when using ToT)',
+                        default=False,
+                        action='store_true')
+    result.add_argument('--no-logging',
+                        '--no_logging',
+                        help='Disable logging except for errors',
+                        default=False,
+                        action='store_true')
+    result.add_argument('--optimize',
+                        help='Force enable/disable optimizations' +
+                        ' (defaults to app proguard config)',
+                        choices=['default', 'force-enable', 'force-disable'],
+                        default='default')
+    result.add_argument('--print-times',
+                        help='Print timing information from r8',
+                        default=False,
+                        action='store_true')
+    result.add_argument('--print-dexsegments',
+                        metavar='BENCHMARKNAME',
+                        help='Print the sizes of individual dex segments as ' +
+                        '\'<BENCHMARKNAME>-<APP>-<segment>(CodeSize): '
+                        '<bytes>\'')
+    result.add_argument('--print-runtimeraw',
+                        metavar='BENCHMARKNAME',
+                        help='Print the line \'<BENCHMARKNAME>(RunTimeRaw):' +
+                        ' <elapsed> ms\' at the end where <elapsed> is' +
+                        ' the elapsed time in milliseconds.')
+    result.add_argument('--quiet',
+                        help='Disable verbose logging',
+                        default=False,
+                        action='store_true')
+    result.add_argument('--r8-compilation-steps',
+                        '--r8_compilation_steps',
+                        help='Number of times R8 should be run on each app',
+                        default=2,
+                        type=int)
+    result.add_argument('--r8-flags',
+                        '--r8_flags',
+                        help='Additional option(s) for the compiler.')
+    result.add_argument('--run-tests',
+                        '--run_tests',
+                        help='Whether to run instrumentation tests',
+                        default=False,
+                        action='store_true')
+    result.add_argument('--shrink',
+                        help='Force enable/disable shrinking' +
+                        ' (defaults to app proguard config)',
+                        choices=['default', 'force-enable', 'force-disable'],
+                        default='default')
+    result.add_argument('--sign-apks',
+                        '--sign_apks',
+                        help='Whether the APKs should be signed',
+                        default=False,
+                        action='store_true')
+    result.add_argument('--shrinker',
+                        help='The shrinkers to use (by default, all are run)',
+                        action='append')
+    result.add_argument('--temp',
+                        help='A directory to use for temporaries and outputs.',
+                        default=None)
+    result.add_argument('--version',
+                        default='main',
+                        help='The version of R8 to use (e.g., 1.4.51)')
+    result.add_argument('--workers',
+                        help='Number of workers to use',
+                        default=1,
+                        type=int)
+    (options, args) = result.parse_known_args(argv)
 
-  if options.app or options.app_collection:
-    if not options.app:
-      options.app = []
-    if not options.app_collection:
-      options.app_collection = []
-    options.apps = [
-        app
-        for app in APPS
-        if app.name in options.app
-           or any(collection in options.app_collection
-                  for collection in app.collections)]
-    del options.app
-    del options.app_collection
-  else:
-    options.apps = [app for app in APPS if app.internal == options.internal]
+    if options.app or options.app_collection:
+        if not options.app:
+            options.app = []
+        if not options.app_collection:
+            options.app_collection = []
+        options.apps = [
+            app for app in APPS if app.name in options.app or any(
+                collection in options.app_collection
+                for collection in app.collections)
+        ]
+        del options.app
+        del options.app_collection
+    else:
+        options.apps = [app for app in APPS if app.internal == options.internal]
 
-  if options.app_logging_filter:
-    for app_name in options.app_logging_filter:
-      assert any(app.name == app_name for app in options.apps)
-  if options.shrinker:
-    for shrinker in options.shrinker:
-      assert shrinker in SHRINKERS, (
-          'Shrinker must be one of %s' % ', '.join(SHRINKERS))
-  else:
-    options.shrinker = [shrinker for shrinker in SHRINKERS]
+    if options.app_logging_filter:
+        for app_name in options.app_logging_filter:
+            assert any(app.name == app_name for app in options.apps)
+    if options.shrinker:
+        for shrinker in options.shrinker:
+            assert shrinker in SHRINKERS, ('Shrinker must be one of %s' %
+                                           ', '.join(SHRINKERS))
+    else:
+        options.shrinker = [shrinker for shrinker in SHRINKERS]
 
-  if options.hash or version_is_built_jar(options.version):
-    # No need to build R8 if a specific version should be used.
-    options.no_build = True
-    if 'r8-nolib' in options.shrinker:
-      warn('Skipping shrinker r8-nolib because a specific version '
-           + 'of r8 was specified')
-      options.shrinker.remove('r8-nolib')
-    if 'r8-nolib-full' in options.shrinker:
-      warn('Skipping shrinker r8-nolib-full because a specific version '
-           + 'of r8 was specified')
-      options.shrinker.remove('r8-nolib-full')
-  return (options, args)
+    if options.hash or version_is_built_jar(options.version):
+        # No need to build R8 if a specific version should be used.
+        options.no_build = True
+        if 'r8-nolib' in options.shrinker:
+            warn('Skipping shrinker r8-nolib because a specific version ' +
+                 'of r8 was specified')
+            options.shrinker.remove('r8-nolib')
+        if 'r8-nolib-full' in options.shrinker:
+            warn('Skipping shrinker r8-nolib-full because a specific version ' +
+                 'of r8 was specified')
+            options.shrinker.remove('r8-nolib-full')
+    return (options, args)
 
 
 def print_indented(s, indent):
-  print(' ' * indent + s)
+    print(' ' * indent + s)
 
 
 def get_sha256(gz_file):
-  with open(gz_file, 'rb') as f:
-    bytes = f.read() # read entire file as bytes
-    return hashlib.sha256(bytes).hexdigest();
+    with open(gz_file, 'rb') as f:
+        bytes = f.read()  # read entire file as bytes
+        return hashlib.sha256(bytes).hexdigest()
 
 
 def get_sha_from_file(sha_file):
-  with open(sha_file, 'r') as f:
-    return f.readlines()[0]
+    with open(sha_file, 'r') as f:
+        return f.readlines()[0]
 
 
 def print_golem_config(options):
-  print('// AUTOGENERATED FILE from tools/run_on_app_dump.py in R8 repo')
-  print('part of r8_config;')
-  print('')
-  print('final Suite dumpsSuite = Suite("OpenSourceAppDumps");')
-  print('')
-  print('createOpenSourceAppBenchmarks() {')
-  print_indented('final cpus = ["Lenovo M90"];', 2)
-  print_indented('final targetsCompat = ["R8"];', 2)
-  print_indented('final targetsFull = ["R8-full-minify-optimize-shrink"];', 2)
-  # Avoid calculating this for every app
-  jdk_gz = jdk.GetJdkHome() + '.tar.gz'
-  add_golem_resource(2, jdk_gz, 'openjdk')
-  for app in options.apps:
-    if app.folder and not app.internal:
-      indentation = 2;
-      print_indented('{', indentation)
-      indentation = 4
-      print_indented('final name = "%s";' % app.name, indentation)
-      print_indented('final benchmark =', indentation)
-      print_indented(
-          'StandardBenchmark(name, [Metric.RunTimeRaw, Metric.CodeSize]);',
-          indentation + 4)
-      if app.golem_duration != None:
-        print_indented(
-            'final timeout = const Duration(seconds: %s);' % app.golem_duration,
-            indentation)
-        print_indented(
-            'ExecutionManagement.addTimeoutConstraint'
-            '(timeout, benchmark: benchmark);', indentation)
-      app_gz = os.path.join(utils.OPENSOURCE_DUMPS_DIR, app.folder + '.tar.gz')
-      name = 'appResource'
-      add_golem_resource(indentation, app_gz, name)
-      print_golem_config_target('Compat', 'r8', app, indentation)
-      print_golem_config_target(
-        'Full',
-        'r8-full',
-        app,
-        indentation,
-        minify='force-enable',
-        optimize='force-enable',
-        shrink='force-enable')
-      print_indented('dumpsSuite.addBenchmark(name);', indentation)
-      indentation = 2
-      print_indented('}', indentation)
-  print('}')
+    print('// AUTOGENERATED FILE from tools/run_on_app_dump.py in R8 repo')
+    print('part of r8_config;')
+    print('')
+    print('final Suite dumpsSuite = Suite("OpenSourceAppDumps");')
+    print('')
+    print('createOpenSourceAppBenchmarks() {')
+    print_indented('final cpus = ["Lenovo M90"];', 2)
+    print_indented('final targetsCompat = ["R8"];', 2)
+    print_indented('final targetsFull = ["R8-full-minify-optimize-shrink"];', 2)
+    # Avoid calculating this for every app
+    jdk_gz = jdk.GetJdkHome() + '.tar.gz'
+    add_golem_resource(2, jdk_gz, 'openjdk')
+    for app in options.apps:
+        if app.folder and not app.internal:
+            indentation = 2
+            print_indented('{', indentation)
+            indentation = 4
+            print_indented('final name = "%s";' % app.name, indentation)
+            print_indented('final benchmark =', indentation)
+            print_indented(
+                'StandardBenchmark(name, [Metric.RunTimeRaw, Metric.CodeSize]);',
+                indentation + 4)
+            if app.golem_duration != None:
+                print_indented(
+                    'final timeout = const Duration(seconds: %s);' %
+                    app.golem_duration, indentation)
+                print_indented(
+                    'ExecutionManagement.addTimeoutConstraint'
+                    '(timeout, benchmark: benchmark);', indentation)
+            app_gz = os.path.join(utils.OPENSOURCE_DUMPS_DIR,
+                                  app.folder + '.tar.gz')
+            name = 'appResource'
+            add_golem_resource(indentation, app_gz, name)
+            print_golem_config_target('Compat', 'r8', app, indentation)
+            print_golem_config_target('Full',
+                                      'r8-full',
+                                      app,
+                                      indentation,
+                                      minify='force-enable',
+                                      optimize='force-enable',
+                                      shrink='force-enable')
+            print_indented('dumpsSuite.addBenchmark(name);', indentation)
+            indentation = 2
+            print_indented('}', indentation)
+    print('}')
 
-def print_golem_config_target(
-    target, shrinker, app, indentation,
-    minify='default', optimize='default', shrink='default'):
-  options="options" + target
-  print_indented(
-      'final %s = benchmark.addTargets(noImplementation, targets%s);'
-        % (options, target),
-      indentation)
-  print_indented('%s.cpus = cpus;' % options, indentation)
-  print_indented('%s.isScript = true;' % options, indentation)
-  print_indented('%s.fromRevision = 9700;' % options, indentation);
-  print_indented('%s.mainFile = "tools/run_on_app_dump.py "' % options,
-                 indentation)
-  print_indented('"--golem --disable-assertions --quiet --shrinker %s --app %s "'
-                   % (shrinker, app.name),
-                 indentation + 4)
-  print_indented('"--minify %s --optimize %s --shrink %s";'
-                   % (minify, optimize, shrink),
-                 indentation + 4)
-  print_indented('%s.resources.add(appResource);' % options, indentation)
-  print_indented('%s.resources.add(openjdk);' % options, indentation)
+
+def print_golem_config_target(target,
+                              shrinker,
+                              app,
+                              indentation,
+                              minify='default',
+                              optimize='default',
+                              shrink='default'):
+    options = "options" + target
+    print_indented(
+        'final %s = benchmark.addTargets(noImplementation, targets%s);' %
+        (options, target), indentation)
+    print_indented('%s.cpus = cpus;' % options, indentation)
+    print_indented('%s.isScript = true;' % options, indentation)
+    print_indented('%s.fromRevision = 9700;' % options, indentation)
+    print_indented('%s.mainFile = "tools/run_on_app_dump.py "' % options,
+                   indentation)
+    print_indented(
+        '"--golem --disable-assertions --quiet --shrinker %s --app %s "' %
+        (shrinker, app.name), indentation + 4)
+    print_indented(
+        '"--minify %s --optimize %s --shrink %s";' % (minify, optimize, shrink),
+        indentation + 4)
+    print_indented('%s.resources.add(appResource);' % options, indentation)
+    print_indented('%s.resources.add(openjdk);' % options, indentation)
+
 
 def add_golem_resource(indentation, gz, name, sha256=None):
-  sha = gz + '.sha1'
-  if not sha256:
-    # Golem uses a sha256 of the file in the cache, and you need to specify that.
-    download_sha(sha, False, quiet=True)
-    sha256 = get_sha256(gz)
-  sha = get_sha_from_file(sha)
-  print_indented('final %s = BenchmarkResource("",' % name, indentation)
-  print_indented('type: BenchmarkResourceType.storage,', indentation + 4)
-  print_indented('uri: "gs://r8-deps/%s",' % sha, indentation + 4)
-  # Make dart formatter happy.
-  if indentation > 2:
-    print_indented('hash:', indentation + 4)
-    print_indented('"%s",' % sha256, indentation + 8)
-  else:
-    print_indented('hash: "%s",' % sha256, indentation + 4)
-  print_indented('extract: "gz");', indentation + 4);
+    sha = gz + '.sha1'
+    if not sha256:
+        # Golem uses a sha256 of the file in the cache, and you need to specify that.
+        download_sha(sha, False, quiet=True)
+        sha256 = get_sha256(gz)
+    sha = get_sha_from_file(sha)
+    print_indented('final %s = BenchmarkResource("",' % name, indentation)
+    print_indented('type: BenchmarkResourceType.storage,', indentation + 4)
+    print_indented('uri: "gs://r8-deps/%s",' % sha, indentation + 4)
+    # Make dart formatter happy.
+    if indentation > 2:
+        print_indented('hash:', indentation + 4)
+        print_indented('"%s",' % sha256, indentation + 8)
+    else:
+        print_indented('hash: "%s",' % sha256, indentation + 4)
+    print_indented('extract: "gz");', indentation + 4)
+
 
 def main(argv):
-  (options, args) = parse_options(argv)
+    (options, args) = parse_options(argv)
 
-  if options.bot:
-    options.no_logging = True
-    options.shrinker = ['r8', 'r8-full']
-    print(options.shrinker)
+    if options.bot:
+        options.no_logging = True
+        options.shrinker = ['r8', 'r8-full']
+        print(options.shrinker)
 
-  if options.golem:
-    options.disable_assertions = True
-    options.no_build = True
-    options.r8_compilation_steps = 1
-    options.quiet = True
-    options.no_logging = True
+    if options.golem:
+        options.disable_assertions = True
+        options.no_build = True
+        options.r8_compilation_steps = 1
+        options.quiet = True
+        options.no_logging = True
 
-  if options.generate_golem_config:
-    print_golem_config(options)
-    return 0
+    if options.generate_golem_config:
+        print_golem_config(options)
+        return 0
 
-  with utils.TempDir() as temp_dir:
-    if options.temp:
-      temp_dir = options.temp
-      os.makedirs(temp_dir, exist_ok=True)
-    if options.hash:
-      # Download r8-<hash>.jar from
-      # https://storage.googleapis.com/r8-releases/raw/.
-      target = 'r8-{}.jar'.format(options.hash)
-      update_prebuilds_in_android.download_hash(
-        temp_dir, 'com/android/tools/r8/' + options.hash, target)
-      as_utils.MoveFile(
-        os.path.join(temp_dir, target), os.path.join(temp_dir, 'r8lib.jar'),
-        quiet=options.quiet)
-    elif version_is_built_jar(options.version):
-        # Download r8-<version>.jar from
-        # https://storage.googleapis.com/r8-releases/raw/.
-        target = 'r8-{}.jar'.format(options.version)
-        update_prebuilds_in_android.download_version(
-          temp_dir, 'com/android/tools/r8/' + options.version, target)
-        as_utils.MoveFile(
-          os.path.join(temp_dir, target), os.path.join(temp_dir, 'r8lib.jar'),
-          quiet=options.quiet)
-    elif options.version == 'main':
-      if not options.no_build:
-        gradle.RunGradle([utils.GRADLE_TASK_RETRACE, utils.GRADLE_TASK_R8,
-                          '-Pno_internal'])
-        build_r8lib = False
-        for shrinker in options.shrinker:
-          if is_minified_r8(shrinker):
-            build_r8lib = True
-        if build_r8lib:
-          gradle.RunGradle([utils.GRADLE_TASK_R8LIB, '-Pno_internal'])
-      # Make a copy of r8.jar and r8lib.jar such that they stay the same for
-      # the entire execution of this script.
-      if 'r8-nolib' in options.shrinker or 'r8-nolib-full' in options.shrinker:
-        assert os.path.isfile(utils.R8_JAR), 'Cannot build without r8.jar'
-        shutil.copyfile(utils.R8_JAR, os.path.join(temp_dir, 'r8.jar'))
-      if 'r8' in options.shrinker or 'r8-full' in options.shrinker:
-        assert os.path.isfile(utils.R8LIB_JAR), 'Cannot build without r8lib.jar'
-        shutil.copyfile(utils.R8LIB_JAR, os.path.join(temp_dir, 'r8lib.jar'))
+    with utils.TempDir() as temp_dir:
+        if options.temp:
+            temp_dir = options.temp
+            os.makedirs(temp_dir, exist_ok=True)
+        if options.hash:
+            # Download r8-<hash>.jar from
+            # https://storage.googleapis.com/r8-releases/raw/.
+            target = 'r8-{}.jar'.format(options.hash)
+            update_prebuilds_in_android.download_hash(
+                temp_dir, 'com/android/tools/r8/' + options.hash, target)
+            as_utils.MoveFile(os.path.join(temp_dir, target),
+                              os.path.join(temp_dir, 'r8lib.jar'),
+                              quiet=options.quiet)
+        elif version_is_built_jar(options.version):
+            # Download r8-<version>.jar from
+            # https://storage.googleapis.com/r8-releases/raw/.
+            target = 'r8-{}.jar'.format(options.version)
+            update_prebuilds_in_android.download_version(
+                temp_dir, 'com/android/tools/r8/' + options.version, target)
+            as_utils.MoveFile(os.path.join(temp_dir, target),
+                              os.path.join(temp_dir, 'r8lib.jar'),
+                              quiet=options.quiet)
+        elif options.version == 'main':
+            if not options.no_build:
+                gradle.RunGradle([
+                    utils.GRADLE_TASK_RETRACE, utils.GRADLE_TASK_R8,
+                    '-Pno_internal'
+                ])
+                build_r8lib = False
+                for shrinker in options.shrinker:
+                    if is_minified_r8(shrinker):
+                        build_r8lib = True
+                if build_r8lib:
+                    gradle.RunGradle([utils.GRADLE_TASK_R8LIB, '-Pno_internal'])
+            # Make a copy of r8.jar and r8lib.jar such that they stay the same for
+            # the entire execution of this script.
+            if 'r8-nolib' in options.shrinker or 'r8-nolib-full' in options.shrinker:
+                assert os.path.isfile(
+                    utils.R8_JAR), 'Cannot build without r8.jar'
+                shutil.copyfile(utils.R8_JAR, os.path.join(temp_dir, 'r8.jar'))
+            if 'r8' in options.shrinker or 'r8-full' in options.shrinker:
+                assert os.path.isfile(
+                    utils.R8LIB_JAR), 'Cannot build without r8lib.jar'
+                shutil.copyfile(utils.R8LIB_JAR,
+                                os.path.join(temp_dir, 'r8lib.jar'))
 
-    jobs = []
-    result_per_shrinker_per_app = []
-    for app in options.apps:
-      if app.skip:
-        continue
-      result = {}
-      result_per_shrinker_per_app.append((app, result))
-      jobs.append(create_job(app, options, result, temp_dir))
-    thread_utils.run_in_parallel(
-        jobs,
-        number_of_workers=options.workers,
-        stop_on_first_failure=False)
-    errors = log_results_for_apps(result_per_shrinker_per_app, options)
-    if errors > 0:
-      dest = 'gs://r8-test-results/r8-libs/' + str(int(time.time()))
-      utils.upload_file_to_cloud_storage(os.path.join(temp_dir, 'r8lib.jar'), dest)
-      print('R8lib saved to %s' % dest)
-    return errors
+        jobs = []
+        result_per_shrinker_per_app = []
+        for app in options.apps:
+            if app.skip:
+                continue
+            result = {}
+            result_per_shrinker_per_app.append((app, result))
+            jobs.append(create_job(app, options, result, temp_dir))
+        thread_utils.run_in_parallel(jobs,
+                                     number_of_workers=options.workers,
+                                     stop_on_first_failure=False)
+        errors = log_results_for_apps(result_per_shrinker_per_app, options)
+        if errors > 0:
+            dest = 'gs://r8-test-results/r8-libs/' + str(int(time.time()))
+            utils.upload_file_to_cloud_storage(
+                os.path.join(temp_dir, 'r8lib.jar'), dest)
+            print('R8lib saved to %s' % dest)
+        return errors
+
 
 def create_job(app, options, result, temp_dir):
-  return lambda worker_id: run_job(
-      app, options, result, temp_dir, worker_id)
+    return lambda worker_id: run_job(app, options, result, temp_dir, worker_id)
+
 
 def run_job(app, options, result, temp_dir, worker_id):
-  job_temp_dir = os.path.join(temp_dir, str(worker_id or 0))
-  os.makedirs(job_temp_dir, exist_ok=True)
-  result.update(get_results_for_app(app, options, job_temp_dir, worker_id))
-  return 0
+    job_temp_dir = os.path.join(temp_dir, str(worker_id or 0))
+    os.makedirs(job_temp_dir, exist_ok=True)
+    result.update(get_results_for_app(app, options, job_temp_dir, worker_id))
+    return 0
+
 
 def success(message):
-  CGREEN = '\033[32m'
-  CEND = '\033[0m'
-  print(CGREEN + message + CEND)
+    CGREEN = '\033[32m'
+    CEND = '\033[0m'
+    print(CGREEN + message + CEND)
 
 
 def warn(message):
-  CRED = '\033[91m'
-  CEND = '\033[0m'
-  print(CRED + message + CEND)
+    CRED = '\033[91m'
+    CEND = '\033[0m'
+    print(CRED + message + CEND)
 
 
 if __name__ == '__main__':
-  sys.exit(main(sys.argv[1:]))
+    sys.exit(main(sys.argv[1:]))
