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.
7 """Utility script to install APKs from the command line quickly."""
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
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 '
29 option_parser
.add_option('--keep_data',
32 help=('Keep the package data when installing '
36 def ValidateInstallAPKOption(option_parser
, options
):
37 """Validates the apk option and potentially qualifies the path."""
39 option_parser
.error('--apk is mandatory.')
40 if not os
.path
.exists(options
.apk
):
41 options
.apk
= os
.path
.join(constants
.GetOutDirectory(), 'apks',
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
53 parser
= optparse
.OptionParser()
54 AddInstallAPKOption(parser
)
55 options
, args
= parser
.parse_args(argv
)
56 constants
.SetBuildType(options
.build_type
)
57 ValidateInstallAPKOption(parser
, options
)
59 raise Exception('Error: Unknown argument:', args
[1:])
61 devices
= android_commands
.GetAttachedDevices()
63 raise Exception('Error: no connected devices')
65 if not options
.apk_package
:
66 options
.apk_package
= apk_helper
.GetPackageName(options
.apk
)
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
),
76 if __name__
== '__main__':
77 sys
.exit(main(sys
.argv
))