# Copyright 2016 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. """Utility functions for interacting with devices supporting adb commands. The functions only work with an Autotest instance setup, e.g., in a lab. """ import os import logging import common from autotest_lib.client.common_lib import error from autotest_lib.client.common_lib.cros import dev_server def install_apk_from_build(host, apk, build_artifact, package_name=None, force_reinstall=False, build_name=None): """Install the specific apk from given build artifact. @param host: An ADBHost object to install apk. @param apk: Name of the apk to install, e.g., sl4a.apk @param build_artifact: Name of the build artifact, e.g., test_zip. Note that it's not the name of the artifact file. Refer to artifact_info.py in devserver code for the mapping between artifact name to a build artifact. @param package_name: Name of the package, e.g., com.android.phone. If package_name is given, it checks if the package exists before trying to install it, unless force_reinstall is set to True. @param force_reinstall: True to reinstall the apk even if it's already installed. Default is set to False. @param build_name: None unless DUT is CrOS with ARC++ container. build_name points to ARC++ build artifacts. """ # Check if apk is already installed. if package_name and not force_reinstall: if host.is_apk_installed(package_name): logging.info('Package %s is already installed.', package_name) return if build_name: # Pull devserver_url given ARC++ enabled host host_devserver_url = dev_server.AndroidBuildServer.resolve(build_name, host.hostname).url() # Return devserver_url given Android build path job_repo_url = os.path.join(host_devserver_url, build_name) else: info = host.host_info_store.get() job_repo_url = info.attributes.get(host.job_repo_url_attribute, '') if not job_repo_url: raise error.AutoservError( 'The host %s has no attribute %s. `install_apk_from_build` ' 'only works for test with image specified.' % (host.hostname, host.job_repo_url_attribute)) devserver_url = dev_server.AndroidBuildServer.get_server_url(job_repo_url) devserver = dev_server.AndroidBuildServer(devserver_url) build_info = host.get_build_info_from_build_url(job_repo_url) devserver.trigger_download(build_info['target'], build_info['build_id'], build_info['branch'], build_artifact, synchronous=True) build_info['os_type'] = 'android' apk_url = devserver.locate_file(apk, build_artifact, None, build_info) logging.debug('Found apk at: %s', apk_url) tmp_dir = host.teststation.get_tmp_dir() try: host.download_file(apk_url, apk, tmp_dir) result = host.install_apk(os.path.join(tmp_dir, apk), force_reinstall=force_reinstall) logging.debug(result.stdout) if package_name and not host.is_apk_installed(package_name): raise error.AutoservError('No package found with name of %s', package_name) logging.info('%s is installed successfully.', apk) finally: host.teststation.run('rm -rf %s' % tmp_dir)