diff options
-rwxr-xr-x | android_webview/tools/apk_merger.py | 16 | ||||
-rwxr-xr-x | build/android/gyp/apkbuilder.py | 14 | ||||
-rwxr-xr-x | build/android/gyp/finalize_apk.py | 20 | ||||
-rw-r--r-- | build/config/android/internal_rules.gni | 14 | ||||
-rw-r--r-- | build/config/android/rules.gni | 2 |
5 files changed, 59 insertions, 7 deletions
diff --git a/android_webview/tools/apk_merger.py b/android_webview/tools/apk_merger.py index e9ea1fe..7851fe5 100755 --- a/android_webview/tools/apk_merger.py +++ b/android_webview/tools/apk_merger.py @@ -121,7 +121,8 @@ def RemoveMetafiles(tmp_apk): def SignAndAlignApk(tmp_apk, signed_tmp_apk, new_apk, zipalign_path, - keystore_path, key_name, key_password): + keystore_path, key_name, key_password, + page_align_shared_libraries): try: finalize_apk.JarSigner( keystore_path, @@ -133,7 +134,10 @@ def SignAndAlignApk(tmp_apk, signed_tmp_apk, new_apk, zipalign_path, raise ApkMergeFailure('Failed to sign APK: ' + e.output) try: - finalize_apk.AlignApk(zipalign_path, signed_tmp_apk, new_apk) + finalize_apk.AlignApk(zipalign_path, + page_align_shared_libraries, + signed_tmp_apk, + new_apk) except build_utils.CalledProcessError as e: raise ApkMergeFailure('Failed to align APK: ' + e.output) @@ -151,6 +155,8 @@ def main(): parser.add_argument('--key_name', required=True) parser.add_argument('--key_password', required=True) parser.add_argument('--shared_library', required=True) + parser.add_argument('--page-align-shared-libraries', action='store_true') + parser.add_argument('--uncompress-shared-libraries', action='store_true') args = parser.parse_args() tmp_dir = tempfile.mkdtemp() @@ -166,6 +172,9 @@ def main(): 'natives_blob_32.bin': ['-0'], args.shared_library: []} + if args.uncompress_shared_libraries: + expected_files[args.shared_library] += ['-0'] + try: shutil.copyfile(args.apk_64bit, tmp_apk) @@ -190,7 +199,8 @@ def main(): AddDiffFiles(diff_files, tmp_dir_32, tmp_apk, expected_files) SignAndAlignApk(tmp_apk, signed_tmp_apk, new_apk, args.zipalign_path, - args.keystore_path, args.key_name, args.key_password) + args.keystore_path, args.key_name, args.key_password, + args.page_align_shared_libraries) except ApkMergeFailure as e: print e diff --git a/build/android/gyp/apkbuilder.py b/build/android/gyp/apkbuilder.py index 8278b2c..ca320f9 100755 --- a/build/android/gyp/apkbuilder.py +++ b/build/android/gyp/apkbuilder.py @@ -57,6 +57,9 @@ def _ParseArgs(args): default='[]') parser.add_argument('--emma-device-jar', help='Path to emma_device.jar to include.') + parser.add_argument('--uncompress-shared-libraries', + action='store_true', + help='Uncompress shared libraries') options = parser.parse_args(args) options.assets = build_utils.ParseGypList(options.assets) options.uncompressed_assets = build_utils.ParseGypList( @@ -206,7 +209,16 @@ def main(args): for path in native_libs: basename = os.path.basename(path) apk_path = 'lib/%s/%s' % (options.android_abi, basename) - build_utils.AddToZipHermetic(out_apk, apk_path, src_path=path) + + compress = None + if (options.uncompress_shared_libraries and + os.path.splitext(basename)[1] == '.so'): + compress = False + + build_utils.AddToZipHermetic(out_apk, + apk_path, + src_path=path, + compress=compress) for name in sorted(options.native_lib_placeholders): # Empty libs files are ignored by md5check, but rezip requires them diff --git a/build/android/gyp/finalize_apk.py b/build/android/gyp/finalize_apk.py index a6a1040..d71cb8f 100755 --- a/build/android/gyp/finalize_apk.py +++ b/build/android/gyp/finalize_apk.py @@ -55,10 +55,17 @@ def JarSigner(key_path, key_name, key_passwd, unsigned_path, signed_path): build_utils.CheckOutput(sign_cmd) -def AlignApk(zipalign_path, unaligned_path, final_path): +def AlignApk(zipalign_path, package_align, unaligned_path, final_path): align_cmd = [ zipalign_path, - '-f', '4', # 4 bytes + '-f' + ] + + if package_align: + align_cmd += ['-p'] + + align_cmd += [ + '4', # 4 bytes unaligned_path, final_path, ] @@ -74,6 +81,9 @@ def main(args): parser.add_option('--rezip-apk-jar-path', help='Path to the RezipApk jar file.') parser.add_option('--zipalign-path', help='Path to the zipalign tool.') + parser.add_option('--page-align-shared-libraries', + action='store_true', + help='Page align shared libraries.') parser.add_option('--unsigned-apk-path', help='Path to input unsigned APK.') parser.add_option('--final-apk-path', help='Path to output signed and aligned APK.') @@ -100,6 +110,7 @@ def main(args): options.load_library_from_zip, options.key_name, options.key_passwd, + options.page_align_shared_libraries, ] build_utils.CallAndWriteDepfileIfStale( @@ -140,7 +151,10 @@ def FinalizeApk(options): options.rezip_apk_jar_path, signed_apk_path, options.final_apk_path) else: # Align uncompressed items to 4 bytes - AlignApk(options.zipalign_path, signed_apk_path, options.final_apk_path) + AlignApk(options.zipalign_path, + options.page_align_shared_libraries, + signed_apk_path, + options.final_apk_path) if __name__ == '__main__': diff --git a/build/config/android/internal_rules.gni b/build/config/android/internal_rules.gni index 8ae340c..37da385 100644 --- a/build/config/android/internal_rules.gni +++ b/build/config/android/internal_rules.gni @@ -764,6 +764,11 @@ template("package_apk") { _rebased_emma_device_jar = rebase_path(_emma_device_jar, root_build_dir) args += [ "--emma-device-jar=$_rebased_emma_device_jar" ] } + + if (defined(invoker.uncompress_shared_libraries) && + invoker.uncompress_shared_libraries) { + args += [ "--uncompress-shared-libraries" ] + } } } @@ -825,6 +830,11 @@ template("finalize_apk") { rebase_path(_rezip_jar_path, root_build_dir), ] } + + if (defined(invoker.page_align_shared_libraries) && + invoker.page_align_shared_libraries) { + args += [ "--page-align-shared-libraries" ] + } } } @@ -1061,6 +1071,7 @@ template("create_apk") { "emma_instrument", "native_lib_placeholders", "native_libs_filearg", + "uncompress_shared_libraries", "write_asset_list", ]) deps = _deps + [ ":${_package_resources_target_name}" ] @@ -1080,6 +1091,7 @@ template("create_apk") { [ "assets_build_config", "emma_instrument", + "uncompress_shared_libraries", ]) _dex_target = "//build/android/incremental_install:bootstrap_java__dex" deps = _incremental_deps + [ @@ -1107,6 +1119,8 @@ template("create_apk") { _finalize_apk_rule_name = "${target_name}__finalize" finalize_apk(_finalize_apk_rule_name) { + forward_variables_from(invoker, [ "page_align_shared_libraries" ]) + input_apk_path = _packaged_apk_path output_apk_path = _final_apk_path keystore_path = _keystore_path diff --git a/build/config/android/rules.gni b/build/config/android/rules.gni index 1c65d21..f9bfd3d 100644 --- a/build/config/android/rules.gni +++ b/build/config/android/rules.gni @@ -1707,8 +1707,10 @@ template("android_apk") { "deps", "extensions_to_not_compress", "language_splits", + "page_align_shared_libraries", "public_deps", "shared_resources", + "uncompress_shared_libraries", "write_asset_list", ]) apk_path = _final_apk_path |