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():