Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(5)

Side by Side Diff: build/android/gyp/package_resources.py

Issue 1351033003: Make use of md5_check within package_resources.py (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@md5-check-2
Patch Set: package_resources review nits Created 5 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 zipfile 21 import zipfile
21 22
22 from util import build_utils 23 from util import build_utils
23 24
24 25
25 # List is generated from the chrome_apk.apk_intermediates.ap_ via: 26 # List is generated from the chrome_apk.apk_intermediates.ap_ via:
26 # unzip -l $FILE_AP_ | cut -c31- | grep res/draw | cut -d'/' -f 2 | sort \ 27 # unzip -l $FILE_AP_ | cut -c31- | grep res/draw | cut -d'/' -f 2 | sort \
27 # | uniq | grep -- -tvdpi- | cut -c10- 28 # | uniq | grep -- -tvdpi- | cut -c10-
28 # and then manually sorted. 29 # and then manually sorted.
29 # Note that we can't just do a cross-product of dimentions because the filenames 30 # Note that we can't just do a cross-product of dimentions because the filenames
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
64 'xxxhdpi-v21', 65 'xxxhdpi-v21',
65 ), 66 ),
66 'tvdpi': ( 67 'tvdpi': (
67 'tvdpi-v4', 68 'tvdpi-v4',
68 'sw600dp-tvdpi-v13', 69 'sw600dp-tvdpi-v13',
69 'ldrtl-sw600dp-tvdpi-v17', 70 'ldrtl-sw600dp-tvdpi-v17',
70 ), 71 ),
71 } 72 }
72 73
73 74
74 def ParseArgs(): 75 def _ParseArgs(args):
75 """Parses command line options. 76 """Parses command line options.
76 77
77 Returns: 78 Returns:
78 An options object as from optparse.OptionsParser.parse_args() 79 An options object as from optparse.OptionsParser.parse_args()
79 """ 80 """
80 parser = optparse.OptionParser() 81 parser = optparse.OptionParser()
81 build_utils.AddDepfileOption(parser) 82 build_utils.AddDepfileOption(parser)
82 parser.add_option('--android-sdk', help='path to the Android SDK folder') 83 parser.add_option('--android-sdk', help='path to the Android SDK folder')
83 parser.add_option('--aapt-path', 84 parser.add_option('--aapt-path',
84 help='path to the Android aapt tool') 85 help='path to the Android aapt tool')
85 86
86 parser.add_option('--configuration-name', 87 parser.add_option('--configuration-name',
87 help='Gyp\'s configuration name (Debug or Release).') 88 help='Gyp\'s configuration name (Debug or Release).')
88 89
89 parser.add_option('--android-manifest', help='AndroidManifest.xml path') 90 parser.add_option('--android-manifest', help='AndroidManifest.xml path')
90 parser.add_option('--version-code', help='Version code for apk.') 91 parser.add_option('--version-code', help='Version code for apk.')
91 parser.add_option('--version-name', help='Version name for apk.') 92 parser.add_option('--version-name', help='Version name for apk.')
92 parser.add_option( 93 parser.add_option(
93 '--shared-resources', 94 '--shared-resources',
94 action='store_true', 95 action='store_true',
95 help='Make a resource package that can be loaded by a different' 96 help='Make a resource package that can be loaded by a different'
96 'application at runtime to access the package\'s resources.') 97 'application at runtime to access the package\'s resources.')
97 parser.add_option( 98 parser.add_option(
98 '--app-as-shared-lib', 99 '--app-as-shared-lib',
99 action='store_true', 100 action='store_true',
100 help='Make a resource package that can be loaded as shared library') 101 help='Make a resource package that can be loaded as shared library')
101 parser.add_option('--resource-zips', 102 parser.add_option('--resource-zips',
103 default='[]',
102 help='zip files containing resources to be packaged') 104 help='zip files containing resources to be packaged')
103 parser.add_option('--asset-dir', 105 parser.add_option('--asset-dir',
104 help='directories containing assets to be packaged') 106 help='directories containing assets to be packaged')
105 parser.add_option('--no-compress', help='disables compression for the ' 107 parser.add_option('--no-compress', help='disables compression for the '
106 'given comma separated list of extensions') 108 'given comma separated list of extensions')
107 parser.add_option( 109 parser.add_option(
108 '--create-density-splits', 110 '--create-density-splits',
109 action='store_true', 111 action='store_true',
110 help='Enables density splits') 112 help='Enables density splits')
111 parser.add_option('--language-splits', 113 parser.add_option('--language-splits',
114 default='[]',
112 help='GYP list of languages to create splits for') 115 help='GYP list of languages to create splits for')
113 116
114 parser.add_option('--apk-path', 117 parser.add_option('--apk-path',
115 help='Path to output (partial) apk.') 118 help='Path to output (partial) apk.')
116 119
117 (options, args) = parser.parse_args() 120 options, positional_args = parser.parse_args(args)
118 121
119 if args: 122 if positional_args:
120 parser.error('No positional arguments should be given.') 123 parser.error('No positional arguments should be given.')
121 124
122 # Check that required options have been provided. 125 # Check that required options have been provided.
123 required_options = ('android_sdk', 'aapt_path', 'configuration_name', 126 required_options = ('android_sdk', 'aapt_path', 'configuration_name',
124 'android_manifest', 'version_code', 'version_name', 127 'android_manifest', 'version_code', 'version_name',
125 'apk_path') 128 'apk_path')
126 129
127 build_utils.CheckOptions(options, parser, required=required_options) 130 build_utils.CheckOptions(options, parser, required=required_options)
128 131
132 options.resource_zips = build_utils.ParseGypList(options.resource_zips)
133 options.language_splits = build_utils.ParseGypList(options.language_splits)
129 return options 134 return options
130 135
131 136
132 def MoveImagesToNonMdpiFolders(res_root): 137 def MoveImagesToNonMdpiFolders(res_root):
133 """Move images from drawable-*-mdpi-* folders to drawable-* folders. 138 """Move images from drawable-*-mdpi-* folders to drawable-* folders.
134 139
135 Why? http://crbug.com/289843 140 Why? http://crbug.com/289843
136 """ 141 """
137 for src_dir_name in os.listdir(res_root): 142 for src_dir_name in os.listdir(res_root):
138 src_components = src_dir_name.split('-') 143 src_components = src_dir_name.split('-')
(...skipping 30 matching lines...) Expand all
169 res_dirs = sorted(subdirs, key=lambda p : int(os.path.basename(p))) 174 res_dirs = sorted(subdirs, key=lambda p : int(os.path.basename(p)))
170 else: 175 else:
171 res_dirs = [d] 176 res_dirs = [d]
172 package_command = [] 177 package_command = []
173 for d in res_dirs: 178 for d in res_dirs:
174 MoveImagesToNonMdpiFolders(d) 179 MoveImagesToNonMdpiFolders(d)
175 package_command += ['-S', d] 180 package_command += ['-S', d]
176 return package_command 181 return package_command
177 182
178 183
184 def _GenerateDensitySplitPaths(apk_path):
185 for density, config in DENSITY_SPLITS.iteritems():
186 src_path = '%s_%s' % (apk_path, '_'.join(config))
187 dst_path = '%s_%s' % (apk_path, density)
188 yield src_path, dst_path
189
190
191 def _GenerateLanguageSplitOutputPaths(apk_path, languages):
192 for lang in languages:
193 yield '%s_%s' % (apk_path, lang)
194
195
179 def RenameDensitySplits(apk_path): 196 def RenameDensitySplits(apk_path):
180 """Renames all density splits to have shorter / predictable names.""" 197 """Renames all density splits to have shorter / predictable names."""
181 for density, config in DENSITY_SPLITS.iteritems(): 198 for src_path, dst_path in _GenerateDensitySplitPaths(apk_path):
182 src_path = '%s_%s' % (apk_path, '_'.join(config)) 199 shutil.move(src_path, dst_path)
183 dst_path = '%s_%s' % (apk_path, density)
184 if src_path != dst_path:
185 if os.path.exists(dst_path):
186 os.unlink(dst_path)
187 os.rename(src_path, dst_path)
188 200
189 201
190 def CheckForMissedConfigs(apk_path, check_density, languages): 202 def CheckForMissedConfigs(apk_path, check_density, languages):
191 """Raises an exception if apk_path contains any unexpected configs.""" 203 """Raises an exception if apk_path contains any unexpected configs."""
192 triggers = [] 204 triggers = []
193 if check_density: 205 if check_density:
194 triggers.extend(re.compile('-%s' % density) for density in DENSITY_SPLITS) 206 triggers.extend(re.compile('-%s' % density) for density in DENSITY_SPLITS)
195 if languages: 207 if languages:
196 triggers.extend(re.compile(r'-%s\b' % lang) for lang in languages) 208 triggers.extend(re.compile(r'-%s\b' % lang) for lang in languages)
197 with zipfile.ZipFile(apk_path) as main_apk_zip: 209 with zipfile.ZipFile(apk_path) as main_apk_zip:
198 for name in main_apk_zip.namelist(): 210 for name in main_apk_zip.namelist():
199 for trigger in triggers: 211 for trigger in triggers:
200 if trigger.search(name) and not 'mipmap-' in name: 212 if trigger.search(name) and not 'mipmap-' in name:
201 raise Exception(('Found config in main apk that should have been ' + 213 raise Exception(('Found config in main apk that should have been ' +
202 'put into a split: %s\nYou need to update ' + 214 'put into a split: %s\nYou need to update ' +
203 'package_resources.py to include this new ' + 215 'package_resources.py to include this new ' +
204 'config (trigger=%s)') % (name, trigger.pattern)) 216 'config (trigger=%s)') % (name, trigger.pattern))
205 217
206 218
207 def main(): 219 def _ConstructMostAaptArgs(options):
208 options = ParseArgs() 220 package_command = [
209 android_jar = os.path.join(options.android_sdk, 'android.jar') 221 options.aapt_path,
210 aapt = options.aapt_path 222 'package',
223 '--version-code', options.version_code,
224 '--version-name', options.version_name,
225 '-M', options.android_manifest,
226 '--no-crunch',
227 '-f',
228 '--auto-add-overlay',
229 '-I', os.path.join(options.android_sdk, 'android.jar'),
230 '-F', options.apk_path,
231 '--ignore-assets', build_utils.AAPT_IGNORE_PATTERN,
232 ]
211 233
234 if options.no_compress:
235 for ext in options.no_compress.split(','):
236 package_command += ['-0', ext]
237
238 if options.shared_resources:
239 package_command.append('--shared-lib')
240
241 if options.app_as_shared_lib:
242 package_command.append('--app-as-shared-lib')
243
244 if options.asset_dir and os.path.exists(options.asset_dir):
245 package_command += ['-A', options.asset_dir]
246
247 if options.create_density_splits:
248 for config in DENSITY_SPLITS.itervalues():
249 package_command.extend(('--split', ','.join(config)))
250
251 if options.language_splits:
252 for lang in options.language_splits:
253 package_command.extend(('--split', lang))
254
255 if 'Debug' in options.configuration_name:
256 package_command += ['--debug-mode']
257
258 return package_command
259
260
261 def _OnStaleMd5(package_command, options):
212 with build_utils.TempDir() as temp_dir: 262 with build_utils.TempDir() as temp_dir:
213 package_command = [aapt,
214 'package',
215 '--version-code', options.version_code,
216 '--version-name', options.version_name,
217 '-M', options.android_manifest,
218 '--no-crunch',
219 '-f',
220 '--auto-add-overlay',
221 '-I', android_jar,
222 '-F', options.apk_path,
223 '--ignore-assets', build_utils.AAPT_IGNORE_PATTERN,
224 ]
225
226 if options.no_compress:
227 for ext in options.no_compress.split(','):
228 package_command += ['-0', ext]
229 if options.shared_resources:
230 package_command.append('--shared-lib')
231 if options.app_as_shared_lib:
232 package_command.append('--app-as-shared-lib')
233
234 if options.asset_dir and os.path.exists(options.asset_dir):
235 package_command += ['-A', options.asset_dir]
236
237 if options.resource_zips: 263 if options.resource_zips:
238 dep_zips = build_utils.ParseGypList(options.resource_zips) 264 dep_zips = options.resource_zips
239 for z in dep_zips: 265 for z in dep_zips:
240 subdir = os.path.join(temp_dir, os.path.basename(z)) 266 subdir = os.path.join(temp_dir, os.path.basename(z))
241 if os.path.exists(subdir): 267 if os.path.exists(subdir):
242 raise Exception('Resource zip name conflict: ' + os.path.basename(z)) 268 raise Exception('Resource zip name conflict: ' + os.path.basename(z))
243 build_utils.ExtractAll(z, path=subdir) 269 build_utils.ExtractAll(z, path=subdir)
244 package_command += PackageArgsForExtractedZip(subdir) 270 package_command += PackageArgsForExtractedZip(subdir)
245 271
246 if options.create_density_splits:
247 for config in DENSITY_SPLITS.itervalues():
248 package_command.extend(('--split', ','.join(config)))
249
250 language_splits = None
251 if options.language_splits:
252 language_splits = build_utils.ParseGypList(options.language_splits)
253 for lang in language_splits:
254 package_command.extend(('--split', lang))
255
256 if 'Debug' in options.configuration_name:
257 package_command += ['--debug-mode']
258
259 build_utils.CheckOutput( 272 build_utils.CheckOutput(
260 package_command, print_stdout=False, print_stderr=False) 273 package_command, print_stdout=False, print_stderr=False)
261 274
262 if options.create_density_splits or language_splits: 275 if options.create_density_splits or options.language_splits:
263 CheckForMissedConfigs( 276 CheckForMissedConfigs(options.apk_path, options.create_density_splits,
264 options.apk_path, options.create_density_splits, language_splits) 277 options.language_splits)
265 278
266 if options.create_density_splits: 279 if options.create_density_splits:
267 RenameDensitySplits(options.apk_path) 280 RenameDensitySplits(options.apk_path)
268 281
269 if options.depfile: 282
270 build_utils.WriteDepfile( 283 def main(args):
271 options.depfile, 284 args = build_utils.ExpandFileArgs(args)
272 build_utils.GetPythonDependencies()) 285 options = _ParseArgs(args)
286
287 package_command = _ConstructMostAaptArgs(options)
288
289 output_paths = [ options.apk_path ]
290
291 if options.create_density_splits:
292 for _, dst_path in _GenerateDensitySplitPaths(options.apk_path):
293 output_paths.append(dst_path)
294 output_paths.extend(
295 _GenerateLanguageSplitOutputPaths(options.apk_path,
296 options.language_splits))
297
298 input_paths = [ options.android_manifest ] + options.resource_zips
299 if options.asset_dir and os.path.exists(options.asset_dir):
300 for root, _, filenames in os.walk(options.asset_dir):
301 input_paths.extend(os.path.join(root, f) for f in filenames)
302
303 build_utils.CallAndWriteDepfileIfStale(
304 lambda: _OnStaleMd5(package_command, options),
305 options,
306 input_paths=input_paths,
307 input_strings=package_command,
308 output_paths=output_paths)
273 309
274 310
275 if __name__ == '__main__': 311 if __name__ == '__main__':
276 main() 312 main(sys.argv[1:])
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698