Minor updates to startup scripts

Change-Id: I10332bdb6cf6db481d8fe4246a60a67c9c4379e0
diff --git a/tools/startup/adb_utils.py b/tools/startup/adb_utils.py
index 136c99a..981bcbd 100644
--- a/tools/startup/adb_utils.py
+++ b/tools/startup/adb_utils.py
@@ -91,7 +91,7 @@
 
 def get_minor_major_page_faults(app_id, device_id=None):
   pid = get_pid(app_id, device_id)
-  cmd = create_adb_cmd('shell ps -p %i -o MINFL,MAJFL' % pid)
+  cmd = create_adb_cmd('shell ps -p %i -o MINFL,MAJFL' % pid, device_id)
   stdout = subprocess.check_output(cmd).decode('utf-8')
   lines_it = iter(stdout.splitlines())
   first_line = next(lines_it)
@@ -145,7 +145,7 @@
   cmd = create_adb_cmd(
     'shell profman --dump-classes-and-methods'
     ' --profile-file=%s --apk=%s --dex-location=%s'
-        % (profile_path, apk_path, apk_path))
+        % (profile_path, apk_path, apk_path), device_id)
   stdout = subprocess.check_output(cmd).decode('utf-8').strip()
   lines = stdout.splitlines()
   classes_and_methods = []
diff --git a/tools/startup/generate_startup_descriptors.py b/tools/startup/generate_startup_descriptors.py
index a3eb72c..ea0fdf3 100755
--- a/tools/startup/generate_startup_descriptors.py
+++ b/tools/startup/generate_startup_descriptors.py
@@ -22,6 +22,7 @@
     print(
         'Found %i new startup descriptors in iteration %i'
             % (number_of_new_startup_descriptors, iteration + 1))
+  return number_of_new_startup_descriptors
 
 def generate_startup_profile_on_device(options):
   if not options.use_existing_profile:
@@ -74,6 +75,8 @@
 def parse_options(argv):
   result = argparse.ArgumentParser(
       description='Generate a perfetto trace file.')
+  result.add_argument('--apk',
+                      help='Path to the APK')
   result.add_argument('--app-id',
                       help='The application ID of interest',
                       required=True)
@@ -104,6 +107,11 @@
                            'descriptors are found',
                       action='store_true',
                       default=False)
+  result.add_argument('--until-stable-iterations',
+                      help='Number of times that profile generation must must '
+                           'not find new startup descriptors before exiting',
+                      default=1,
+                      type=int)
   result.add_argument('--use-existing-profile',
                       help='Do not launch app to generate startup profile',
                       action='store_true',
@@ -116,13 +124,22 @@
 
 def main(argv):
   (options, args) = parse_options(argv)
+  adb_utils.root(options.device_id)
+  if options.apk:
+    adb_utils.uninstall(options.app_id, options.device_id)
+    adb_utils.install(options.apk, options.device_id)
   startup_descriptors = set()
   if options.until_stable:
     iteration = 0
+    stable_iterations = 0
     while True:
       diff = extend_startup_descriptors(startup_descriptors, iteration, options)
       if diff == 0:
-        break
+        stable_iterations = stable_iterations + 1
+        if stable_iterations == options.until_stable_iterations:
+          break
+      else:
+        stable_iterations = 0
       iteration = iteration + 1
   else:
     for iteration in range(options.iterations):
diff --git a/tools/startup/trace_generator.py b/tools/startup/measure_startup.py
similarity index 95%
rename from tools/startup/trace_generator.py
rename to tools/startup/measure_startup.py
index 37f5c71..080f827 100755
--- a/tools/startup/trace_generator.py
+++ b/tools/startup/measure_startup.py
@@ -82,11 +82,14 @@
   os.makedirs(out_dir, exist_ok=True)
 
 def run(out_dir, options, tmp_dir):
-  assert adb_utils.get_screen_state().is_on_and_unlocked()
+  assert adb_utils.get_screen_state(options.device_id).is_on_and_unlocked()
 
   # Start perfetto trace collector.
-  perfetto_process, perfetto_trace_path = perfetto_utils.record_android_trace(
-      out_dir, tmp_dir)
+  perfetto_process = None
+  perfetto_trace_path = None
+  if not options.no_perfetto:
+    perfetto_process, perfetto_trace_path = perfetto_utils.record_android_trace(
+        out_dir, tmp_dir)
 
   # Launch main activity.
   launch_activity_result = adb_utils.launch_activity(
@@ -96,7 +99,8 @@
       wait_for_activity_to_launch=True)
 
   # Wait for perfetto trace collector to stop.
-  perfetto_utils.stop_record_android_trace(perfetto_process, out_dir)
+  if not options.no_perfetto:
+    perfetto_utils.stop_record_android_trace(perfetto_process, out_dir)
 
   # Get minor and major page faults from app process.
   data = compute_data(launch_activity_result, perfetto_trace_path, options)