def add_common_arguments(p): script_common.AddDeviceArguments(p) script_common.AddEnvironmentArguments(p) p.add_argument('-v', '--verbose', action='count', default=0, help='Print more information.') p.add_argument('command', nargs='*')
def main(): parser = argparse.ArgumentParser(description=__doc__) parser.usage = '''%(prog)s --name FILENAME [--device SERIAL] [flags...] No flags: Prints existing command-line file. Empty string: Deletes command-line file. Otherwise: Writes command-line file. ''' parser.add_argument('--name', required=True, help='Name of file where to store flags on the device.') parser.add_argument('-e', '--executable', dest='executable', default='chrome', help='(deprecated) No longer used.') script_common.AddEnvironmentArguments(parser) script_common.AddDeviceArguments(parser) logging_common.AddLoggingArguments(parser) args, remote_args = parser.parse_known_args() devil_chromium.Initialize(adb_path=args.adb_path) logging_common.InitializeLogging(args) devices = device_utils.DeviceUtils.HealthyDevices(device_arg=args.devices, default_retries=0) all_devices = device_utils.DeviceUtils.parallel(devices) if not remote_args: # No args == do not update, just print flags. remote_args = None action = '' elif len(remote_args) == 1 and not remote_args[0]: # Single empty string arg == delete flags remote_args = [] action = 'Deleted command line file. ' else: action = 'Wrote command line file. ' def update_flags(device): CheckBuildTypeSupportsFlags(device, args.name) changer = flag_changer.FlagChanger(device, args.name) if remote_args is not None: flags = changer.ReplaceFlags(remote_args) else: flags = changer.GetCurrentFlags() return (device, device.build_description, flags) updated_values = all_devices.pMap(update_flags).pGet(None) print('%sCurrent flags (in %s):' % (action, args.name)) for d, desc, flags in updated_values: if flags: # Shell-quote flags for easy copy/paste as new args on the terminal. quoted_flags = ' '.join(cmd_helper.SingleQuote(f) for f in sorted(flags)) else: quoted_flags = '( empty )' print(' %s (%s): %s' % (d, desc, quoted_flags)) return 0
def add_common_arguments(parser): logging_common.AddLoggingArguments(parser) script_common.AddEnvironmentArguments(parser) parser.add_argument( '--avd-config', type=os.path.realpath, metavar='PATH', required=True, help='Path to an AVD config text protobuf.')
def main(): parser = argparse.ArgumentParser() logging_common.AddLoggingArguments(parser) script_common.AddEnvironmentArguments(parser) AddArguments(parser) args = parser.parse_args() logging_common.InitializeLogging(args) script_common.InitializeEnvironment(args) denylist = (device_denylist.Denylist(args.denylist_file) if args.denylist_file else None) expected_devices = GetExpectedDevices(args.known_devices_files) usb_devices = set(lsusb.get_android_devices()) devices = [ device_utils.DeviceUtils(s) for s in expected_devices.union(usb_devices) ] statuses = DeviceStatus(devices, denylist) # Log the state of all devices. _LogStatuses(statuses) # Update the last devices file(s). if args.overwrite_known_devices_files: for path in args.known_devices_files: device_list.WritePersistentDeviceList( path, [status['serial'] for status in statuses]) # Write device info to file for buildbot info display. _WriteBuildbotFile(args.buildbot_path, statuses) # Dump the device statuses to JSON. if args.json_output: with open(args.json_output, 'wb') as f: f.write( json.dumps(statuses, indent=4, sort_keys=True, separators=(',', ': '))) live_devices = [ status['serial'] for status in statuses if (status['adb_status'] == 'device' and not IsDenylisted(status['serial'], denylist)) ] # If all devices failed, or if there are no devices, it's an infra error. if not live_devices: logger.error('No available devices.') return 0 if live_devices else exit_codes.INFRA
def main(): parser = argparse.ArgumentParser(description=""" Removes the preinstalled WebView APKs to avoid signature mismatches during development. """) script_common.AddEnvironmentArguments(parser) script_common.AddDeviceArguments(parser) logging_common.AddLoggingArguments(parser) args = parser.parse_args() logging_common.InitializeLogging(args) devil_chromium.Initialize(adb_path=args.adb_path) devices = device_utils.DeviceUtils.HealthyDevices(device_arg=args.devices) device_utils.DeviceUtils.parallel(devices).pMap(RemovePreinstalledWebViews)
def main(argv): """Launches the device monitor. Polls the devices for their battery and cpu temperatures and scans the denylist file every 60 seconds and dumps the data to DEVICE_FILE. """ parser = argparse.ArgumentParser(description='Launches the device monitor.') script_common.AddEnvironmentArguments(parser) parser.add_argument('--denylist-file', help='Path to device denylist file.') # TODO(crbug.com/1097306): Remove this once chromium_android/api.py stops # using it. parser.add_argument('--blacklist-file', dest='denylist_file', help=argparse.SUPPRESS) args = parser.parse_args(argv) logger = logging.getLogger() logger.setLevel(logging.DEBUG) handler = logging.handlers.RotatingFileHandler( '/tmp/device_monitor.log', maxBytes=10 * 1024 * 1024, backupCount=5) fmt = logging.Formatter( '%(asctime)s %(levelname)s %(message)s', datefmt='%y%m%d %H:%M:%S') handler.setFormatter(fmt) logger.addHandler(handler) script_common.InitializeEnvironment(args) denylist = (device_denylist.Denylist(args.denylist_file) if args.denylist_file else None) logging.info('Device monitor running with pid %d, adb: %s, denylist: %s', os.getpid(), args.adb_path, args.denylist_file) while True: start = time.time() status_dict = get_all_status(denylist) with open(DEVICE_FILE, 'wb') as f: json.dump(status_dict, f, indent=2, sort_keys=True) logging.info('Got status of all devices in %.2fs.', time.time() - start) time.sleep(60)
def main(): parser = argparse.ArgumentParser(description=""" Removes the preinstalled WebView APKs to avoid signature mismatches during development. """) parser.add_argument('--verbose', '-v', default=False, action='store_true') parser.add_argument('--quiet', '-q', default=False, action='store_true') script_common.AddEnvironmentArguments(parser) script_common.AddDeviceArguments(parser) args = parser.parse_args() if args.verbose: logging.basicConfig(stream=sys.stderr, level=logging.INFO) elif args.quiet: logging.basicConfig(stream=sys.stderr, level=logging.ERROR) else: logging.basicConfig(stream=sys.stderr, level=logging.WARN) devil_chromium.Initialize() script_common.InitializeEnvironment(args) devices = device_utils.DeviceUtils.HealthyDevices(device_arg=args.devices) device_utils.DeviceUtils.parallel(devices).pMap(RemovePreinstalledWebViews)
def main(): parser = argparse.ArgumentParser(description=""" Configures WebView to start recording a netlog. This script chooses a suitable netlog filename for the application, and will pull the netlog off the device when the user terminates the script (with ctrl-C). For a more complete usage guide, open your web browser to: https://chromium.googlesource.com/chromium/src/+/HEAD/android_webview/docs/net-debugging.md """) parser.add_argument( '--package', required=True, type=str, help='Package name of the application you intend to use.') parser.add_argument('--force', default=False, action='store_true', help='Suppress user checks.') script_common.AddEnvironmentArguments(parser) script_common.AddDeviceArguments(parser) logging_common.AddLoggingArguments(parser) args = parser.parse_args() logging_common.InitializeLogging(args) devil_chromium.Initialize(adb_path=args.adb_path) # Only use a single device, for the sake of simplicity (of implementation and # user experience). devices = device_utils.DeviceUtils.HealthyDevices(device_arg=args.devices) device = devices[0] if len(devices) > 1: raise device_errors.MultipleDevicesError(devices) package_name = args.package device_netlog_file_name = 'netlog.json' device_netlog_path = os.path.join( device.GetApplicationDataDirectory(package_name), 'app_webview', device_netlog_file_name) CheckAppNotRunning(device, package_name, args.force) # Append to the existing flags, to allow users to experiment with other # features/flags enabled. The CustomCommandLineFlags will restore the original # flag state after the user presses 'ctrl-C'. changer = flag_changer.FlagChanger(device, WEBVIEW_COMMAND_LINE) new_flags = changer.GetCurrentFlags() new_flags.append('--log-net-log={}'.format(device_netlog_path)) logging.info('Running with flags %r', new_flags) with flag_changer.CustomCommandLineFlags(device, WEBVIEW_COMMAND_LINE, new_flags): print( 'Netlog will start recording as soon as app starts up. Press ctrl-C ' 'to stop recording.') _WaitUntilCtrlC() host_netlog_path = 'netlog.json' print('Pulling netlog to "%s"' % host_netlog_path) # The netlog file will be under the app's uid, which the default shell doesn't # have permission to read (but root does). Prefer this to EnableRoot(), which # restarts the adb daemon. device.PullFile(device_netlog_path, host_netlog_path, as_root=True) device.RemovePath(device_netlog_path, as_root=True)
def setUp(self): # pylint: disable=protected-access self.parser = argparse.ArgumentParser() script_common.AddEnvironmentArguments(self.parser) devil_env.config = devil_env._Environment()
def main(raw_args): # Recommended options on perf bots: # --disable-network # TODO(tonyg): We eventually want network on. However, currently radios # can cause perfbots to drain faster than they charge. # --min-battery-level 95 # Some perf bots run benchmarks with USB charging disabled which leads # to gradual draining of the battery. We must wait for a full charge # before starting a run in order to keep the devices online. parser = argparse.ArgumentParser( description='Provision Android devices with settings required for bots.' ) logging_common.AddLoggingArguments(parser) script_common.AddDeviceArguments(parser) script_common.AddEnvironmentArguments(parser) parser.add_argument('--adb-key-files', type=str, nargs='+', help='list of adb keys to push to device') parser.add_argument('--disable-location', action='store_true', help='disable Google location services on devices') parser.add_argument('--disable-mock-location', action='store_true', default=False, help='Set ALLOW_MOCK_LOCATION to false') parser.add_argument('--disable-network', action='store_true', help='disable network access on devices') parser.add_argument('--disable-java-debug', action='store_false', dest='enable_java_debug', default=True, help='disable Java property asserts and JNI checking') parser.add_argument( '--disable-system-chrome', action='store_true', help='DEPRECATED: use --remove-system-packages com.android.google ' 'Disable the system chrome from devices.') parser.add_argument('--emulators', action='store_true', help='provision only emulators and ignore usb devices ' '(this will not wipe emulators)') parser.add_argument( '--max-battery-temp', type=int, metavar='NUM', help='Wait for the battery to have this temp or lower.') parser.add_argument( '--min-battery-level', type=int, metavar='NUM', help='wait for the device to reach this minimum battery' ' level before trying to continue') parser.add_argument('--output-device-denylist', help='Json file to output the device denylist.') parser.add_argument('--reboot-timeout', metavar='SECS', type=int, help='when wiping the device, max number of seconds to' ' wait after each reboot ' '(default: %s)' % _DEFAULT_TIMEOUTS.HELP_TEXT) parser.add_argument( '--remove-system-apps', nargs='*', dest='system_app_remove_list', help='DEPRECATED: use --remove-system-packages instead. ' 'The names of system apps to remove. ') parser.add_argument('--remove-system-packages', nargs='*', dest='system_package_remove_list', help='The names of system packages to remove.') parser.add_argument('--remove-system-webview', action='store_true', help='DEPRECATED: use --remove-system-packages ' 'com.google.android.webview com.android.webview ' 'Remove the system webview from devices.') parser.add_argument('--skip-wipe', action='store_true', default=False, help='do not wipe device data during provisioning') # No-op arguments for compatibility with build/android/provision_devices.py. # TODO(jbudorick): Remove these once all callers have stopped using them. parser.add_argument('--chrome-specific-wipe', action='store_true', help=argparse.SUPPRESS) parser.add_argument('--phase', action='append', help=argparse.SUPPRESS) parser.add_argument('-r', '--auto-reconnect', action='store_true', help=argparse.SUPPRESS) parser.add_argument('-t', '--target', help=argparse.SUPPRESS) args = parser.parse_args(raw_args) logging_common.InitializeLogging(args) script_common.InitializeEnvironment(args) try: return ProvisionDevices( args.devices, args.denylist_file, adb_key_files=args.adb_key_files, disable_location=args.disable_location, disable_mock_location=args.disable_mock_location, disable_network=args.disable_network, disable_system_chrome=args.disable_system_chrome, emulators=args.emulators, enable_java_debug=args.enable_java_debug, max_battery_temp=args.max_battery_temp, min_battery_level=args.min_battery_level, output_device_denylist=args.output_device_denylist, reboot_timeout=args.reboot_timeout, remove_system_webview=args.remove_system_webview, system_app_remove_list=args.system_app_remove_list, system_package_remove_list=args.system_package_remove_list, wipe=not args.skip_wipe and not args.emulators) except (device_errors.DeviceUnreachableError, device_errors.NoDevicesError): logging.exception('Unable to provision local devices.') return exit_codes.INFRA
def main(): parser = argparse.ArgumentParser(description=__doc__) parser.usage = '''%(prog)s --name FILENAME [--device SERIAL] [flags...] No flags: Prints existing command-line file. Empty string: Deletes command-line file. Otherwise: Writes command-line file. ''' parser.add_argument( '--name', required=True, help='Name of file where to store flags on the device.') parser.add_argument('-e', '--executable', dest='executable', default='chrome', help='(deprecated) No longer used.') script_common.AddEnvironmentArguments(parser) script_common.AddDeviceArguments(parser) logging_common.AddLoggingArguments(parser) args, remote_args = parser.parse_known_args() script_common.InitializeEnvironment(args) logging_common.InitializeLogging(args) devices = device_utils.DeviceUtils.HealthyDevices(device_arg=args.devices, default_retries=0) all_devices = device_utils.DeviceUtils.parallel(devices) if not remote_args: # No args == do not update, just print flags. remote_args = None action = '' elif len(remote_args) == 1 and not remote_args[0]: # Single empty string arg == delete flags remote_args = [] action = 'Deleted command line file. ' else: action = 'Wrote command line file. ' is_webview = args.name == 'webview-command-line' def update_flags(device): if device.IsUserBuild() and is_webview: raise device_errors.CommandFailedError( 'WebView only respects flags on a userdebug or eng device, yours ' 'is a user build.', device) elif device.IsUserBuild(): logging.warning( 'Your device (%s) is a user build; Chrome may or may not pick up ' 'your commandline flags. Check your ' '"command_line_on_non_rooted_enabled" preference, or switch ' 'devices.', device) changer = flag_changer.FlagChanger(device, args.name) if remote_args is not None: flags = changer.ReplaceFlags(remote_args) else: flags = changer.GetCurrentFlags() return (device, device.build_description, flags) updated_values = all_devices.pMap(update_flags).pGet(None) print '%sCurrent flags (in %s):' % (action, args.name) for d, desc, flags in updated_values: if flags: # Shell-quote flags for easy copy/paste as new args on the terminal. quoted_flags = ' '.join( cmd_helper.SingleQuote(f) for f in sorted(flags)) else: quoted_flags = '( empty )' print ' %s (%s): %s' % (d, desc, quoted_flags) return 0
def main(): devil_chromium.Initialize() parser = argparse.ArgumentParser(description=""" List Java classes in an APK which fail ART class verification. """) parser.add_argument('--package', '-P', type=str, default=None, required=True, help='Specify the full application package name') parser.add_argument( '--mapping', '-m', type=os.path.realpath, default=None, help='Mapping file for the desired APK to deobfuscate class names') parser.add_argument( '--hide-summary', default=False, action='store_true', help='Do not output the total number of classes in each Status.') parser.add_argument( '--status', type=str, default='RetryVerificationAtRuntime', choices=STATUSES, help='Which category of classes to list at the end of the script') parser.add_argument( '--workdir', '-w', type=os.path.realpath, default=None, help=( 'Work directory for oatdump output (default = temporary ' 'directory). If specified, this will not be cleaned up at the end ' 'of the script (useful if you want to inspect oatdump output ' 'manually)')) script_common.AddEnvironmentArguments(parser) script_common.AddDeviceArguments(parser) parser.add_argument('--verbose', '-v', default=False, action='store_true') parser.add_argument('--quiet', '-q', default=False, action='store_true') args = parser.parse_args() script_common.InitializeEnvironment(args) if args.verbose: logging.basicConfig(stream=sys.stderr, level=logging.INFO) elif args.quiet: logging.basicConfig(stream=sys.stderr, level=logging.ERROR) else: logging.basicConfig(stream=sys.stderr, level=logging.WARN) if args.workdir: if not os.path.isdir(args.workdir): raise RuntimeError('Specified working directory does not exist') RealMain(args.mapping, args.devices, args.package, args.status, args.hide_summary, args.workdir) # Assume the user wants the workdir to persist (useful for debugging). logging.warn('Not cleaning up explicitly-specified workdir: %s', args.workdir) else: with tempfile_ext.NamedTemporaryDirectory() as workdir: RealMain(args.mapping, args.devices, args.package, args.status, args.hide_summary, workdir)
def main(args): TEST_CASES.update({ p.product_name(): p for p in [ChromeFinchTestCase, WebViewFinchTestCase, WebLayerFinchTestCase] }) parser = argparse.ArgumentParser(prog='run_finch_smoke_tests_android.py') parser.add_argument( '--test-case', choices=TEST_CASES.keys(), # TODO(rmhasan): Remove default values after # adding arguments to test suites. Also make # this argument required. default='webview', help='Name of test case') parser.add_argument('--finch-seed-path', default=TEST_SEED_PATH, type=os.path.realpath, help='Path to the finch seed') parser.add_argument('--browser-apk', '--webview-shell-apk', '--weblayer-shell-apk', help='Path to the browser apk', type=os.path.realpath, required=True) parser.add_argument('--webview-provider-apk', type=os.path.realpath, help='Path to the WebView provider apk') parser.add_argument('--browser-activity-name', action='store', help='Browser activity name') parser.add_argument('--write-full-results-to', '--isolated-script-test-output', action='store', type=os.path.realpath, default=os.path.join(os.getcwd(), 'output.json'), help='Path to output directory') add_emulator_args(parser) script_common.AddDeviceArguments(parser) script_common.AddEnvironmentArguments(parser) logging_common.AddLoggingArguments(parser) options, _ = parser.parse_known_args(args) devil_chromium.Initialize(adb_path=options.adb_path) logging_common.InitializeLogging(options) with get_device(options) as device, \ TEST_CASES[options.test_case](device, options) as test_case, \ test_case.install_apks(): device.EnableRoot() log_mon = logcat_monitor.LogcatMonitor( device.adb, output_file=os.path.join( os.path.dirname(options.write_full_results_to), '%s_finch_smoke_tests_logcat.txt' % test_case.product_name()), filter_specs=_LOGCAT_FILTERS) log_mon.Start() device.RunShellCommand( ['pm', 'clear', get_package_name(options.browser_apk)], check_return=True) tests_pass = False with_seed_res = TestResult.Fail without_seed_res = TestResult.Fail if test_case.run_tests('without finch seed') != 0: test_case.install_seed() tests_pass = test_case.run_tests('with finch seed') without_seed_res = TestResult.Pass if tests_pass: with_seed_res = TestResult.Pass log_mon.Stop() json_results = get_json_results(with_seed_res, without_seed_res) with open(options.write_full_results_to, 'w') as json_out: json_out.write(json.dumps(json_results, indent=4)) # Return zero exit code if tests pass return not tests_pass