Support for measuring startup with profile

Change-Id: I03afd9efd60c466ecd5db5a52d82bfe19f4edb7f
diff --git a/tools/apk_utils.py b/tools/apk_utils.py
index c3c616b..86d3b0f 100755
--- a/tools/apk_utils.py
+++ b/tools/apk_utils.py
@@ -5,9 +5,13 @@
 
 import optparse
 import os
+import shutil
 import subprocess
 import sys
+import time
+
 import utils
+import zip_utils
 
 USAGE = 'usage: %prog [options] <apk>'
 
@@ -34,6 +38,30 @@
   apk = args[0]
   return (options, apk)
 
+def add_baseline_profile_to_apk(apk, baseline_profile, tmp_dir):
+  if baseline_profile is None:
+    return apk
+  ts = time.time_ns()
+  dest_apk = os.path.join(tmp_dir, 'app-%s.apk' % ts)
+  dest_apk_aligned = os.path.join(tmp_dir, 'app-aligned-%s.apk' % ts)
+  dest_apk_signed = os.path.join(tmp_dir, 'app-signed-%s.apk' % ts)
+  shutil.copy2(apk, dest_apk)
+  zip_utils.add_file_to_zip(
+      baseline_profile, 'assets/dexopt/baseline.prof', dest_apk)
+  align(dest_apk, dest_apk_aligned)
+  sign_with_apksigner(dest_apk_aligned, dest_apk_signed)
+  return dest_apk_signed
+
+def align(apk, aligned_apk):
+  zipalign_path = (
+      'zipalign' if 'build_tools' in os.environ.get('PATH')
+      else os.path.join(utils.getAndroidBuildTools(), 'zipalign'))
+  cmd = [zipalign_path, '-f', '4', apk, aligned_apk]
+  utils.RunCmd(cmd, quiet=True, logging=False)
+  return aligned_apk
+
+def default_keystore():
+  return os.path.join(os.getenv('HOME'), '.android', 'app.keystore')
 
 def sign(unsigned_apk, signed_apk, keystore, quiet=False, logging=True):
   utils.Print('Signing (ignore the warnings)', quiet=quiet)
@@ -52,20 +80,20 @@
   utils.RunCmd(cmd, quiet=quiet)
 
 def sign_with_apksigner(
-    unsigned_apk, signed_apk, keystore, password='android', quiet=False,
+    unsigned_apk, signed_apk, keystore=None, password='android', quiet=False,
     logging=True):
   cmd = [
     os.path.join(utils.getAndroidBuildTools(), 'apksigner'),
     'sign',
     '-v',
-    '--ks', keystore,
+    '--ks', keystore or default_keystore(),
     '--ks-pass', 'pass:' + password,
     '--min-sdk-version', '19',
     '--out', signed_apk,
     unsigned_apk
   ]
   utils.RunCmd(cmd, quiet=quiet, logging=logging)
-
+  return signed_apk
 
 def main():
   (options, apk) = parse_options()