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)
diff --git a/tools/apk_utils.py b/tools/apk_utils.py
index af24ec1..41c80c2 100644
--- a/tools/apk_utils.py
+++ b/tools/apk_utils.py
@@ -24,9 +24,9 @@
   utils.RunCmd(cmd, quiet=quiet)
 
 def sign_with_apksigner(
-    build_tools_dir, unsigned_apk, signed_apk, keystore, password, quiet=False):
+    unsigned_apk, signed_apk, keystore, password='android', quiet=False):
   cmd = [
-    os.path.join(build_tools_dir, 'apksigner'),
+    os.path.join(utils.ANDROID_BUILD_TOOLS, 'apksigner'),
     'sign',
     '-v',
     '--ks', keystore,
diff --git a/tools/run_on_as_app.py b/tools/run_on_as_app.py
index ac27750..94d6a47 100755
--- a/tools/run_on_as_app.py
+++ b/tools/run_on_as_app.py
@@ -491,7 +491,6 @@
     assert os.path.isfile(unsigned_apk)
     if options.sign_apks:
       apk_utils.sign_with_apksigner(
-          utils.ANDROID_BUILD_TOOLS,
           unsigned_apk,
           signed_apk,
           options.keystore,
@@ -531,9 +530,9 @@
   # is 'r8'.
   entry_point = 'com.android.tools.r8.R8'
 
-  cmd = [jdk.GetJavaExecutable(), '-ea:com.android.tools.r8...', '-cp', r8_jar, entry_point,
-      '--release', '--min-api', str(min_sdk), '--pg-conf', proguard_config_file,
-      '--lib', android_jar, '--output', zip_dest, apk]
+  cmd = [jdk.GetJavaExecutable(), '-ea:com.android.tools.r8...', '-cp', r8_jar,
+      entry_point, '--release', '--min-api', str(min_sdk), '--pg-conf',
+      proguard_config_file, '--lib', android_jar, '--output', zip_dest, apk]
 
   for android_optional_jar in utils.get_android_optional_jars(compile_sdk):
     cmd.append('--lib')
@@ -548,7 +547,8 @@
   # 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(
-    apk, dex=zip_dest, out=apk_dest, quiet=options.quiet)
+      apk, dex=zip_dest, resources='META-INF/services/*', out=apk_dest,
+      quiet=options.quiet)
 
 def RunMonkey(app, config, options, apk_dest):
   if not WaitForEmulator():