Align before signing in apk_masseur.py

Change-Id: Ibd3816a8067ccd8cc8729a55f1ec83a5c50dd86c
diff --git a/tools/apk_masseur.py b/tools/apk_masseur.py
index a4a010b..7f3932b 100755
--- a/tools/apk_masseur.py
+++ b/tools/apk_masseur.py
@@ -39,6 +39,10 @@
   parser.add_option('--quiet',
                     help='disable verbose logging',
                     default=False)
+  parser.add_option('--sign-before-align',
+                    help='Sign the apk before aligning',
+                    default=False,
+                    action='store_true')
   (options, args) = parser.parse_args()
   if len(args) != 1:
     parser.error('Expected <apk> argument, got: ' + ' '.join(args))
@@ -86,8 +90,9 @@
   return apk_utils.align(signed_apk, aligned_apk)
 
 def masseur(
-    apk, dex=None, resources=None, out=None, adb_options=None, keystore=None,
-    install=False, quiet=False, logging=True):
+    apk, dex=None, resources=None, out=None, adb_options=None,
+    sign_before_align=False, keystore=None, install=False, quiet=False,
+    logging=True):
   if not out:
     out = os.path.basename(apk)
   if not keystore:
@@ -101,11 +106,18 @@
           'Signing original APK without modifying dex files', quiet=quiet)
       processed_apk = os.path.join(temp, 'processed.apk')
       shutil.copyfile(apk, processed_apk)
-    signed_apk = sign(
-        processed_apk, keystore, temp, quiet=quiet, logging=logging)
-    aligned_apk = align(signed_apk, temp, quiet=quiet, logging=logging)
-    utils.Print('Writing result to {}'.format(out), quiet=quiet)
-    shutil.copyfile(aligned_apk, out)
+    if sign_before_align:
+      signed_apk = sign(
+          processed_apk, keystore, temp, quiet=quiet, logging=logging)
+      aligned_apk = align(signed_apk, temp, quiet=quiet, logging=logging)
+      utils.Print('Writing result to {}'.format(out), quiet=quiet)
+      shutil.copyfile(aligned_apk, out)
+    else:
+      aligned_apk = align(processed_apk, temp, quiet=quiet, logging=logging)
+      signed_apk = sign(
+          aligned_apk, keystore, temp, quiet=quiet, logging=logging)
+      utils.Print('Writing result to {}'.format(out), quiet=quiet)
+      shutil.copyfile(signed_apk, out)
     if install:
       adb_cmd = ['adb']
       if adb_options:
diff --git a/tools/apk_utils.py b/tools/apk_utils.py
index 86d3b0f..906284e 100755
--- a/tools/apk_utils.py
+++ b/tools/apk_utils.py
@@ -90,6 +90,7 @@
     '--ks-pass', 'pass:' + password,
     '--min-sdk-version', '19',
     '--out', signed_apk,
+    '--v2-signing-enabled',
     unsigned_apk
   ]
   utils.RunCmd(cmd, quiet=quiet, logging=logging)
diff --git a/tools/utils.py b/tools/utils.py
index 85fda69..363cc18 100644
--- a/tools/utils.py
+++ b/tools/utils.py
@@ -159,8 +159,18 @@
       ANDROID_HOME_ENVIROMENT_NAME, os.path.join(USER_HOME, 'Android', 'Sdk'))
 
 def getAndroidBuildTools():
-  version = os.environ.get(ANDROID_TOOLS_VERSION_ENVIRONMENT_NAME, '28.0.3')
-  return os.path.join(getAndroidHome(), 'build-tools', version)
+  if ANDROID_TOOLS_VERSION_ENVIRONMENT_NAME in os.environ:
+    version = os.environ.get(ANDROID_TOOLS_VERSION_ENVIRONMENT_NAME)
+    build_tools_dir = os.path.join(getAndroidHome(), 'build-tools', version)
+    assert os.path.exists(build_tools_dir)
+    return build_tools_dir
+  else:
+    versions = ['30.0.3', '30.0.2', '30.0.1', '30.0.0']
+    for version in versions:
+      build_tools_dir = os.path.join(getAndroidHome(), 'build-tools', version)
+      if os.path.exists(build_tools_dir):
+        return build_tools_dir
+  raise Exception('Unable to find Android build-tools')
 
 def is_python3():
   return sys.version_info.major == 3