76 lines
3.5 KiB
Python
76 lines
3.5 KiB
Python
# 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)
|