Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
| 2 # | 2 # |
| 3 # Copyright 2014 The Chromium Authors. All rights reserved. | 3 # Copyright 2014 The Chromium Authors. All rights reserved. |
| 4 # Use of this source code is governed by a BSD-style license that can be | 4 # Use of this source code is governed by a BSD-style license that can be |
| 5 # found in the LICENSE file. | 5 # found in the LICENSE file. |
| 6 | 6 |
| 7 # pylint: disable=C0301 | 7 # pylint: disable=C0301 |
| 8 """Package resources into an apk. | 8 """Package resources into an apk. |
| 9 | 9 |
| 10 See https://android.googlesource.com/platform/tools/base/+/master/legacy/ant-tas ks/src/main/java/com/android/ant/AaptExecTask.java | 10 See https://android.googlesource.com/platform/tools/base/+/master/legacy/ant-tas ks/src/main/java/com/android/ant/AaptExecTask.java |
| (...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 128 action='store_true', | 128 action='store_true', |
| 129 help='Enables density splits') | 129 help='Enables density splits') |
| 130 parser.add_option('--language-splits', | 130 parser.add_option('--language-splits', |
| 131 default='[]', | 131 default='[]', |
| 132 help='GN list of languages to create splits for') | 132 help='GN list of languages to create splits for') |
| 133 parser.add_option('--locale-whitelist', | 133 parser.add_option('--locale-whitelist', |
| 134 default='[]', | 134 default='[]', |
| 135 help='GN list of languages to include. All other language ' | 135 help='GN list of languages to include. All other language ' |
| 136 'configs will be stripped out. List may include ' | 136 'configs will be stripped out. List may include ' |
| 137 'a combination of Android locales or Chrome locales.') | 137 'a combination of Android locales or Chrome locales.') |
| 138 | |
| 139 parser.add_option('--apk-path', | 138 parser.add_option('--apk-path', |
| 140 help='Path to output (partial) apk.') | 139 help='Path to output (partial) apk.') |
| 140 parser.add_option('--exclude-xxxhdpi', action='store_true', | |
| 141 help='Do not include xxxhdpi drawables.') | |
| 142 parser.add_option('--xxxhdpi-whitelist', | |
| 143 default='[]', | |
| 144 help='GN list of globs that say which xxxhdpi images to ' | |
| 145 'include even when --exclude-xxxhdpi is set.') | |
| 141 | 146 |
| 142 options, positional_args = parser.parse_args(args) | 147 options, positional_args = parser.parse_args(args) |
| 143 | 148 |
| 144 if positional_args: | 149 if positional_args: |
| 145 parser.error('No positional arguments should be given.') | 150 parser.error('No positional arguments should be given.') |
| 146 | 151 |
| 147 # Check that required options have been provided. | 152 # Check that required options have been provided. |
| 148 required_options = ('android_sdk_jar', 'aapt_path', 'configuration_name', | 153 required_options = ('android_sdk_jar', 'aapt_path', 'configuration_name', |
| 149 'android_manifest', 'version_code', 'version_name', | 154 'android_manifest', 'version_code', 'version_name', |
| 150 'apk_path') | 155 'apk_path') |
| 151 | 156 |
| 152 build_utils.CheckOptions(options, parser, required=required_options) | 157 build_utils.CheckOptions(options, parser, required=required_options) |
| 153 | 158 |
| 154 options.resource_zips = build_utils.ParseGnList(options.resource_zips) | 159 options.resource_zips = build_utils.ParseGnList(options.resource_zips) |
| 155 options.language_splits = build_utils.ParseGnList(options.language_splits) | 160 options.language_splits = build_utils.ParseGnList(options.language_splits) |
| 156 options.locale_whitelist = build_utils.ParseGnList(options.locale_whitelist) | 161 options.locale_whitelist = build_utils.ParseGnList(options.locale_whitelist) |
| 162 options.xxxhdpi_whitelist = build_utils.ParseGnList(options.xxxhdpi_whitelist) | |
| 157 return options | 163 return options |
| 158 | 164 |
| 159 | 165 |
| 160 def _ToAaptLocales(locale_whitelist): | 166 def _ToAaptLocales(locale_whitelist): |
| 161 """Converts the list of Chrome locales to aapt config locales.""" | 167 """Converts the list of Chrome locales to aapt config locales.""" |
| 162 ret = set() | 168 ret = set() |
| 163 for locale in locale_whitelist: | 169 for locale in locale_whitelist: |
| 164 locale = _CHROME_TO_ANDROID_LOCALE_MAP.get(locale, locale) | 170 locale = _CHROME_TO_ANDROID_LOCALE_MAP.get(locale, locale) |
| 165 if locale is None or ('-' in locale and '-r' not in locale): | 171 if locale is None or ('-' in locale and '-r' not in locale): |
| 166 raise Exception('_CHROME_TO_ANDROID_LOCALE_MAP needs updating.' | 172 raise Exception('_CHROME_TO_ANDROID_LOCALE_MAP needs updating.' |
| (...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 295 if 'Debug' in options.configuration_name: | 301 if 'Debug' in options.configuration_name: |
| 296 package_command += ['--debug-mode'] | 302 package_command += ['--debug-mode'] |
| 297 | 303 |
| 298 if options.locale_whitelist: | 304 if options.locale_whitelist: |
| 299 aapt_locales = _ToAaptLocales(options.locale_whitelist) | 305 aapt_locales = _ToAaptLocales(options.locale_whitelist) |
| 300 package_command += ['-c', ','.join(aapt_locales)] | 306 package_command += ['-c', ','.join(aapt_locales)] |
| 301 | 307 |
| 302 return package_command | 308 return package_command |
| 303 | 309 |
| 304 | 310 |
| 311 def _ResourceNameFromPath(path): | |
| 312 return os.path.splitext(os.path.basename(path))[0] | |
| 313 | |
| 314 | |
| 315 def _CreateExtractPredicate(dep_zips, exclude_xxxhdpi, xxxhdpi_whitelist): | |
| 316 if not exclude_xxxhdpi: | |
| 317 # Do not extract dotfiles (e.g. ".gitkeep"). aapt ignores them anyways. | |
| 318 return lambda path: os.path.basename(path)[0] != '.' | |
| 319 | |
| 320 # Returns True for all non-whitelisted, non-mipmap xxxhdpi. | |
|
Peter Wen
2017/06/22 15:00:00
s/True/False/?
Looks like it returns True for all
agrieve
2017/06/22 19:06:04
Done.
| |
| 321 naive_predicate = lambda path: ( | |
| 322 not re.search(r'[/-]xxxhdpi[/-]', path) or | |
| 323 re.search(r'[/-]mipmap[/-]', path) or | |
| 324 build_utils.MatchesGlob(path, xxxhdpi_whitelist)) | |
| 325 | |
| 326 # Build a set of all non-xxxhdpi drawables to ensure that we never exclude any | |
| 327 # xxxhdpi drawable that does not exist in other densities. | |
| 328 non_xxxhdpi_drawables = set() | |
| 329 for resource_zip_path in dep_zips: | |
| 330 with zipfile.ZipFile(resource_zip_path) as zip_file: | |
| 331 for path in zip_file.namelist(): | |
| 332 if re.search(r'[/-]drawable[/-]', path) and naive_predicate(path): | |
| 333 non_xxxhdpi_drawables.add(_ResourceNameFromPath(path)) | |
| 334 | |
| 335 return lambda path: (naive_predicate(path) or | |
| 336 _ResourceNameFromPath(path) not in non_xxxhdpi_drawables) | |
| 337 | |
| 338 | |
| 305 def _OnStaleMd5(package_command, options): | 339 def _OnStaleMd5(package_command, options): |
| 306 with build_utils.TempDir() as temp_dir: | 340 with build_utils.TempDir() as temp_dir: |
| 307 if options.resource_zips: | 341 if options.resource_zips: |
| 308 dep_zips = options.resource_zips | 342 dep_zips = options.resource_zips |
| 343 extract_predicate = _CreateExtractPredicate( | |
| 344 dep_zips, options.exclude_xxxhdpi, options.xxxhdpi_whitelist) | |
| 309 for z in dep_zips: | 345 for z in dep_zips: |
| 310 subdir = os.path.join(temp_dir, os.path.basename(z)) | 346 subdir = os.path.join(temp_dir, os.path.basename(z)) |
| 311 if os.path.exists(subdir): | 347 if os.path.exists(subdir): |
| 312 raise Exception('Resource zip name conflict: ' + os.path.basename(z)) | 348 raise Exception('Resource zip name conflict: ' + os.path.basename(z)) |
| 313 build_utils.ExtractAll(z, path=subdir) | 349 build_utils.ExtractAll(z, path=subdir, predicate=extract_predicate) |
| 314 package_command += PackageArgsForExtractedZip(subdir) | 350 package_command += PackageArgsForExtractedZip(subdir) |
| 315 | 351 |
| 316 build_utils.CheckOutput( | 352 build_utils.CheckOutput( |
| 317 package_command, print_stdout=False, print_stderr=False) | 353 package_command, print_stdout=False, print_stderr=False) |
| 318 | 354 |
| 319 if options.create_density_splits or options.language_splits: | 355 if options.create_density_splits or options.language_splits: |
| 320 CheckForMissedConfigs(options.apk_path, options.create_density_splits, | 356 CheckForMissedConfigs(options.apk_path, options.create_density_splits, |
| 321 options.language_splits) | 357 options.language_splits) |
| 322 | 358 |
| 323 if options.create_density_splits: | 359 if options.create_density_splits: |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 358 build_utils.CallAndWriteDepfileIfStale( | 394 build_utils.CallAndWriteDepfileIfStale( |
| 359 lambda: _OnStaleMd5(package_command, options), | 395 lambda: _OnStaleMd5(package_command, options), |
| 360 options, | 396 options, |
| 361 input_paths=input_paths, | 397 input_paths=input_paths, |
| 362 input_strings=input_strings, | 398 input_strings=input_strings, |
| 363 output_paths=output_paths) | 399 output_paths=output_paths) |
| 364 | 400 |
| 365 | 401 |
| 366 if __name__ == '__main__': | 402 if __name__ == '__main__': |
| 367 main(sys.argv[1:]) | 403 main(sys.argv[1:]) |
| OLD | NEW |