12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#!/usr/bin/env python
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# Copyright (c) 2012 The Chromium Authors. All rights reserved.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# Use of this source code is governed by a BSD-style license that can be
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# found in the LICENSE file.
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)"""Process Android library resources to generate R.java and crunched images."""
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import optparse
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import os
11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)import shlex
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)from util import build_utils
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)def ParseArgs():
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  """Parses command line options.
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Returns:
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    An options object as from optparse.OptionsParser.parse_args()
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  """
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  parser = optparse.OptionParser()
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  parser.add_option('--android-sdk', help='path to the Android SDK folder')
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  parser.add_option('--android-sdk-tools',
244311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch                    help='path to the Android SDK build tools folder')
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  parser.add_option('--R-dir', help='directory to hold generated R.java')
26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  parser.add_option('--res-dirs',
27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                    help='directories containing resources to be packaged')
28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  parser.add_option('--crunch-input-dir',
29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                    help='directory containing images to be crunched')
30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  parser.add_option('--crunch-output-dir',
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    help='directory to hold crunched resources')
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  parser.add_option('--non-constant-id', action='store_true')
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  parser.add_option('--custom-package', help='Java package for R.java')
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  parser.add_option('--android-manifest', help='AndroidManifest.xml path')
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  parser.add_option('--stamp', help='File to touch on success')
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  # This is part of a temporary fix for crbug.com/177552.
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  # TODO(newt): remove this once crbug.com/177552 is fixed in ninja.
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  parser.add_option('--ignore', help='this argument is ignored')
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  (options, args) = parser.parse_args()
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if args:
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    parser.error('No positional arguments should be given.')
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  # Check that required options have been provided.
464311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  required_options = ('android_sdk', 'android_sdk_tools', 'R_dir',
474311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch                      'res_dirs', 'crunch_input_dir', 'crunch_output_dir')
48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  build_utils.CheckOptions(options, parser, required=required_options)
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return options
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)def main():
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  options = ParseArgs()
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  android_jar = os.path.join(options.android_sdk, 'android.jar')
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  aapt = os.path.join(options.android_sdk_tools, 'aapt')
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  build_utils.MakeDirectory(options.R_dir)
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  # Generate R.java. This R.java contains non-final constants and is used only
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  # while compiling the library jar (e.g. chromium_content.jar). When building
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  # an apk, a new R.java file with the correct resource -> ID mappings will be
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  # generated by merging the resources from all libraries and the main apk
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  # project.
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  package_command = [aapt,
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     'package',
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     '-m',
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     '-M', options.android_manifest,
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     '--auto-add-overlay',
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     '-I', android_jar,
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     '--output-text-symbols', options.R_dir,
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     '-J', options.R_dir]
73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  res_dirs = shlex.split(options.res_dirs)
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  for res_dir in res_dirs:
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    package_command += ['-S', res_dir]
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if options.non_constant_id:
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    package_command.append('--non-constant-id')
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if options.custom_package:
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    package_command += ['--custom-package', options.custom_package]
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  build_utils.CheckCallDie(package_command)
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  # Crunch image resources. This shrinks png files and is necessary for 9-patch
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  # images to display correctly.
84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  build_utils.MakeDirectory(options.crunch_output_dir)
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  aapt_cmd = [aapt,
87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              'crunch',
88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              '-S', options.crunch_input_dir,
89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              '-C', options.crunch_output_dir]
90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  build_utils.CheckCallDie(aapt_cmd, suppress_output=True)
91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if options.stamp:
93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    build_utils.Touch(options.stamp)
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)if __name__ == '__main__':
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  main()
98