From 974d51cd2e34c6216c76d655044fff91e2122cc5 Mon Sep 17 00:00:00 2001 From: Michele Di Giorgio Date: Tue, 20 Sep 2016 13:02:21 +0100 Subject: [PATCH 1/4] libs/utils/android/workloads: update Jankbench to use android utils API Signed-off-by: Michele Di Giorgio --- libs/utils/android/workloads/jankbench.py | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/libs/utils/android/workloads/jankbench.py b/libs/utils/android/workloads/jankbench.py index b7044ed70..e545fbabe 100644 --- a/libs/utils/android/workloads/jankbench.py +++ b/libs/utils/android/workloads/jankbench.py @@ -80,13 +80,12 @@ class Jankbench(Workload): # Initialize energy meter results nrg_report = None - self.target.execute('input keyevent 82') - # Press Back button to be sure we run the video from the start - self.target.execute('input keyevent KEYCODE_BACK') + # Make sure we exit the app if already open + System.menu(self.target) + System.back(self.target) # Close and clear application - self.target.execute('am force-stop com.android.benchmark') - self.target.execute('pm clear com.android.benchmark') + System.force_stop(self.target, self.package, clear=True) # Set airplane mode System.set_airplane_mode(self.target, on=True) @@ -154,12 +153,10 @@ class Jankbench(Workload): db_file = os.path.join(exp_dir, JANKBENCH_DB_NAME) self.target.pull(JANKBENCH_DB_PATH + JANKBENCH_DB_NAME, db_file) - # Close and clear application - self.target.execute('am force-stop com.android.benchmark') - self.target.execute('pm clear com.android.benchmark') + System.force_stop(self.target, self.package, clear=True) # Go back to home screen - self.target.execute('input keyevent KEYCODE_HOME') + System.home(self.target) # Switch back to screen auto rotation Screen.set_orientation(self.target, auto=True) -- GitLab From 68dcf066f68a7610d9f3edd156528751b324f923 Mon Sep 17 00:00:00 2001 From: Michele Di Giorgio Date: Tue, 20 Sep 2016 15:03:08 +0100 Subject: [PATCH 2/4] libs/utils/android/workloads: update YouTube to use the android utils API Signed-off-by: Michele Di Giorgio --- libs/utils/android/workloads/youtube.py | 39 ++++++++++--------------- 1 file changed, 15 insertions(+), 24 deletions(-) diff --git a/libs/utils/android/workloads/youtube.py b/libs/utils/android/workloads/youtube.py index d9186a12a..895be644c 100644 --- a/libs/utils/android/workloads/youtube.py +++ b/libs/utils/android/workloads/youtube.py @@ -18,14 +18,11 @@ import re import os -from subprocess import Popen, PIPE -from android import Screen, Workload +from android import Screen, Workload, System from time import sleep import logging -YOUTUBE_CMD = 'shell dumpsys gfxinfo com.google.android.youtube > {}' - class YouTube(Workload): """ Android YouTube workload @@ -33,6 +30,7 @@ class YouTube(Workload): # Package required by this workload package = 'com.google.android.youtube' + action = 'android.intent.action.VIEW' # Setup logger logger = logging.getLogger('YouTube') @@ -41,7 +39,7 @@ class YouTube(Workload): def __init__(self, test_env): super(YouTube, self).__init__(test_env) - logging.debug('%14s - Workload created', 'YouTube') + self.logger.debug('%14s - Workload created', 'YouTube') def run(self, exp_dir, video_url, video_duration_s, collect=''): @@ -49,48 +47,41 @@ class YouTube(Workload): nrg_report = None # Unlock device screen (assume no password required) - self.target.execute('input keyevent 82') + System.menu(self.target) # Press Back button to be sure we run the video from the start - self.target.execute('input keyevent KEYCODE_BACK') + System.back(self.target) + # Force screen in LANDSCAPE mode Screen.set_orientation(self.target, portrait=False) + System.gfxinfo_reset(self.target, self.package) + sleep(1) + # Start YouTube video on the target device - youtube_cmd = 'am start -a android.intent.action.VIEW "{}"'\ - .format(video_url) - logging.info(youtube_cmd) - self.target.execute(youtube_cmd) + System.start_action(self.target, self.action, video_url) # Allow the activity to start - sleep(3) - - # Reset framestats collection - self.target.execute('dumpsys gfxinfo --reset') + sleep(1) # Start energy collection if 'energy' in collect and self.te.emeter: self.te.emeter.reset() # Wait until the end of the video - logging.info("Play video for %d [s]", video_duration_s) + self.logger.info("Play video for %d [s]", video_duration_s) sleep(video_duration_s) # Stop energy collection if 'energy' in collect and self.te.emeter: nrg_report = self.te.emeter.report(exp_dir) - logging.info("Estimated energy: %7.3f", - float(nrg_report.channels['BAT'])) # Get frame stats db_file = os.path.join(exp_dir, "framestats.txt") - self._adb(YOUTUBE_CMD.format(db_file)) + System.gfxinfo_get(self.target, self.package, db_file) - # Close and clear application - self.target.execute('am force-stop com.google.android.youtube') - self.target.execute('pm clear com.google.android.youtube') + System.force_stop(self.target, self.package, clear=True) - # Go back to home screen - self.target.execute('input keyevent KEYCODE_HOME') + System.home(self.target) # Switch back to screen auto rotation Screen.set_orientation(self.target, auto=True) -- GitLab From 011747f06909aede28df62fdb71e03c7e5e5fbe7 Mon Sep 17 00:00:00 2001 From: Michele Di Giorgio Date: Tue, 20 Sep 2016 14:24:36 +0100 Subject: [PATCH 3/4] libs/utils/android: add wrapper for adb monkey tool Signed-off-by: Michele Di Giorgio --- libs/utils/android/system.py | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/libs/utils/android/system.py b/libs/utils/android/system.py index 6c53796b3..77e58e12c 100644 --- a/libs/utils/android/system.py +++ b/libs/utils/android/system.py @@ -232,4 +232,30 @@ class System(object): adb_command(target.adb_name, GET_FRAMESTATS_CMD.format(apk_name, out_file)) + @staticmethod + def monkey(target, apk_name, event_count=1): + """ + Wrapper for adb monkey tool. + + The Monkey is a program that runs on your emulator or device and + generates pseudo-random streams of user events such as clicks, touches, + or gestures, as well as a number of system-level events. You can use + the Monkey to stress-test applications that you are developing, in a + random yet repeatable manner. + + Full documentation is available at: + + https://developer.android.com/studio/test/monkey.html + + :param target: instance of devlib Android target + :type target: devlib.target.AndroidTarget + + :param apk_name: name of the apk + :type apk_name: str + + :param event_count: number of events to generate + :type event_count: int + """ + target.execute('monkey -p {} {}'.format(apk_name, event_count)) + # vim :set tabstop=4 shiftwidth=4 expandtab -- GitLab From 99e876c2e7513eac0b571e50e7cb62ecc110d813 Mon Sep 17 00:00:00 2001 From: Michele Di Giorgio Date: Tue, 20 Sep 2016 15:03:58 +0100 Subject: [PATCH 4/4] libs/utils/android/workloads: use adb monkey to start YouTube without playing a video The Monkey tool allows to start an application and send it a number of random events. In our case, we use to just start YouTube without playing a video, so that we can then set the screen orientation to landscape and reset the frame statistics. Signed-off-by: Michele Di Giorgio --- libs/utils/android/workloads/youtube.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/libs/utils/android/workloads/youtube.py b/libs/utils/android/workloads/youtube.py index 895be644c..998f10cff 100644 --- a/libs/utils/android/workloads/youtube.py +++ b/libs/utils/android/workloads/youtube.py @@ -51,6 +51,10 @@ class YouTube(Workload): # Press Back button to be sure we run the video from the start System.back(self.target) + # Use the monkey tool to start YouTube without playing any video. + # This allows to subsequently set the screen orientation to LANDSCAPE + # and to reset the frame statistics. + System.monkey(self.target, self.package) # Force screen in LANDSCAPE mode Screen.set_orientation(self.target, portrait=False) -- GitLab