Also masseur files in META-INF/services/ for test apps

Bug: 124801905
Change-Id: Ib8c742375fe1cfeb07008a80ab00145e4b71f5f8
diff --git a/tools/apk_masseur.py b/tools/apk_masseur.py
index be380ed..4b13a32 100755
--- a/tools/apk_masseur.py
+++ b/tools/apk_masseur.py
@@ -16,7 +16,12 @@
 def parse_options():
   parser = optparse.OptionParser(usage=USAGE)
   parser.add_option('--dex',
-                    help='directory with dex files to use instead of those in the apk',
+                    help=('directory with dex files to use instead of those in '
+                        + 'the apk'),
+                    default=None)
+  parser.add_option('--resources',
+                    help=('pattern that matches resources to use instead of '
+                        + 'those in the apk'),
                     default=None)
   parser.add_option('--out',
                     help='output file (default ./$(basename <apk>))',
@@ -43,32 +48,39 @@
 def findKeystore():
   return os.path.join(os.getenv('HOME'), '.android', 'app.keystore')
 
-def repack(processed_out, original_apk, temp, quiet):
+def repack(apk, processed_out, resources, temp, quiet):
   processed_apk = os.path.join(temp, 'processed.apk')
-  shutil.copyfile(original_apk, processed_apk)
+  shutil.copyfile(apk, processed_apk)
   if not processed_out:
     utils.Print('Using original APK as is', quiet=quiet)
     return processed_apk
   utils.Print(
       'Repacking APK with dex files from {}'.format(processed_apk), quiet=quiet)
+
+  # Delete original dex files in APK.
   with utils.ChangedWorkingDirectory(temp, quiet=quiet):
     cmd = ['zip', '-d', 'processed.apk', '*.dex']
     utils.RunCmd(cmd, quiet=quiet)
+
+  # Unzip the jar or zip file into `temp`.
   if processed_out.endswith('.zip') or processed_out.endswith('.jar'):
     cmd = ['unzip', processed_out, '-d', temp]
     if quiet:
       cmd.insert(1, '-q')
     utils.RunCmd(cmd, quiet=quiet)
     processed_out = temp
+
+  # Insert the new dex and resource files from `processed_out` into the APK.
   with utils.ChangedWorkingDirectory(processed_out, quiet=quiet):
-    dex = glob.glob('*.dex')
-    cmd = ['zip', '-u', '-9', processed_apk] + dex
+    dex_files = glob.glob('*.dex')
+    resource_files = glob.glob(resources) if resources else []
+    cmd = ['zip', '-u', '-9', processed_apk] + dex_files + resource_files
     utils.RunCmd(cmd, quiet=quiet)
   return processed_apk
 
 def sign(unsigned_apk, keystore, temp, quiet):
   signed_apk = os.path.join(temp, 'unaligned.apk')
-  apk_utils.sign(unsigned_apk, signed_apk, keystore, quiet=quiet)
+  apk_utils.sign_with_apksigner(unsigned_apk, signed_apk, keystore, quiet=quiet)
   return signed_apk
 
 def align(signed_apk, temp, quiet):
@@ -88,8 +100,8 @@
   return signed_apk
 
 def masseur(
-    apk, dex=None, out=None, adb_options=None, keystore=None, install=False,
-    quiet=False):
+    apk, dex=None, resources=None, out=None, adb_options=None, keystore=None,
+    install=False, quiet=False):
   if not out:
     out = os.path.basename(apk)
   if not keystore:
@@ -97,7 +109,7 @@
   with utils.TempDir() as temp:
     processed_apk = None
     if dex:
-      processed_apk = repack(dex, apk, temp, quiet)
+      processed_apk = repack(apk, dex, resources, temp, quiet)
     else:
       utils.Print(
           'Signing original APK without modifying dex files', quiet=quiet)