| 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 |
| 11 and | 11 and |
| 12 https://android.googlesource.com/platform/sdk/+/master/files/ant/build.xml | 12 https://android.googlesource.com/platform/sdk/+/master/files/ant/build.xml |
| 13 """ | 13 """ |
| 14 # pylint: enable=C0301 | 14 # pylint: enable=C0301 |
| 15 | 15 |
| 16 import optparse | 16 import optparse |
| 17 import os | 17 import os |
| 18 import re | 18 import re |
| 19 import shutil | 19 import shutil |
| 20 import sys | 20 import sys |
| 21 import zipfile | 21 import zipfile |
| 22 | 22 |
| 23 from util import build_utils | 23 from util import build_utils |
| 24 | 24 |
| 25 | 25 |
| 26 # A variation of this lists also exists in: |
| 27 # //base/android/java/src/org/chromium/base/LocaleUtils.java |
| 28 _CHROME_TO_ANDROID_LOCALE_MAP = { |
| 29 'en-GB': 'en-rGB', |
| 30 'en-US': 'en-rUS', |
| 31 'es-419': 'es-rUS', |
| 32 'fin': 'tl', |
| 33 'he': 'iw', |
| 34 'id': 'in', |
| 35 'pt-PT': 'pt-rPT', |
| 36 'pt-BR': 'pt-rBR', |
| 37 'yi': 'ji', |
| 38 'zh-CN': 'zh-rCN', |
| 39 'zh-TW': 'zh-rTW', |
| 40 } |
| 41 |
| 26 # List is generated from the chrome_apk.apk_intermediates.ap_ via: | 42 # List is generated from the chrome_apk.apk_intermediates.ap_ via: |
| 27 # unzip -l $FILE_AP_ | cut -c31- | grep res/draw | cut -d'/' -f 2 | sort \ | 43 # unzip -l $FILE_AP_ | cut -c31- | grep res/draw | cut -d'/' -f 2 | sort \ |
| 28 # | uniq | grep -- -tvdpi- | cut -c10- | 44 # | uniq | grep -- -tvdpi- | cut -c10- |
| 29 # and then manually sorted. | 45 # and then manually sorted. |
| 30 # Note that we can't just do a cross-product of dimentions because the filenames | 46 # Note that we can't just do a cross-product of dimentions because the filenames |
| 31 # become too big and aapt fails to create the files. | 47 # become too big and aapt fails to create the files. |
| 32 # This leaves all default drawables (mdpi) in the main apk. Android gets upset | 48 # This leaves all default drawables (mdpi) in the main apk. Android gets upset |
| 33 # though if any drawables are missing from the default drawables/ directory. | 49 # though if any drawables are missing from the default drawables/ directory. |
| 34 DENSITY_SPLITS = { | 50 DENSITY_SPLITS = { |
| 35 'hdpi': ( | 51 'hdpi': ( |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 106 parser.add_option('--asset-dir', | 122 parser.add_option('--asset-dir', |
| 107 help='directories containing assets to be packaged') | 123 help='directories containing assets to be packaged') |
| 108 parser.add_option('--no-compress', help='disables compression for the ' | 124 parser.add_option('--no-compress', help='disables compression for the ' |
| 109 'given comma separated list of extensions') | 125 'given comma separated list of extensions') |
| 110 parser.add_option( | 126 parser.add_option( |
| 111 '--create-density-splits', | 127 '--create-density-splits', |
| 112 action='store_true', | 128 action='store_true', |
| 113 help='Enables density splits') | 129 help='Enables density splits') |
| 114 parser.add_option('--language-splits', | 130 parser.add_option('--language-splits', |
| 115 default='[]', | 131 default='[]', |
| 116 help='GYP list of languages to create splits for') | 132 help='GN list of languages to create splits for') |
| 133 parser.add_option('--locale-whitelist', |
| 134 default='[]', |
| 135 help='GN list of languages to include. All other language ' |
| 136 'configs will be stripped out. List may include ' |
| 137 'a combination of Android locales or Chrome locales.') |
| 117 | 138 |
| 118 parser.add_option('--apk-path', | 139 parser.add_option('--apk-path', |
| 119 help='Path to output (partial) apk.') | 140 help='Path to output (partial) apk.') |
| 120 | 141 |
| 121 options, positional_args = parser.parse_args(args) | 142 options, positional_args = parser.parse_args(args) |
| 122 | 143 |
| 123 if positional_args: | 144 if positional_args: |
| 124 parser.error('No positional arguments should be given.') | 145 parser.error('No positional arguments should be given.') |
| 125 | 146 |
| 126 # Check that required options have been provided. | 147 # Check that required options have been provided. |
| 127 required_options = ('android_sdk_jar', 'aapt_path', 'configuration_name', | 148 required_options = ('android_sdk_jar', 'aapt_path', 'configuration_name', |
| 128 'android_manifest', 'version_code', 'version_name', | 149 'android_manifest', 'version_code', 'version_name', |
| 129 'apk_path') | 150 'apk_path') |
| 130 | 151 |
| 131 build_utils.CheckOptions(options, parser, required=required_options) | 152 build_utils.CheckOptions(options, parser, required=required_options) |
| 132 | 153 |
| 133 options.resource_zips = build_utils.ParseGnList(options.resource_zips) | 154 options.resource_zips = build_utils.ParseGnList(options.resource_zips) |
| 134 options.language_splits = build_utils.ParseGnList(options.language_splits) | 155 options.language_splits = build_utils.ParseGnList(options.language_splits) |
| 156 options.locale_whitelist = build_utils.ParseGnList(options.locale_whitelist) |
| 135 return options | 157 return options |
| 136 | 158 |
| 137 | 159 |
| 160 def _ToAaptLocales(locale_whitelist): |
| 161 """Converts the list of Chrome locales to aapt config locales.""" |
| 162 ret = set() |
| 163 for locale in locale_whitelist: |
| 164 locale = _CHROME_TO_ANDROID_LOCALE_MAP.get(locale, locale) |
| 165 if locale is None or ('-' in locale and '-r' not in locale): |
| 166 raise Exception('_CHROME_TO_ANDROID_LOCALE_MAP needs updating.' |
| 167 ' Found: %s' % locale) |
| 168 ret.add(locale) |
| 169 # Always keep non-regional fall-backs. |
| 170 language = locale.split('-')[0] |
| 171 ret.add(language) |
| 172 |
| 173 return sorted(ret) |
| 174 |
| 175 |
| 138 def MoveImagesToNonMdpiFolders(res_root): | 176 def MoveImagesToNonMdpiFolders(res_root): |
| 139 """Move images from drawable-*-mdpi-* folders to drawable-* folders. | 177 """Move images from drawable-*-mdpi-* folders to drawable-* folders. |
| 140 | 178 |
| 141 Why? http://crbug.com/289843 | 179 Why? http://crbug.com/289843 |
| 142 """ | 180 """ |
| 143 for src_dir_name in os.listdir(res_root): | 181 for src_dir_name in os.listdir(res_root): |
| 144 src_components = src_dir_name.split('-') | 182 src_components = src_dir_name.split('-') |
| 145 if src_components[0] != 'drawable' or 'mdpi' not in src_components: | 183 if src_components[0] != 'drawable' or 'mdpi' not in src_components: |
| 146 continue | 184 continue |
| 147 src_dir = os.path.join(res_root, src_dir_name) | 185 src_dir = os.path.join(res_root, src_dir_name) |
| (...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 250 for config in DENSITY_SPLITS.itervalues(): | 288 for config in DENSITY_SPLITS.itervalues(): |
| 251 package_command.extend(('--split', ','.join(config))) | 289 package_command.extend(('--split', ','.join(config))) |
| 252 | 290 |
| 253 if options.language_splits: | 291 if options.language_splits: |
| 254 for lang in options.language_splits: | 292 for lang in options.language_splits: |
| 255 package_command.extend(('--split', lang)) | 293 package_command.extend(('--split', lang)) |
| 256 | 294 |
| 257 if 'Debug' in options.configuration_name: | 295 if 'Debug' in options.configuration_name: |
| 258 package_command += ['--debug-mode'] | 296 package_command += ['--debug-mode'] |
| 259 | 297 |
| 298 if options.locale_whitelist: |
| 299 aapt_locales = _ToAaptLocales(options.locale_whitelist) |
| 300 package_command += ['-c', ','.join(aapt_locales)] |
| 301 |
| 260 return package_command | 302 return package_command |
| 261 | 303 |
| 262 | 304 |
| 263 def _OnStaleMd5(package_command, options): | 305 def _OnStaleMd5(package_command, options): |
| 264 with build_utils.TempDir() as temp_dir: | 306 with build_utils.TempDir() as temp_dir: |
| 265 if options.resource_zips: | 307 if options.resource_zips: |
| 266 dep_zips = options.resource_zips | 308 dep_zips = options.resource_zips |
| 267 for z in dep_zips: | 309 for z in dep_zips: |
| 268 subdir = os.path.join(temp_dir, os.path.basename(z)) | 310 subdir = os.path.join(temp_dir, os.path.basename(z)) |
| 269 if os.path.exists(subdir): | 311 if os.path.exists(subdir): |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 316 build_utils.CallAndWriteDepfileIfStale( | 358 build_utils.CallAndWriteDepfileIfStale( |
| 317 lambda: _OnStaleMd5(package_command, options), | 359 lambda: _OnStaleMd5(package_command, options), |
| 318 options, | 360 options, |
| 319 input_paths=input_paths, | 361 input_paths=input_paths, |
| 320 input_strings=input_strings, | 362 input_strings=input_strings, |
| 321 output_paths=output_paths) | 363 output_paths=output_paths) |
| 322 | 364 |
| 323 | 365 |
| 324 if __name__ == '__main__': | 366 if __name__ == '__main__': |
| 325 main(sys.argv[1:]) | 367 main(sys.argv[1:]) |
| OLD | NEW |