Home | History | Annotate | Download | only in android
      1 #!/usr/bin/env python
      2 #
      3 # Copyright (c) 2012 The Chromium Authors. All rights reserved.
      4 # Use of this source code is governed by a BSD-style license that can be
      5 # found in the LICENSE file.
      6 
      7 """Utility script to install APKs from the command line quickly."""
      8 
      9 import multiprocessing
     10 import optparse
     11 import os
     12 import sys
     13 
     14 from pylib import android_commands
     15 from pylib import constants
     16 from pylib.utils import apk_helper
     17 from pylib.utils import test_options_parser
     18 
     19 
     20 def AddInstallAPKOption(option_parser):
     21   """Adds apk option used to install the APK to the OptionParser."""
     22   test_options_parser.AddBuildTypeOption(option_parser)
     23   option_parser.add_option('--apk',
     24                            help=('The name of the apk containing the '
     25                                  ' application (with the .apk extension).'))
     26   option_parser.add_option('--apk_package',
     27                            help=('The package name used by the apk containing '
     28                                  'the application.'))
     29   option_parser.add_option('--keep_data',
     30                            action='store_true',
     31                            default=False,
     32                            help=('Keep the package data when installing '
     33                                  'the application.'))
     34 
     35 
     36 def ValidateInstallAPKOption(option_parser, options):
     37   """Validates the apk option and potentially qualifies the path."""
     38   if not options.apk:
     39     option_parser.error('--apk is mandatory.')
     40   if not os.path.exists(options.apk):
     41     options.apk = os.path.join(constants.GetOutDirectory(), 'apks',
     42                                options.apk)
     43 
     44 
     45 def _InstallApk(args):
     46   apk_path, apk_package, keep_data, device = args
     47   android_commands.AndroidCommands(device=device).ManagedInstall(
     48       apk_path, keep_data, apk_package)
     49   print '-----  Installed on %s  -----' % device
     50 
     51 
     52 def main(argv):
     53   parser = optparse.OptionParser()
     54   AddInstallAPKOption(parser)
     55   options, args = parser.parse_args(argv)
     56   constants.SetBuildType(options.build_type)
     57   ValidateInstallAPKOption(parser, options)
     58   if len(args) > 1:
     59     raise Exception('Error: Unknown argument:', args[1:])
     60 
     61   devices = android_commands.GetAttachedDevices()
     62   if not devices:
     63     raise Exception('Error: no connected devices')
     64 
     65   if not options.apk_package:
     66     options.apk_package = apk_helper.GetPackageName(options.apk)
     67 
     68   pool = multiprocessing.Pool(len(devices))
     69   # Send a tuple (apk_path, apk_package, device) per device.
     70   pool.map(_InstallApk, zip([options.apk] * len(devices),
     71                             [options.apk_package] * len(devices),
     72                             [options.keep_data] * len(devices),
     73                             devices))
     74 
     75 
     76 if __name__ == '__main__':
     77   sys.exit(main(sys.argv))
     78