mirror of
https://github.com/ARM-software/workload-automation.git
synced 2025-01-18 12:06:08 +00:00
framework.workload: am instrument
APK manager
Add support for Android applications that are invoked through `am instrument` (as opposed to `am start`) _i.e._ that have been instrumented. See AOSP `/platform_testing/tests/` for examples of such applications.
This commit is contained in:
parent
42ab811032
commit
24ccc024f8
@ -1,4 +1,4 @@
|
||||
# Copyright 2014-2018 ARM Limited
|
||||
# Copyright 2014-2019 ARM Limited
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
@ -14,8 +14,14 @@
|
||||
#
|
||||
import logging
|
||||
import os
|
||||
import threading
|
||||
import time
|
||||
|
||||
try:
|
||||
from shlex import quote
|
||||
except ImportError:
|
||||
from pipes import quote
|
||||
|
||||
from devlib.utils.android import ApkInfo
|
||||
|
||||
from wa.framework.plugin import TargetedPlugin, Parameter
|
||||
@ -865,3 +871,62 @@ class PackageHandler(object):
|
||||
self.target.execute('am force-stop {}'.format(self.apk_info.package))
|
||||
if self.uninstall:
|
||||
self.target.uninstall_package(self.apk_info.package)
|
||||
|
||||
|
||||
class TestPackageHandler(PackageHandler):
|
||||
"""Class wrapping an APK used through ``am instrument``.
|
||||
"""
|
||||
def __init__(self, owner, instrument_args=None, raw_output=False,
|
||||
instrument_wait=True, no_hidden_api_checks=False,
|
||||
*args, **kwargs):
|
||||
if instrument_args is None:
|
||||
instrument_args = {}
|
||||
super(TestPackageHandler, self).__init__(owner, *args, **kwargs)
|
||||
self.raw = raw_output
|
||||
self.args = instrument_args
|
||||
self.wait = instrument_wait
|
||||
self.no_checks = no_hidden_api_checks
|
||||
|
||||
self.cmd = ''
|
||||
self.instrument_thread = None
|
||||
self._instrument_output = None
|
||||
|
||||
def setup(self, context):
|
||||
self.initialize_package(context)
|
||||
|
||||
words = ['am', 'instrument']
|
||||
if self.raw:
|
||||
words.append('-r')
|
||||
if self.wait:
|
||||
words.append('-w')
|
||||
if self.no_checks:
|
||||
words.append('--no-hidden-api-checks')
|
||||
for k, v in self.args.items():
|
||||
words.extend(['-e', str(k), str(v)])
|
||||
|
||||
words.append(str(self.apk_info.package))
|
||||
if self.apk_info.activity:
|
||||
words[-1] += '/{}'.format(self.apk_info.activity)
|
||||
|
||||
self.cmd = ' '.join(quote(x) for x in words)
|
||||
self.instrument_thread = threading.Thread(target=self._start_instrument)
|
||||
|
||||
def start_activity(self):
|
||||
self.instrument_thread.start()
|
||||
|
||||
def wait_instrument_over(self):
|
||||
self.instrument_thread.join()
|
||||
if 'Error:' in self._instrument_output:
|
||||
cmd = 'am force-stop {}'.format(self.apk_info.package)
|
||||
self.target.execute(cmd)
|
||||
raise WorkloadError(self._instrument_output)
|
||||
|
||||
def _start_instrument(self):
|
||||
self._instrument_output = self.target.execute(self.cmd)
|
||||
self.logger.debug(self._instrument_output)
|
||||
|
||||
@property
|
||||
def instrument_output(self):
|
||||
if self.instrument_thread.is_alive():
|
||||
self.instrument_thread.join() # writes self._instrument_output
|
||||
return self._instrument_output
|
||||
|
Loading…
Reference in New Issue
Block a user