| Index: build/android/gyp/package_resources.py
|
| diff --git a/build/android/gyp/package_resources.py b/build/android/gyp/package_resources.py
|
| index 195c2a4fba11be3ae617cd06b255a104bd54475e..68c7b49ef91f73b7c3b69072b5dd158a162b71ad 100755
|
| --- a/build/android/gyp/package_resources.py
|
| +++ b/build/android/gyp/package_resources.py
|
| @@ -17,6 +17,7 @@ import optparse
|
| import os
|
| import re
|
| import shutil
|
| +import sys
|
| import zipfile
|
|
|
| from util import build_utils
|
| @@ -71,7 +72,7 @@ DENSITY_SPLITS = {
|
| }
|
|
|
|
|
| -def ParseArgs():
|
| +def _ParseArgs(args):
|
| """Parses command line options.
|
|
|
| Returns:
|
| @@ -99,6 +100,7 @@ def ParseArgs():
|
| action='store_true',
|
| help='Make a resource package that can be loaded as shared library')
|
| parser.add_option('--resource-zips',
|
| + default='[]',
|
| help='zip files containing resources to be packaged')
|
| parser.add_option('--asset-dir',
|
| help='directories containing assets to be packaged')
|
| @@ -109,14 +111,15 @@ def ParseArgs():
|
| action='store_true',
|
| help='Enables density splits')
|
| parser.add_option('--language-splits',
|
| + default='[]',
|
| help='GYP list of languages to create splits for')
|
|
|
| parser.add_option('--apk-path',
|
| help='Path to output (partial) apk.')
|
|
|
| - (options, args) = parser.parse_args()
|
| + options, positional_args = parser.parse_args(args)
|
|
|
| - if args:
|
| + if positional_args:
|
| parser.error('No positional arguments should be given.')
|
|
|
| # Check that required options have been provided.
|
| @@ -126,6 +129,8 @@ def ParseArgs():
|
|
|
| build_utils.CheckOptions(options, parser, required=required_options)
|
|
|
| + options.resource_zips = build_utils.ParseGypList(options.resource_zips)
|
| + options.language_splits = build_utils.ParseGypList(options.language_splits)
|
| return options
|
|
|
|
|
| @@ -176,15 +181,22 @@ def PackageArgsForExtractedZip(d):
|
| return package_command
|
|
|
|
|
| -def RenameDensitySplits(apk_path):
|
| - """Renames all density splits to have shorter / predictable names."""
|
| +def _GenerateDensitySplitPaths(apk_path):
|
| for density, config in DENSITY_SPLITS.iteritems():
|
| src_path = '%s_%s' % (apk_path, '_'.join(config))
|
| dst_path = '%s_%s' % (apk_path, density)
|
| - if src_path != dst_path:
|
| - if os.path.exists(dst_path):
|
| - os.unlink(dst_path)
|
| - os.rename(src_path, dst_path)
|
| + yield src_path, dst_path
|
| +
|
| +
|
| +def _GenerateLanguageSplitOutputPaths(apk_path, languages):
|
| + for lang in languages:
|
| + yield '%s_%s' % (apk_path, lang)
|
| +
|
| +
|
| +def RenameDensitySplits(apk_path):
|
| + """Renames all density splits to have shorter / predictable names."""
|
| + for src_path, dst_path in _GenerateDensitySplitPaths(apk_path):
|
| + shutil.move(src_path, dst_path)
|
|
|
|
|
| def CheckForMissedConfigs(apk_path, check_density, languages):
|
| @@ -204,38 +216,52 @@ def CheckForMissedConfigs(apk_path, check_density, languages):
|
| 'config (trigger=%s)') % (name, trigger.pattern))
|
|
|
|
|
| -def main():
|
| - options = ParseArgs()
|
| - android_jar = os.path.join(options.android_sdk, 'android.jar')
|
| - aapt = options.aapt_path
|
| +def _ConstructMostAaptArgs(options):
|
| + package_command = [
|
| + options.aapt_path,
|
| + 'package',
|
| + '--version-code', options.version_code,
|
| + '--version-name', options.version_name,
|
| + '-M', options.android_manifest,
|
| + '--no-crunch',
|
| + '-f',
|
| + '--auto-add-overlay',
|
| + '-I', os.path.join(options.android_sdk, 'android.jar'),
|
| + '-F', options.apk_path,
|
| + '--ignore-assets', build_utils.AAPT_IGNORE_PATTERN,
|
| + ]
|
|
|
| - with build_utils.TempDir() as temp_dir:
|
| - package_command = [aapt,
|
| - 'package',
|
| - '--version-code', options.version_code,
|
| - '--version-name', options.version_name,
|
| - '-M', options.android_manifest,
|
| - '--no-crunch',
|
| - '-f',
|
| - '--auto-add-overlay',
|
| - '-I', android_jar,
|
| - '-F', options.apk_path,
|
| - '--ignore-assets', build_utils.AAPT_IGNORE_PATTERN,
|
| - ]
|
| -
|
| - if options.no_compress:
|
| - for ext in options.no_compress.split(','):
|
| - package_command += ['-0', ext]
|
| - if options.shared_resources:
|
| - package_command.append('--shared-lib')
|
| - if options.app_as_shared_lib:
|
| - package_command.append('--app-as-shared-lib')
|
| -
|
| - if options.asset_dir and os.path.exists(options.asset_dir):
|
| - package_command += ['-A', options.asset_dir]
|
| + if options.no_compress:
|
| + for ext in options.no_compress.split(','):
|
| + package_command += ['-0', ext]
|
| +
|
| + if options.shared_resources:
|
| + package_command.append('--shared-lib')
|
| +
|
| + if options.app_as_shared_lib:
|
| + package_command.append('--app-as-shared-lib')
|
| +
|
| + if options.asset_dir and os.path.exists(options.asset_dir):
|
| + package_command += ['-A', options.asset_dir]
|
| +
|
| + if options.create_density_splits:
|
| + for config in DENSITY_SPLITS.itervalues():
|
| + package_command.extend(('--split', ','.join(config)))
|
| +
|
| + if options.language_splits:
|
| + for lang in options.language_splits:
|
| + package_command.extend(('--split', lang))
|
| +
|
| + if 'Debug' in options.configuration_name:
|
| + package_command += ['--debug-mode']
|
|
|
| + return package_command
|
| +
|
| +
|
| +def _OnStaleMd5(package_command, options):
|
| + with build_utils.TempDir() as temp_dir:
|
| if options.resource_zips:
|
| - dep_zips = build_utils.ParseGypList(options.resource_zips)
|
| + dep_zips = options.resource_zips
|
| for z in dep_zips:
|
| subdir = os.path.join(temp_dir, os.path.basename(z))
|
| if os.path.exists(subdir):
|
| @@ -243,34 +269,44 @@ def main():
|
| build_utils.ExtractAll(z, path=subdir)
|
| package_command += PackageArgsForExtractedZip(subdir)
|
|
|
| - if options.create_density_splits:
|
| - for config in DENSITY_SPLITS.itervalues():
|
| - package_command.extend(('--split', ','.join(config)))
|
| -
|
| - language_splits = None
|
| - if options.language_splits:
|
| - language_splits = build_utils.ParseGypList(options.language_splits)
|
| - for lang in language_splits:
|
| - package_command.extend(('--split', lang))
|
| -
|
| - if 'Debug' in options.configuration_name:
|
| - package_command += ['--debug-mode']
|
| -
|
| build_utils.CheckOutput(
|
| package_command, print_stdout=False, print_stderr=False)
|
|
|
| - if options.create_density_splits or language_splits:
|
| - CheckForMissedConfigs(
|
| - options.apk_path, options.create_density_splits, language_splits)
|
| + if options.create_density_splits or options.language_splits:
|
| + CheckForMissedConfigs(options.apk_path, options.create_density_splits,
|
| + options.language_splits)
|
|
|
| if options.create_density_splits:
|
| RenameDensitySplits(options.apk_path)
|
|
|
| - if options.depfile:
|
| - build_utils.WriteDepfile(
|
| - options.depfile,
|
| - build_utils.GetPythonDependencies())
|
| +
|
| +def main(args):
|
| + args = build_utils.ExpandFileArgs(args)
|
| + options = _ParseArgs(args)
|
| +
|
| + package_command = _ConstructMostAaptArgs(options)
|
| +
|
| + output_paths = [ options.apk_path ]
|
| +
|
| + if options.create_density_splits:
|
| + for _, dst_path in _GenerateDensitySplitPaths(options.apk_path):
|
| + output_paths.append(dst_path)
|
| + output_paths.extend(
|
| + _GenerateLanguageSplitOutputPaths(options.apk_path,
|
| + options.language_splits))
|
| +
|
| + input_paths = [ options.android_manifest ] + options.resource_zips
|
| + if options.asset_dir and os.path.exists(options.asset_dir):
|
| + for root, _, filenames in os.walk(options.asset_dir):
|
| + input_paths.extend(os.path.join(root, f) for f in filenames)
|
| +
|
| + build_utils.CallAndWriteDepfileIfStale(
|
| + lambda: _OnStaleMd5(package_command, options),
|
| + options,
|
| + input_paths=input_paths,
|
| + input_strings=package_command,
|
| + output_paths=output_paths)
|
|
|
|
|
| if __name__ == '__main__':
|
| - main()
|
| + main(sys.argv[1:])
|
|
|