mirror of
				https://github.com/ARM-software/workload-automation.git
				synced 2025-10-31 07:04:17 +00:00 
			
		
		
		
	Add new applaunch workload.
The workload supports launch time measurement of other uxperf workloads that implement the ApplicationlaunchInterface. It takes a uxperf workload as a parameter and helps to instrument the application launch time in two modes. a)launch_from_background b)launch_from_long_idle The workload executes in two major phases. 1- Setup phase: clears initial dialogues on the first launch of an application. 2- Run phase: Runs multiple iterations of the application launch and measures the time taken for launch. Iteration number can be specified as parameter applaunch_iterations. Applaunch measurements are captured in the logcat file.
This commit is contained in:
		
							
								
								
									
										169
									
								
								wlauto/workloads/applaunch/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										169
									
								
								wlauto/workloads/applaunch/__init__.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,169 @@ | ||||
| #    Copyright 2015 ARM Limited | ||||
| # | ||||
| # Licensed under the Apache License, Version 2.0 (the 'License'); | ||||
| # you may not use this file except in compliance with the License. | ||||
| # You may obtain a copy of the License at | ||||
| # | ||||
| #     http://www.apache.org/licenses/LICENSE-2.0 | ||||
| # | ||||
| # Unless required by applicable law or agreed to in writing, software | ||||
| # distributed under the License is distributed on an 'AS IS' BASIS, | ||||
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
| # See the License for the specific language governing permissions and | ||||
| # limitations under the License. | ||||
| # | ||||
| # pylint: disable=attribute-defined-outside-init | ||||
| import os | ||||
|  | ||||
| from time import sleep | ||||
|  | ||||
| from wlauto import Workload, AndroidBenchmark, AndroidUxPerfWorkload, UiAutomatorWorkload | ||||
| from wlauto import Parameter | ||||
| from wlauto import ExtensionLoader | ||||
| from wlauto import File | ||||
| from wlauto import settings | ||||
| from wlauto.exceptions import ConfigError | ||||
| from wlauto.exceptions import ResourceError | ||||
| from wlauto.utils.android import ApkInfo | ||||
| from wlauto.utils.uxperf import UxPerfParser | ||||
|  | ||||
| import wlauto.common.android.resources | ||||
|  | ||||
|  | ||||
| class Applaunch(AndroidUxPerfWorkload): | ||||
|  | ||||
|     name = 'applaunch' | ||||
|     description = ''' | ||||
|     This workload launches and measures the launch time of applications for supporting workloads. | ||||
|      | ||||
|     Currently supported workloads are the ones that implement ``ApplaunchInterface``. For any | ||||
|     workload to support this workload, it should implement the ``ApplaunchInterface``. | ||||
|     The corresponding java file of the workload associated with the application being measured | ||||
|     is executed during the run. The application that needs to be | ||||
|     measured is passed as a parametre ``workload_name``. The parameters required for that workload | ||||
|     have to be passed as a dictionary which is captured by the parametre ``workload_params``. | ||||
|     This information can be obtained by inspecting the workload details of the specific workload. | ||||
|  | ||||
|     The workload allows to run multiple iterations of an application | ||||
|     launch in two modes: | ||||
|  | ||||
|     1. Launch from background | ||||
|     2. Launch from long-idle | ||||
|  | ||||
|     These modes are captured as a parameter applaunch_type. | ||||
|  | ||||
|     ``launch_from_background`` | ||||
|         Launches an application after the application is sent to background by | ||||
|         pressing Home button. | ||||
|  | ||||
|     ``launch_from_long-idle`` | ||||
|         Launches an application after killing an application process and | ||||
|         clearing all the caches. | ||||
|  | ||||
|     **Test Description:** | ||||
|  | ||||
|     -   During the initialization and setup, the application being launched is launched  | ||||
|         for the first time. The jar file of the workload of the application | ||||
|         is moved to device at the location ``workdir`` which further implements the methods | ||||
|         needed to measure the application launch time. | ||||
|  | ||||
|     -   Run phase calls the UiAutomator of the applaunch which runs in two subphases. | ||||
|             A.  Applaunch Setup Run: | ||||
|                     During this phase, welcome screens and dialogues during the first launch | ||||
|                     of the instrumented application are cleared. | ||||
|             B.  Applaunch Metric Run: | ||||
|                     During this phase, the application is launched multiple times determined by | ||||
|                     the iteration number specified by the parametre ``applaunch_iterations``. | ||||
|                     Each of these iterations are instrumented to capture the launch time taken | ||||
|                     and the values are recorded as UXPERF marker values in logfile. | ||||
|     ''' | ||||
|     supported_platforms = ['android'] | ||||
|  | ||||
|     parameters = [ | ||||
|         Parameter('workload_name', kind=str, | ||||
|                   description='Name of the uxperf workload to launch', | ||||
|                   default='gmail'), | ||||
|         Parameter('workload_params', kind=dict, default={}, | ||||
|                   description=""" | ||||
|                   parameters of the uxperf workload whose application launch | ||||
|                   time is measured | ||||
|                   """), | ||||
|         Parameter('applaunch_type', kind=str, default='launch_from_background', | ||||
|                   allowed_values=['launch_from_background', 'launch_from_long-idle'], | ||||
|                   description=""" | ||||
|                   Choose launch_from_long-idle for measuring launch time | ||||
|                   from long-idle. These two types are described in the class | ||||
|                   description. | ||||
|                   """), | ||||
|         Parameter('applaunch_iterations', kind=int, default=1, | ||||
|                   description=""" | ||||
|                   Number of iterations of the application launch | ||||
|                   """), | ||||
|         Parameter('report_results', kind=bool, default=True, | ||||
|                   description=""" | ||||
|                   Choose to report results of the application launch time. | ||||
|                   """), | ||||
|     ] | ||||
|  | ||||
|     def __init__(self, device, **kwargs): | ||||
|         super(Applaunch, self).__init__(device, **kwargs) | ||||
|  | ||||
|     def init_resources(self, context): | ||||
|         super(Applaunch, self).init_resources(context) | ||||
|         loader = ExtensionLoader(packages=settings.extension_packages, paths=settings.extension_paths) | ||||
|         self.workload_params['markers_enabled'] = True | ||||
|         self.workload = loader.get_workload(self.workload_name, self.device, | ||||
|                                             **self.workload_params) | ||||
|         self.init_workload_resources(context) | ||||
|  | ||||
|     def init_workload_resources(self, context): | ||||
|         self.workload.uiauto_file = context.resolver.get(wlauto.common.android.resources.JarFile(self.workload)) | ||||
|         if not self.workload.uiauto_file: | ||||
|             raise ResourceError('No UI automation JAR file found for workload {}.'.format(self.workload.name)) | ||||
|         self.workload.device_uiauto_file = self.device.path.join(self.device.working_directory, os.path.basename(self.workload.uiauto_file)) | ||||
|         if not self.workload.uiauto_package: | ||||
|             self.workload.uiauto_package = os.path.splitext(os.path.basename(self.workload.uiauto_file))[0] | ||||
|  | ||||
|     def validate(self): | ||||
|         super(Applaunch, self).validate() | ||||
|         self.workload.validate() | ||||
|         self.pass_parameters() | ||||
|  | ||||
|     def pass_parameters(self): | ||||
|         self.uiauto_params['workload'] = self.workload.name | ||||
|         self.uiauto_params['package'] = self.workload.package | ||||
|         self.uiauto_params['binaries_directory'] = self.device.binaries_directory | ||||
|         self.uiauto_params.update(self.workload.uiauto_params) | ||||
|         if self.workload.activity: | ||||
|             self.uiauto_params['launch_activity'] = self.workload.activity | ||||
|         else: | ||||
|             self.uiauto_params['launch_activity'] = "None" | ||||
|         self.uiauto_params['applaunch_type'] = self.applaunch_type | ||||
|         self.uiauto_params['applaunch_iterations'] = self.applaunch_iterations | ||||
|  | ||||
|     def setup(self, context): | ||||
|         AndroidBenchmark.setup(self.workload, context) | ||||
|         if not self.workload.launch_main: | ||||
|             self.workload.launch_app() | ||||
|         UiAutomatorWorkload.setup(self, context) | ||||
|         self.workload.device.push_file(self.workload.uiauto_file, self.workload.device_uiauto_file) | ||||
|  | ||||
|     def run(self, context): | ||||
|         UiAutomatorWorkload.run(self, context) | ||||
|  | ||||
|     def update_result(self, context): | ||||
|         super(Applaunch, self).update_result(context) | ||||
|         if self.report_results: | ||||
|             parser = UxPerfParser(context, prefix='applaunch_') | ||||
|             logfile = os.path.join(context.output_directory, 'logcat.log') | ||||
|             parser.parse(logfile) | ||||
|             parser.add_action_timings() | ||||
|  | ||||
|     def teardown(self, context): | ||||
|         super(Applaunch, self).teardown(context) | ||||
|         AndroidBenchmark.teardown(self.workload, context) | ||||
|         UiAutomatorWorkload.teardown(self.workload, context) | ||||
|         #Workload uses Dexclass loader while loading the jar file of the instrumented workload. | ||||
|         #Dexclassloader unzips and generates .dex file in the .jar directory during the run. | ||||
|         device_uiauto_dex_file = self.workload.device_uiauto_file.replace(".jar", ".dex") | ||||
|         self.workload.device.delete_file(self.device.path.join(self.device.binaries_directory, device_uiauto_dex_file)) | ||||
							
								
								
									
										
											BIN
										
									
								
								wlauto/workloads/applaunch/com.arm.wlauto.uiauto.applaunch.jar
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								wlauto/workloads/applaunch/com.arm.wlauto.uiauto.applaunch.jar
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										39
									
								
								wlauto/workloads/applaunch/uiauto/build.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										39
									
								
								wlauto/workloads/applaunch/uiauto/build.sh
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,39 @@ | ||||
| #!/bin/bash | ||||
|  | ||||
| # CD into build dir if possible - allows building from any directory | ||||
| script_path='.' | ||||
| if `readlink -f $0 &>/dev/null`; then | ||||
|     script_path=`readlink -f $0 2>/dev/null` | ||||
| fi | ||||
| script_dir=`dirname $script_path` | ||||
| cd $script_dir | ||||
|  | ||||
| # Ensure build.xml exists before starting | ||||
| if [[ ! -f build.xml ]]; then | ||||
|     echo 'Ant build.xml file not found! Check that you are in the right directory.' | ||||
|     exit 9 | ||||
| fi | ||||
|  | ||||
| # Copy base classes from wlauto dist | ||||
| class_dir=bin/classes/com/arm/wlauto/uiauto | ||||
| base_classes=`python -c "import os, wlauto; print os.path.join(os.path.dirname(wlauto.__file__), 'common', 'android', '*.class')"` | ||||
| mkdir -p $class_dir | ||||
| cp $base_classes $class_dir | ||||
|  | ||||
| # Build and return appropriate exit code if failed | ||||
| ant build | ||||
| exit_code=$? | ||||
| if [[ $exit_code -ne 0 ]]; then | ||||
|     echo "ERROR: 'ant build' exited with code $exit_code" | ||||
|     exit $exit_code | ||||
| fi | ||||
|  | ||||
| # If successful move JAR file to workload folder (overwrite previous) | ||||
| package=com.arm.wlauto.uiauto.applaunch.jar | ||||
| rm -f ../$package | ||||
| if [[ -f bin/$package ]]; then | ||||
|     cp bin/$package .. | ||||
| else | ||||
|     echo 'ERROR: UiAutomator JAR could not be found!' | ||||
|     exit 9 | ||||
| fi | ||||
							
								
								
									
										92
									
								
								wlauto/workloads/applaunch/uiauto/build.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										92
									
								
								wlauto/workloads/applaunch/uiauto/build.xml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,92 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <project name="com.arm.wlauto.uiauto.applaunch" default="help"> | ||||
|  | ||||
|     <!-- The local.properties file is created and updated by the 'android' tool. | ||||
|          It contains the path to the SDK. It should *NOT* be checked into | ||||
|          Version Control Systems. --> | ||||
|     <property file="local.properties" /> | ||||
|  | ||||
|     <!-- The ant.properties file can be created by you. It is only edited by the | ||||
|          'android' tool to add properties to it. | ||||
|          This is the place to change some Ant specific build properties. | ||||
|          Here are some properties you may want to change/update: | ||||
|  | ||||
|          source.dir | ||||
|              The name of the source directory. Default is 'src'. | ||||
|          out.dir | ||||
|              The name of the output directory. Default is 'bin'. | ||||
|  | ||||
|          For other overridable properties, look at the beginning of the rules | ||||
|          files in the SDK, at tools/ant/build.xml | ||||
|  | ||||
|          Properties related to the SDK location or the project target should | ||||
|          be updated using the 'android' tool with the 'update' action. | ||||
|  | ||||
|          This file is an integral part of the build system for your | ||||
|          application and should be checked into Version Control Systems. | ||||
|  | ||||
|          --> | ||||
|     <property file="ant.properties" /> | ||||
|  | ||||
|     <!-- if sdk.dir was not set from one of the property file, then | ||||
|          get it from the ANDROID_HOME env var. | ||||
|          This must be done before we load project.properties since | ||||
|          the proguard config can use sdk.dir --> | ||||
|     <property environment="env" /> | ||||
|     <condition property="sdk.dir" value="${env.ANDROID_HOME}"> | ||||
|         <isset property="env.ANDROID_HOME" /> | ||||
|     </condition> | ||||
|  | ||||
|     <!-- The project.properties file is created and updated by the 'android' | ||||
|          tool, as well as ADT. | ||||
|  | ||||
|          This contains project specific properties such as project target, and library | ||||
|          dependencies. Lower level build properties are stored in ant.properties | ||||
|          (or in .classpath for Eclipse projects). | ||||
|  | ||||
|          This file is an integral part of the build system for your | ||||
|          application and should be checked into Version Control Systems. --> | ||||
|     <loadproperties srcFile="project.properties" /> | ||||
|  | ||||
|     <!-- quick check on sdk.dir --> | ||||
|     <fail | ||||
|             message="sdk.dir is missing. Make sure to generate local.properties using 'android update project' or to inject it through the ANDROID_HOME environment variable." | ||||
|             unless="sdk.dir" | ||||
|     /> | ||||
|  | ||||
|     <!-- | ||||
|         Import per project custom build rules if present at the root of the project. | ||||
|         This is the place to put custom intermediary targets such as: | ||||
|             -pre-build | ||||
|             -pre-compile | ||||
|             -post-compile (This is typically used for code obfuscation. | ||||
|                            Compiled code location: ${out.classes.absolute.dir} | ||||
|                            If this is not done in place, override ${out.dex.input.absolute.dir}) | ||||
|             -post-package | ||||
|             -post-build | ||||
|             -pre-clean | ||||
|     --> | ||||
|     <import file="custom_rules.xml" optional="true" /> | ||||
|  | ||||
|     <!-- Import the actual build file. | ||||
|  | ||||
|          To customize existing targets, there are two options: | ||||
|          - Customize only one target: | ||||
|              - copy/paste the target into this file, *before* the | ||||
|                <import> task. | ||||
|              - customize it to your needs. | ||||
|          - Customize the whole content of build.xml | ||||
|              - copy/paste the content of the rules files (minus the top node) | ||||
|                into this file, replacing the <import> task. | ||||
|              - customize to your needs. | ||||
|  | ||||
|          *********************** | ||||
|          ****** IMPORTANT ****** | ||||
|          *********************** | ||||
|          In all cases you must update the value of version-tag below to read 'custom' instead of an integer, | ||||
|          in order to avoid having your file be overridden by tools such as "android update project" | ||||
|     --> | ||||
|     <!-- version-tag: VERSION_TAG --> | ||||
|     <import file="${sdk.dir}/tools/ant/uibuild.xml" /> | ||||
|  | ||||
| </project> | ||||
							
								
								
									
										14
									
								
								wlauto/workloads/applaunch/uiauto/project.properties
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								wlauto/workloads/applaunch/uiauto/project.properties
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,14 @@ | ||||
| # This file is automatically generated by Android Tools. | ||||
| # Do not modify this file -- YOUR CHANGES WILL BE ERASED! | ||||
| # | ||||
| # This file must be checked in Version Control Systems. | ||||
| # | ||||
| # To customize properties used by the Ant build system edit | ||||
| # "ant.properties", and override values to adapt the script to your | ||||
| # project structure. | ||||
| # | ||||
| # To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home): | ||||
| #proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt | ||||
|  | ||||
| # Project target. | ||||
| target=android-18 | ||||
							
								
								
									
										220
									
								
								wlauto/workloads/applaunch/uiauto/src/com/arm/wlauto/uiauto/UiAutomation.java
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										220
									
								
								wlauto/workloads/applaunch/uiauto/src/com/arm/wlauto/uiauto/UiAutomation.java
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,220 @@ | ||||
| /*    Copyright 2014-2016 ARM Limited | ||||
|  * | ||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|  * you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  * | ||||
|  *     http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, | ||||
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|  * See the License for the specific language governing permissions and | ||||
|  * limitations under the License. | ||||
|  */ | ||||
|  | ||||
| package com.arm.wlauto.uiauto.applaunch; | ||||
|  | ||||
| import android.os.Bundle; | ||||
| import android.util.Log; | ||||
|  | ||||
| // Import the uiautomator libraries | ||||
| import com.android.uiautomator.core.UiObject; | ||||
| import com.android.uiautomator.core.UiObjectNotFoundException; | ||||
| import com.android.uiautomator.core.UiSelector; | ||||
|  | ||||
| import com.arm.wlauto.uiauto.ApplaunchInterface; | ||||
| import com.arm.wlauto.uiauto.UxPerfUiAutomation; | ||||
|  | ||||
| import static com.arm.wlauto.uiauto.BaseUiAutomation.FindByCriteria.BY_ID; | ||||
| import static com.arm.wlauto.uiauto.BaseUiAutomation.FindByCriteria.BY_TEXT; | ||||
| import static com.arm.wlauto.uiauto.BaseUiAutomation.FindByCriteria.BY_DESC; | ||||
|  | ||||
| import java.util.concurrent.TimeUnit; | ||||
| import java.util.Iterator; | ||||
| import java.util.LinkedHashMap; | ||||
| import java.util.Map; | ||||
| import java.io.File; | ||||
| import java.io.FileNotFoundException; | ||||
| import java.util.Map.Entry; | ||||
| import dalvik.system.DexClassLoader; | ||||
| import java.lang.reflect.Method; | ||||
|  | ||||
|  | ||||
| public class UiAutomation extends UxPerfUiAutomation { | ||||
|  | ||||
|     /**  | ||||
|      * Uiobject that marks the end of launch of an application, which is workload | ||||
|      * specific and added in the workload Java file by a method called getLaunchEndObject(). | ||||
|      */ | ||||
|     public UiObject launchEndObject; | ||||
|     /** Timeout to wait for application launch to finish. */ | ||||
|     private Integer launch_timeout = 10; | ||||
|     public String applaunchType; | ||||
|     public String applaunchIterations; | ||||
|     public String activityName; | ||||
|     public ApplaunchInterface launch_workload; | ||||
|  | ||||
|     /** Uiautomator function called by the applaunch workload. */ | ||||
|     public void runUiAutomation() throws Exception{ | ||||
|         parameters = getParams(); | ||||
|  | ||||
|         // Get workload jar file parameters | ||||
|         String workload = parameters.getString("workload"); | ||||
|         String binariesDirectory = parameters.getString("binaries_directory"); | ||||
|         String workloadJarPath = parameters.getString("workdir"); | ||||
|         String workloadJarName = String.format("com.arm.wlauto.uiauto.%1s.jar",workload); | ||||
|         String workloadJarFile = String.format("%1s/%2s",workloadJarPath, workloadJarName); | ||||
|  | ||||
|         // Load the jar file | ||||
|         File jarFile = new File(workloadJarFile); | ||||
|         if(!jarFile.exists()) { | ||||
|             throw new Exception(String.format("Jar file not found: %s", workloadJarFile)); | ||||
|         } | ||||
|         DexClassLoader classloader = new DexClassLoader(jarFile.toURI().toURL().toString(), | ||||
|                                      binariesDirectory, null, ClassLoader.getSystemClassLoader()); | ||||
|         Class uiautomation = null; | ||||
|         Object uiautomation_interface = null; | ||||
|         String workloadClass = String.format("com.arm.wlauto.uiauto.%1s.UiAutomation",workload); | ||||
|         try { | ||||
|             uiautomation = classloader.loadClass(workloadClass); | ||||
|         } catch (ClassNotFoundException e) { | ||||
|             e.printStackTrace(); | ||||
|         } | ||||
|         Log.d("Class loaded:", uiautomation.getCanonicalName()); | ||||
|         uiautomation_interface = uiautomation.newInstance(); | ||||
|  | ||||
|         // Create an Application Interface object from the workload | ||||
|         launch_workload = ((ApplaunchInterface)uiautomation_interface); | ||||
|  | ||||
|         // Get parameters for application launch | ||||
|         getPackageParameters(); | ||||
|         applaunchType = parameters.getString("applaunch_type"); | ||||
|         applaunchIterations = parameters.getString("applaunch_iterations"); | ||||
|         activityName = parameters.getString("launch_activity"); | ||||
|  | ||||
|         // Run the workload for application launch initialization | ||||
|         runApplaunchSetup(); | ||||
|  | ||||
|         // Run the workload for application launch measurement | ||||
|         for (int iteration = 0; iteration < Integer.parseInt(applaunchIterations); iteration++) { | ||||
|             Log.d("Applaunch iteration number: ", applaunchIterations); | ||||
|             sleep(20);//sleep for a while before next iteration | ||||
|             killBackground(); | ||||
|             runApplaunchIteration(iteration); | ||||
|             closeApplication(); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Setup run for applaunch workload that clears the initial | ||||
|      * run dialogues on launching an application package. | ||||
|      */ | ||||
|     public void runApplaunchSetup() throws Exception{ | ||||
|         setScreenOrientation(ScreenOrientation.NATURAL); | ||||
|         launch_workload.setWorkloadParameters(parameters); | ||||
|         launch_workload.runApplicationInitialization(); | ||||
|         launchEndObject = launch_workload.getLaunchEndObject(); | ||||
|         unsetScreenOrientation(); | ||||
|         closeApplication(); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * This method performs multiple iterations of application launch and | ||||
|      * records the time taken for each iteration. | ||||
|      */ | ||||
|     public void runApplaunchIteration(Integer iteration_count) throws Exception{ | ||||
|         String testTag = "applaunch" + iteration_count; | ||||
|         String launchCommand = launch_workload.getLaunchCommand(); | ||||
|         AppLaunch applaunch = new AppLaunch(testTag, launchCommand); | ||||
|         applaunch.startLaunch();//Launch the application and start timer | ||||
|         applaunch.endLaunch();//marks the end of launch and stops timer | ||||
|     } | ||||
|  | ||||
|     /* | ||||
|      * AppLaunch class implements methods that facilitates launching applications | ||||
|      * from the uiautomator. It has methods that are used for one complete iteration of application | ||||
|      * launch instrumentation. | ||||
|      * ActionLogger class is instantiated within the class for measuring applaunch time. | ||||
|      * startLaunch(): Marks the beginning of the application launch, starts Timer | ||||
|      * endLaunch(): Marks the end of application, ends Timer | ||||
|      * launchMain(): Starts the application launch process and validates the finish of launch. | ||||
|     */ | ||||
|     private class AppLaunch { | ||||
|  | ||||
|         private String testTag; | ||||
|         private String launchCommand; | ||||
|         private ActionLogger logger; | ||||
|         Process launch_p; | ||||
|  | ||||
|         public AppLaunch(String testTag, String launchCommand) { | ||||
|             this.testTag = testTag; | ||||
|             this.launchCommand = launchCommand; | ||||
|             this.logger = new ActionLogger(testTag, parameters); | ||||
|         } | ||||
|  | ||||
|         // Called by launchMain() to check if app launch is successful | ||||
|         public void launchValidate(Process launch_p) throws Exception { | ||||
|             launch_p.waitFor(); | ||||
|             Integer exit_val = launch_p.exitValue(); | ||||
|             if (exit_val != 0) { | ||||
|                 throw new Exception("Application could not be launched"); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         // Marks the end of application launch of the workload. | ||||
|         public void endLaunch() throws Exception{ | ||||
|             waitObject(launchEndObject, launch_timeout); | ||||
|             logger.stop(); | ||||
|             launch_p.destroy(); | ||||
|         } | ||||
|  | ||||
|         // Launches the application. | ||||
|         public void launchMain() throws Exception{ | ||||
|             launch_p = Runtime.getRuntime().exec(launchCommand); | ||||
|  | ||||
|             launchValidate(launch_p); | ||||
|         } | ||||
|  | ||||
|         // Beginning of application launch | ||||
|         public void startLaunch() throws Exception{ | ||||
|             logger.start(); | ||||
|             launchMain(); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     // Exits the application according to application launch type. | ||||
|     public void closeApplication() throws Exception{ | ||||
|         if(applaunchType.equals("launch_from_background")) { | ||||
|             pressHome(); | ||||
|         } | ||||
|         else if(applaunchType.equals("launch_from_long-idle")) { | ||||
|             killApplication(); | ||||
|             dropCaches(); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     // Kills the application process | ||||
|     public void killApplication() throws Exception{ | ||||
|         Process kill_p; | ||||
|         kill_p = Runtime.getRuntime().exec(String.format("am force-stop %s", packageName)); | ||||
|         kill_p.waitFor(); | ||||
|         kill_p.destroy(); | ||||
|     } | ||||
|  | ||||
|     // Kills the background processes | ||||
|     public void killBackground() throws Exception{ | ||||
|         Process kill_p; | ||||
|         kill_p = Runtime.getRuntime().exec("am kill-all"); | ||||
|         kill_p.waitFor(); | ||||
|         kill_p.destroy(); | ||||
|     } | ||||
|  | ||||
|     // Drop the caches | ||||
|     public void dropCaches() throws Exception{ | ||||
|         Process drop_cache; | ||||
|         drop_cache = Runtime.getRuntime().exec("su sync; su echo 3 > /proc/sys/vm/drop_caches"); | ||||
|         drop_cache.waitFor(); | ||||
|         drop_cache.destroy(); | ||||
|     } | ||||
| } | ||||
		Reference in New Issue
	
	Block a user