Repack apk in apk_masseur.py when compression does not match
Change-Id: I007ed8f49dd4100d7d156e5ccb30901e0319a0ed
diff --git a/tools/apk_masseur.py b/tools/apk_masseur.py
index 487cb7c..4a8404e 100755
--- a/tools/apk_masseur.py
+++ b/tools/apk_masseur.py
@@ -7,6 +7,7 @@
import optparse
import os
import shutil
+import subprocess
import sys
import apk_utils
@@ -82,8 +83,13 @@
processed_apk)
if not processed_out:
- utils.Print('Using original dex as is', quiet=quiet)
- return processed_apk
+ if has_wrong_compression(apk, compress_dex):
+ processed_out = os.path.join(temp, 'extracted')
+ subprocess.check_call(
+ ['unzip', apk, '-d', processed_out, 'classes*.dex'])
+ else:
+ utils.Print('Using original dex as is', quiet=quiet)
+ return processed_apk
utils.Print('Repacking APK with dex files from {}'.format(processed_out),
quiet=quiet)
@@ -148,6 +154,16 @@
return apk_utils.align(signed_apk, aligned_apk)
+def has_wrong_compression(apk, compress_dex):
+ cmd = ['zipinfo', apk, 'classes*.dex']
+ stdout = subprocess.check_output(cmd).decode('utf-8').strip()
+ expected = ' defN ' if compress_dex else ' stor '
+ for line in stdout.splitlines():
+ if not expected in line:
+ return True
+ return False
+
+
def masseur(apk,
clear_profile=False,
dex=None,
@@ -167,7 +183,7 @@
keystore = apk_utils.default_keystore()
with utils.TempDir() as temp:
processed_apk = None
- if dex or clear_profile:
+ if dex or clear_profile or has_wrong_compression(apk, compress_dex):
processed_apk = repack(apk, clear_profile, dex,
desugared_library_dex, compress_dex,
resources, temp, quiet, logging)