Commit c3fd406f authored by agrieve's avatar agrieve Committed by Commit bot

Reland of Android: Delete rezip in favor of zipalign -p

There's no need for a custom alignment tool now that zipalign supports
page-aligning libraries.

Previously reverted in:
https://codereview.chromium.org/2595233003/

Reason for reland:
Contains fix for monochrome (tested merging locally).

BUG=676029,676589

Review-Url: https://codereview.chromium.org/2612773005
Cr-Commit-Position: refs/heads/master@{#442906}
parent 1b58a658
...@@ -401,7 +401,6 @@ group("both_gn_and_gyp") { ...@@ -401,7 +401,6 @@ group("both_gn_and_gyp") {
"//base:base_junit_tests", "//base:base_junit_tests",
"//base/android/linker:chromium_android_linker", "//base/android/linker:chromium_android_linker",
"//build/android/gyp/test:hello_world", "//build/android/gyp/test:hello_world",
"//build/android/rezip",
"//chrome/android/webapk/shell_apk:webapk", "//chrome/android/webapk/shell_apk:webapk",
"//components/invalidation/impl:components_invalidation_impl_junit_tests", "//components/invalidation/impl:components_invalidation_impl_junit_tests",
"//components/policy/android:components_policy_junit_tests", "//components/policy/android:components_policy_junit_tests",
......
...@@ -135,8 +135,7 @@ def AddDiffFiles(diff_files, tmp_dir_32, out_zip, expected_files, ...@@ -135,8 +135,7 @@ def AddDiffFiles(diff_files, tmp_dir_32, out_zip, expected_files,
def SignAndAlignApk(tmp_apk, signed_tmp_apk, new_apk, zipalign_path, 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: try:
finalize_apk.JarSigner( finalize_apk.JarSigner(
keystore_path, keystore_path,
...@@ -149,7 +148,6 @@ def SignAndAlignApk(tmp_apk, signed_tmp_apk, new_apk, zipalign_path, ...@@ -149,7 +148,6 @@ def SignAndAlignApk(tmp_apk, signed_tmp_apk, new_apk, zipalign_path,
try: try:
finalize_apk.AlignApk(zipalign_path, finalize_apk.AlignApk(zipalign_path,
page_align_shared_libraries,
signed_tmp_apk, signed_tmp_apk,
new_apk) new_apk)
except build_utils.CalledProcessError as e: except build_utils.CalledProcessError as e:
...@@ -224,7 +222,8 @@ def main(): ...@@ -224,7 +222,8 @@ def main():
parser.add_argument('--key_name', required=True) parser.add_argument('--key_name', required=True)
parser.add_argument('--key_password', required=True) parser.add_argument('--key_password', required=True)
parser.add_argument('--shared_library') parser.add_argument('--shared_library')
parser.add_argument('--page-align-shared-libraries', action='store_true') parser.add_argument('--page-align-shared-libraries', action='store_true',
help='Obsolete, but remains for backwards compatibility')
parser.add_argument('--uncompress-shared-libraries', action='store_true') parser.add_argument('--uncompress-shared-libraries', action='store_true')
parser.add_argument('--debug', action='store_true') parser.add_argument('--debug', action='store_true')
# This option shall only used in debug build, see http://crbug.com/631494. # This option shall only used in debug build, see http://crbug.com/631494.
...@@ -250,8 +249,7 @@ def main(): ...@@ -250,8 +249,7 @@ def main():
MergeApk(args, tmp_apk, tmp_dir_32, tmp_dir_64) MergeApk(args, tmp_apk, tmp_dir_32, tmp_dir_64)
SignAndAlignApk(tmp_apk, signed_tmp_apk, new_apk, args.zipalign_path, 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: except ApkMergeFailure as e:
print e print e
......
...@@ -161,14 +161,20 @@ def _CreateAssetsList(path_tuples): ...@@ -161,14 +161,20 @@ def _CreateAssetsList(path_tuples):
def _AddNativeLibraries(out_apk, native_libs, android_abi, uncompress): def _AddNativeLibraries(out_apk, native_libs, android_abi, uncompress):
"""Add native libraries to APK.""" """Add native libraries to APK."""
has_crazy_linker = any('android_linker' in os.path.basename(p)
for p in native_libs)
for path in native_libs: for path in native_libs:
basename = os.path.basename(path) basename = os.path.basename(path)
apk_path = 'lib/%s/%s' % (android_abi, basename)
compress = None compress = None
if (uncompress and os.path.splitext(basename)[1] == '.so'): if (uncompress and os.path.splitext(basename)[1] == '.so'
and 'android_linker' not in basename):
compress = False compress = False
# Add prefix to prevent android install from extracting upon install.
if has_crazy_linker:
basename = 'crazy.' + basename
apk_path = 'lib/%s/%s' % (android_abi, basename)
build_utils.AddToZipHermetic(out_apk, build_utils.AddToZipHermetic(out_apk,
apk_path, apk_path,
src_path=path, src_path=path,
...@@ -265,8 +271,9 @@ def main(args): ...@@ -265,8 +271,9 @@ def main(args):
options.uncompress_shared_libraries) options.uncompress_shared_libraries)
for name in sorted(options.native_lib_placeholders): for name in sorted(options.native_lib_placeholders):
# Empty libs files are ignored by md5check, but rezip requires them # Note: Empty libs files are ignored by md5check (can cause issues
# to be empty in order to identify them as placeholders. # with stale builds when the only change is adding/removing
# placeholders).
apk_path = 'lib/%s/%s' % (options.android_abi, name) apk_path = 'lib/%s/%s' % (options.android_abi, name)
build_utils.AddToZipHermetic(out_apk, apk_path, data='') build_utils.AddToZipHermetic(out_apk, apk_path, data='')
......
...@@ -21,32 +21,6 @@ import resource_sizes # pylint: disable=unused-import ...@@ -21,32 +21,6 @@ import resource_sizes # pylint: disable=unused-import
from util import build_utils from util import build_utils
def RenameInflateAndAddPageAlignment(
rezip_apk_jar_path, in_zip_file, out_zip_file):
rezip_apk_cmd = [
'java',
'-classpath',
rezip_apk_jar_path,
'RezipApk',
'renamealign',
in_zip_file,
out_zip_file,
]
build_utils.CheckOutput(rezip_apk_cmd)
def ReorderAndAlignApk(rezip_apk_jar_path, in_zip_file, out_zip_file):
rezip_apk_cmd = [
'java',
'-classpath',
rezip_apk_jar_path,
'RezipApk',
'reorder',
in_zip_file,
out_zip_file,
]
build_utils.CheckOutput(rezip_apk_cmd)
def JarSigner(key_path, key_name, key_passwd, unsigned_path, signed_path): def JarSigner(key_path, key_name, key_passwd, unsigned_path, signed_path):
shutil.copy(unsigned_path, signed_path) shutil.copy(unsigned_path, signed_path)
...@@ -62,14 +36,15 @@ def JarSigner(key_path, key_name, key_passwd, unsigned_path, signed_path): ...@@ -62,14 +36,15 @@ def JarSigner(key_path, key_name, key_passwd, unsigned_path, signed_path):
build_utils.CheckOutput(sign_cmd) build_utils.CheckOutput(sign_cmd)
def AlignApk(zipalign_path, package_align, unaligned_path, final_path): def AlignApk(zipalign_path, unaligned_path, final_path):
# Note -p will page align native libraries (files ending with .so), but
# only those that are stored uncompressed.
align_cmd = [ align_cmd = [
zipalign_path, zipalign_path,
'-f' '-p',
'-f',
] ]
if package_align:
align_cmd += ['-p']
align_cmd += [ align_cmd += [
'4', # 4 bytes '4', # 4 bytes
...@@ -85,23 +60,13 @@ def main(args): ...@@ -85,23 +60,13 @@ def main(args):
parser = optparse.OptionParser() parser = optparse.OptionParser()
build_utils.AddDepfileOption(parser) build_utils.AddDepfileOption(parser)
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('--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('--unsigned-apk-path', help='Path to input unsigned APK.')
parser.add_option('--final-apk-path', parser.add_option('--final-apk-path',
help='Path to output signed and aligned APK.') help='Path to output signed and aligned APK.')
parser.add_option('--key-path', help='Path to keystore for signing.') parser.add_option('--key-path', help='Path to keystore for signing.')
parser.add_option('--key-passwd', help='Keystore password') parser.add_option('--key-passwd', help='Keystore password')
parser.add_option('--key-name', help='Keystore name') parser.add_option('--key-name', help='Keystore name')
parser.add_option('--stamp', help='Path to touch on success.')
parser.add_option('--load-library-from-zip', type='int',
help='If non-zero, build the APK such that the library can be loaded ' +
'directly from the zip file using the crazy linker. The library ' +
'will be renamed, uncompressed and page aligned.')
options, _ = parser.parse_args() options, _ = parser.parse_args()
...@@ -110,14 +75,9 @@ def main(args): ...@@ -110,14 +75,9 @@ def main(args):
options.key_path, options.key_path,
] ]
if options.load_library_from_zip:
input_paths.append(options.rezip_apk_jar_path)
input_strings = [ input_strings = [
options.load_library_from_zip,
options.key_name, options.key_name,
options.key_passwd, options.key_passwd,
options.page_align_shared_libraries,
] ]
build_utils.CallAndWriteDepfileIfStale( build_utils.CallAndWriteDepfileIfStale(
...@@ -129,57 +89,34 @@ def main(args): ...@@ -129,57 +89,34 @@ def main(args):
output_paths=[options.final_apk_path]) output_paths=[options.final_apk_path])
def FinalizeApk(options): def _NormalizeZip(path):
with tempfile.NamedTemporaryFile() as signed_apk_path_tmp, \ with tempfile.NamedTemporaryFile(suffix='.zip') as hermetic_signed_apk:
tempfile.NamedTemporaryFile() as apk_to_sign_tmp: with zipfile.ZipFile(path, 'r') as zi:
with zipfile.ZipFile(hermetic_signed_apk, 'w') as zo:
if options.load_library_from_zip: for info in zi.infolist():
# We alter the name of the library so that the Android Package Manager # Ignore 'extended local file headers'. Python doesn't write them
# does not extract it into a separate file. This must be done before # properly (see https://bugs.python.org/issue1742205) which causes
# signing, as the filename is part of the signed manifest. At the same # zipalign to miscalculate alignment. Since we don't use them except
# time we uncompress the library, which is necessary so that it can be # for alignment anyway, we write a stripped file here and let
# loaded directly from the APK. # zipalign add them properly later. eLFHs are controlled by 'general
# Move the library to a page boundary by adding a page alignment file. # purpose bit flag 03' (0x08) so we mask that out.
apk_to_sign = apk_to_sign_tmp.name info.flag_bits = info.flag_bits & 0xF7
RenameInflateAndAddPageAlignment(
options.rezip_apk_jar_path, options.unsigned_apk_path, apk_to_sign)
else:
apk_to_sign = options.unsigned_apk_path
info.date_time = build_utils.HERMETIC_TIMESTAMP
zo.writestr(info, zi.read(info.filename))
shutil.copy(hermetic_signed_apk.name, path)
def FinalizeApk(options):
with tempfile.NamedTemporaryFile() as signed_apk_path_tmp:
signed_apk_path = signed_apk_path_tmp.name signed_apk_path = signed_apk_path_tmp.name
JarSigner(options.key_path, options.key_name, options.key_passwd, JarSigner(options.key_path, options.key_name, options.key_passwd,
apk_to_sign, signed_apk_path) options.unsigned_apk_path, signed_apk_path)
# Make the newly added signing files hermetic.
# Make the signing files hermetic. _NormalizeZip(signed_apk_path)
with tempfile.NamedTemporaryFile(suffix='.zip') as hermetic_signed_apk:
with zipfile.ZipFile(signed_apk_path, 'r') as zi: AlignApk(options.zipalign_path, signed_apk_path, options.final_apk_path)
with zipfile.ZipFile(hermetic_signed_apk, 'w') as zo:
for info in zi.infolist():
# Ignore 'extended local file headers'. Python doesn't write them
# properly (see https://bugs.python.org/issue1742205) which causes
# zipalign to miscalculate alignment. Since we don't use them except
# for alignment anyway, we write a stripped file here and let
# zipalign add them properly later. eLFHs are controlled by 'general
# purpose bit flag 03' (0x08) so we mask that out.
info.flag_bits = info.flag_bits & 0xF7
info.date_time = build_utils.HERMETIC_TIMESTAMP
zo.writestr(info, zi.read(info.filename))
shutil.copy(hermetic_signed_apk.name, signed_apk_path)
if options.load_library_from_zip:
# Reorder the contents of the APK. This re-establishes the canonical
# order which means the library will be back at its page aligned location.
# This step also aligns uncompressed items to 4 bytes.
ReorderAndAlignApk(
options.rezip_apk_jar_path, signed_apk_path, options.final_apk_path)
else:
# Align uncompressed items to 4 bytes
AlignApk(options.zipalign_path,
options.page_align_shared_libraries,
signed_apk_path,
options.final_apk_path)
if __name__ == '__main__': if __name__ == '__main__':
......
# Copyright 2014 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import("//build/config/android/rules.gni")
java_library("rezip") {
jar_path = "$root_build_dir/lib.java/rezip_apk.jar"
java_files = [ "RezipApk.java" ]
}
This diff is collapsed.
...@@ -32,7 +32,6 @@ _java_target_whitelist = [ ...@@ -32,7 +32,6 @@ _java_target_whitelist = [
# TODO(agrieve): Rename targets below to match above patterns. # TODO(agrieve): Rename targets below to match above patterns.
"*android_webview/glue:glue", "*android_webview/glue:glue",
"//build/android/rezip:rezip",
"//chrome/test/android/cast_emulator:cast_emulator", "//chrome/test/android/cast_emulator:cast_emulator",
] ]
...@@ -1393,7 +1392,6 @@ if (enable_java_templates) { ...@@ -1393,7 +1392,6 @@ if (enable_java_templates) {
# keystore_path: Path to keystore to use for signing. # keystore_path: Path to keystore to use for signing.
# keystore_name: Key alias to use. # keystore_name: Key alias to use.
# keystore_password: Keystore password. # keystore_password: Keystore password.
# rezip_apk: Whether to add crazy-linker alignment.
template("finalize_apk") { template("finalize_apk") {
action(target_name) { action(target_name) {
deps = [] deps = []
...@@ -1436,20 +1434,6 @@ if (enable_java_templates) { ...@@ -1436,20 +1434,6 @@ if (enable_java_templates) {
"--key-passwd", "--key-passwd",
invoker.keystore_password, invoker.keystore_password,
] ]
if (defined(invoker.rezip_apk) && invoker.rezip_apk) {
deps += [ "//build/android/rezip" ]
_rezip_jar_path = "$root_build_dir/lib.java/rezip_apk.jar"
args += [
"--load-library-from-zip=1",
"--rezip-apk-jar-path",
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" ]
}
} }
} }
...@@ -1692,6 +1676,9 @@ if (enable_java_templates) { ...@@ -1692,6 +1676,9 @@ if (enable_java_templates) {
"uncompress_shared_libraries", "uncompress_shared_libraries",
"write_asset_list", "write_asset_list",
]) ])
if (!defined(uncompress_shared_libraries)) {
uncompress_shared_libraries = _load_library_from_apk
}
deps = _deps + [ ":${_package_resources_target_name}" ] deps = _deps + [ ":${_package_resources_target_name}" ]
native_libs = _native_libs + _native_libs_even_when_incremental native_libs = _native_libs + _native_libs_even_when_incremental
...@@ -1712,6 +1699,9 @@ if (enable_java_templates) { ...@@ -1712,6 +1699,9 @@ if (enable_java_templates) {
"secondary_native_libs", "secondary_native_libs",
"uncompress_shared_libraries", "uncompress_shared_libraries",
]) ])
if (!defined(uncompress_shared_libraries)) {
uncompress_shared_libraries = _load_library_from_apk
}
_dex_target = "//build/android/incremental_install:bootstrap_java__dex" _dex_target = "//build/android/incremental_install:bootstrap_java__dex"
deps = _incremental_deps + [ deps = _incremental_deps + [
":${_incremental_package_resources_target_name}", ":${_incremental_package_resources_target_name}",
...@@ -1738,14 +1728,11 @@ if (enable_java_templates) { ...@@ -1738,14 +1728,11 @@ if (enable_java_templates) {
_finalize_apk_rule_name = "${target_name}__finalize" _finalize_apk_rule_name = "${target_name}__finalize"
finalize_apk(_finalize_apk_rule_name) { finalize_apk(_finalize_apk_rule_name) {
forward_variables_from(invoker, [ "page_align_shared_libraries" ])
input_apk_path = _packaged_apk_path input_apk_path = _packaged_apk_path
output_apk_path = _final_apk_path output_apk_path = _final_apk_path
keystore_path = _keystore_path keystore_path = _keystore_path
keystore_name = _keystore_name keystore_name = _keystore_name
keystore_password = _keystore_password keystore_password = _keystore_password
rezip_apk = _load_library_from_apk
public_deps = [ public_deps = [
# Generator of the _packaged_apk_path this target takes as input. # Generator of the _packaged_apk_path this target takes as input.
......
...@@ -2007,15 +2007,7 @@ if (enable_java_templates) { ...@@ -2007,15 +2007,7 @@ if (enable_java_templates) {
_extra_native_libs_deps = [] _extra_native_libs_deps = []
assert(_extra_native_libs_deps == []) # Mark as used. assert(_extra_native_libs_deps == []) # Mark as used.
_extra_native_libs_even_when_incremental = [] _extra_native_libs_even_when_incremental = []
_extra_native_libs_even_when_incremental_deps = []
assert(_extra_native_libs_even_when_incremental_deps == []) # Mark as used.
if (_native_libs_deps != []) { if (_native_libs_deps != []) {
# zipalign can't align gdb_server, don't pack gdbserver temporarily.
if (is_debug && (!defined(invoker.page_align_shared_libraries) ||
!invoker.page_align_shared_libraries)) {
_extra_native_libs_even_when_incremental = [ android_gdbserver ]
}
if (_use_chromium_linker) { if (_use_chromium_linker) {
_extra_native_libs = _extra_native_libs =
[ "$root_shlib_dir/libchromium_android_linker$shlib_extension" ] [ "$root_shlib_dir/libchromium_android_linker$shlib_extension" ]
...@@ -2037,7 +2029,6 @@ if (enable_java_templates) { ...@@ -2037,7 +2029,6 @@ if (enable_java_templates) {
"deps", "deps",
"extensions_to_not_compress", "extensions_to_not_compress",
"language_splits", "language_splits",
"page_align_shared_libraries",
"public_deps", "public_deps",
"secondary_native_libs", "secondary_native_libs",
"shared_resources", "shared_resources",
...@@ -2087,7 +2078,6 @@ if (enable_java_templates) { ...@@ -2087,7 +2078,6 @@ if (enable_java_templates) {
_extra_native_libs_even_when_incremental != []) && _extra_native_libs_even_when_incremental != []) &&
!_create_abi_split) { !_create_abi_split) {
deps += _native_libs_deps + _extra_native_libs_deps + deps += _native_libs_deps + _extra_native_libs_deps +
_extra_native_libs_even_when_incremental_deps +
[ _native_libs_file_arg_dep ] [ _native_libs_file_arg_dep ]
native_libs_filearg = _native_libs_file_arg native_libs_filearg = _native_libs_file_arg
native_libs = _extra_native_libs native_libs = _extra_native_libs
...@@ -2148,9 +2138,7 @@ if (enable_java_templates) { ...@@ -2148,9 +2138,7 @@ if (enable_java_templates) {
"public_deps", "public_deps",
]) ])
incremental_deps = incremental_deps = deps + [ ":$_manifest_rule" ]
deps + _extra_native_libs_even_when_incremental_deps +
[ ":$_manifest_rule" ]
deps = [] deps = []
deps = incremental_deps + _native_libs_deps + _extra_native_libs_deps + deps = incremental_deps + _native_libs_deps + _extra_native_libs_deps +
[ _native_libs_file_arg_dep ] [ _native_libs_file_arg_dep ]
......
...@@ -104,7 +104,6 @@ template("monochrome_public_apk_tmpl") { ...@@ -104,7 +104,6 @@ template("monochrome_public_apk_tmpl") {
# Configrations to make android load shared library from APK. # Configrations to make android load shared library from APK.
uncompress_shared_libraries = true uncompress_shared_libraries = true
page_align_shared_libraries = true
forward_variables_from(invoker, "*") forward_variables_from(invoker, "*")
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment