mirror of
				https://github.com/ARM-software/workload-automation.git
				synced 2025-10-31 15:12:25 +00:00 
			
		
		
		
	Merge pull request #282 from jimboatarm/min-apk-version-fix
Support for Geekbench 4
This commit is contained in:
		| @@ -199,6 +199,7 @@ class ApkWorkload(Workload): | |||||||
|         self.apk_file = None |         self.apk_file = None | ||||||
|         self.apk_version = None |         self.apk_version = None | ||||||
|         self.logcat_log = None |         self.logcat_log = None | ||||||
|  |         self.exact_apk_version = None | ||||||
|  |  | ||||||
|     def setup(self, context): |     def setup(self, context): | ||||||
|         Workload.setup(self, context) |         Workload.setup(self, context) | ||||||
| @@ -227,6 +228,11 @@ class ApkWorkload(Workload): | |||||||
|             msg = "Could not find APK for '{}' on the host or target device" |             msg = "Could not find APK for '{}' on the host or target device" | ||||||
|             raise ResourceError(msg.format(self.name)) |             raise ResourceError(msg.format(self.name)) | ||||||
|  |  | ||||||
|  |         if self.exact_apk_version is not None: | ||||||
|  |             if self.exact_apk_version != target_version and self.version != host_version: | ||||||
|  |                 msg = "APK version '{}' not found on the host '{}' or target '{}'" | ||||||
|  |                 raise ResourceError(msg.format(self.version, host_version, target_version)) | ||||||
|  |  | ||||||
|         # Ensure the apk is setup on the device |         # Ensure the apk is setup on the device | ||||||
|         if self.force_install: |         if self.force_install: | ||||||
|             self.force_install_apk(context, host_version) |             self.force_install_apk(context, host_version) | ||||||
|   | |||||||
| @@ -59,6 +59,15 @@ class Geekbench(AndroidUiAutoBenchmark): | |||||||
|     """ |     """ | ||||||
|     summary_metrics = ['score', 'multicore_score'] |     summary_metrics = ['score', 'multicore_score'] | ||||||
|     versions = { |     versions = { | ||||||
|  |         '4.0.1': { | ||||||
|  |             'package': 'com.primatelabs.geekbench', | ||||||
|  |             'activity': '.HomeActivity', | ||||||
|  |         }, | ||||||
|  |         # Version 3.4.1 was the final version 3 variant | ||||||
|  |         '3.4.1': { | ||||||
|  |             'package': 'com.primatelabs.geekbench', | ||||||
|  |             'activity': '.HomeActivity', | ||||||
|  |         }, | ||||||
|         '3': { |         '3': { | ||||||
|             'package': 'com.primatelabs.geekbench3', |             'package': 'com.primatelabs.geekbench3', | ||||||
|             'activity': '.HomeActivity', |             'activity': '.HomeActivity', | ||||||
| @@ -92,23 +101,13 @@ class Geekbench(AndroidUiAutoBenchmark): | |||||||
|         super(Geekbench, self).__init__(device, **kwargs) |         super(Geekbench, self).__init__(device, **kwargs) | ||||||
|         self.uiauto_params['version'] = self.version |         self.uiauto_params['version'] = self.version | ||||||
|         self.uiauto_params['times'] = self.times |         self.uiauto_params['times'] = self.times | ||||||
|         self.run_timeout = 5 * 60 * self.times |         self.run_timeout = 10 * 60 * self.times | ||||||
|  |         self.exact_apk_version = self.version | ||||||
|     def initialize(self, context): |  | ||||||
|         if self.version == '3' and not self.device.is_rooted: |  | ||||||
|             raise WorkloadError('Geekbench workload only works on rooted devices.') |  | ||||||
|  |  | ||||||
|     def init_resources(self, context): |  | ||||||
|         self.apk_file = context.resolver.get(wlauto.common.android.resources.ApkFile(self), version=self.version) |  | ||||||
|         self.uiauto_file = context.resolver.get(wlauto.common.android.resources.JarFile(self)) |  | ||||||
|         self.device_uiauto_file = self.device.path.join(self.device.working_directory, |  | ||||||
|                                                         os.path.basename(self.uiauto_file)) |  | ||||||
|         if not self.uiauto_package: |  | ||||||
|             self.uiauto_package = os.path.splitext(os.path.basename(self.uiauto_file))[0] |  | ||||||
|  |  | ||||||
|     def update_result(self, context): |     def update_result(self, context): | ||||||
|         super(Geekbench, self).update_result(context) |         super(Geekbench, self).update_result(context) | ||||||
|         update_method = getattr(self, 'update_result_{}'.format(self.version)) |         major_version = versiontuple(self.version)[0] | ||||||
|  |         update_method = getattr(self, 'update_result_{}'.format(major_version)) | ||||||
|         update_method(context) |         update_method(context) | ||||||
|  |  | ||||||
|     def validate(self): |     def validate(self): | ||||||
| @@ -143,6 +142,30 @@ class Geekbench(AndroidUiAutoBenchmark): | |||||||
|                 context.result.add_metric(namemify(section['name'] + '_multicore_score', i), |                 context.result.add_metric(namemify(section['name'] + '_multicore_score', i), | ||||||
|                                           section['multicore_score']) |                                           section['multicore_score']) | ||||||
|  |  | ||||||
|  |     def update_result_4(self, context): | ||||||
|  |         outfile_glob = self.device.path.join(self.device.package_data_directory, self.package, 'files', '*gb4') | ||||||
|  |         on_device_output_files = [f.strip() for f in self.device.execute('ls {}'.format(outfile_glob), | ||||||
|  |                                                                          as_root=True).split('\n') if f] | ||||||
|  |         for i, on_device_output_file in enumerate(on_device_output_files): | ||||||
|  |             host_temp_file = tempfile.mktemp() | ||||||
|  |             self.device.pull_file(on_device_output_file, host_temp_file) | ||||||
|  |             host_output_file = os.path.join(context.output_directory, os.path.basename(on_device_output_file)) | ||||||
|  |             with open(host_temp_file) as fh: | ||||||
|  |                 data = json.load(fh) | ||||||
|  |             os.remove(host_temp_file) | ||||||
|  |             with open(host_output_file, 'w') as wfh: | ||||||
|  |                 json.dump(data, wfh, indent=4) | ||||||
|  |             context.iteration_artifacts.append(Artifact('geekout', path=os.path.basename(on_device_output_file), | ||||||
|  |                                                         kind='data', | ||||||
|  |                                                         description='Geekbench 4 output from device.')) | ||||||
|  |             context.result.add_metric(namemify('score', i), data['score']) | ||||||
|  |             context.result.add_metric(namemify('multicore_score', i), data['multicore_score']) | ||||||
|  |             for section in data['sections']: | ||||||
|  |                 context.result.add_metric(namemify(section['name'] + '_score', i), section['score']) | ||||||
|  |                 for workloads in section['workloads']: | ||||||
|  |                     workload_name = workloads['name'].replace(" ", "-") | ||||||
|  |                     context.result.add_metric(namemify(section['name'] + '_' + workload_name + '_score', i), | ||||||
|  |                                           workloads['score']) | ||||||
|  |  | ||||||
| class GBWorkload(object): | class GBWorkload(object): | ||||||
|     """ |     """ | ||||||
| @@ -353,3 +376,6 @@ class GBScoreCalculator(object): | |||||||
|  |  | ||||||
| def namemify(basename, i): | def namemify(basename, i): | ||||||
|     return basename + (' {}'.format(i) if i else '') |     return basename + (' {}'.format(i) if i else '') | ||||||
|  |  | ||||||
|  | def versiontuple(v): | ||||||
|  |     return tuple(map(int, (v.split(".")))) | ||||||
|   | |||||||
										
											Binary file not shown.
										
									
								
							| @@ -17,9 +17,9 @@ | |||||||
|  |  | ||||||
|  |  | ||||||
| class_dir=bin/classes/com/arm/wlauto/uiauto | class_dir=bin/classes/com/arm/wlauto/uiauto | ||||||
| base_class=`python -c "import os, wlauto; print os.path.join(os.path.dirname(wlauto.__file__), 'common', 'android', 'BaseUiAutomation.class')"` | base_classes=`python -c "import os, wlauto; print os.path.join(os.path.dirname(wlauto.__file__), 'common', 'android', '*.class')"` | ||||||
| mkdir -p $class_dir | mkdir -p $class_dir | ||||||
| cp $base_class $class_dir | cp $base_classes $class_dir | ||||||
|  |  | ||||||
| ant build | ant build | ||||||
|  |  | ||||||
|   | |||||||
| @@ -16,8 +16,6 @@ | |||||||
|  |  | ||||||
| package com.arm.wlauto.uiauto.geekbench; | package com.arm.wlauto.uiauto.geekbench; | ||||||
|  |  | ||||||
| import java.util.concurrent.TimeUnit; |  | ||||||
|  |  | ||||||
| import android.app.Activity; | import android.app.Activity; | ||||||
| import android.os.Bundle; | import android.os.Bundle; | ||||||
| import android.util.Log; | import android.util.Log; | ||||||
| @@ -30,52 +28,96 @@ import com.android.uiautomator.core.UiScrollable; | |||||||
| import com.android.uiautomator.core.UiSelector; | import com.android.uiautomator.core.UiSelector; | ||||||
| import com.android.uiautomator.testrunner.UiAutomatorTestCase; | import com.android.uiautomator.testrunner.UiAutomatorTestCase; | ||||||
|  |  | ||||||
| import com.arm.wlauto.uiauto.BaseUiAutomation; | import com.arm.wlauto.uiauto.UxPerfUiAutomation; | ||||||
|  |  | ||||||
| public class UiAutomation extends BaseUiAutomation {    | import java.util.concurrent.TimeUnit; | ||||||
|  |  | ||||||
|  | public class UiAutomation extends UxPerfUiAutomation { | ||||||
|  |  | ||||||
|     public static String TAG = "geekbench"; |     public static String TAG = "geekbench"; | ||||||
|  |     public static final int WAIT_TIMEOUT_1SEC = 1000; | ||||||
|  |     public static final long WAIT_TIMEOUT_5MIN = TimeUnit.SECONDS.toMillis(5 * 60); | ||||||
|  |     public static final long WAIT_TIMEOUT_10MIN = TimeUnit.SECONDS.toMillis(10 * 60); | ||||||
|  |  | ||||||
|     public void runUiAutomation() throws Exception { |     public void runUiAutomation() throws Exception { | ||||||
|         Bundle params = getParams(); |         Bundle params = getParams(); | ||||||
|         int version = Integer.parseInt(params.getString("version")); |         String[] version = params.getString("version").split("\\."); | ||||||
|  |         int majorVersion = Integer.parseInt(version[0]); | ||||||
|  |         int minorVersion = Integer.parseInt(version[1]); | ||||||
|         int times = Integer.parseInt(params.getString("times")); |         int times = Integer.parseInt(params.getString("times")); | ||||||
|  |  | ||||||
|  |         dismissEula(); | ||||||
|  |  | ||||||
|         for (int i = 0; i < times; i++) { |         for (int i = 0; i < times; i++) { | ||||||
|                 runBenchmarks(); |             switch (majorVersion) { | ||||||
|                 switch(version) { |                 case 2: | ||||||
|                 case 2:  |                     // In version 2, we scroll through the results WebView to make sure | ||||||
|                         // In version 2, we scroll through the results WebView to make sure |                     // all results appear on the screen, which causes them to be dumped into | ||||||
|                         // all results appear on the screen, which causes them to be dumped into |                     // logcat by the Linaro hacks. | ||||||
|                         // logcat by the Linaro hacks. |                     runBenchmarks(); | ||||||
|                         waitForResultsv2(); |                     waitForResultsv2(); | ||||||
|                         scrollThroughResults(); |                     scrollThroughResults(); | ||||||
|                         break; |                     break; | ||||||
|                 case 3:  |                 case 3: | ||||||
|  |                     runBenchmarks(); | ||||||
|  |                     waitForResultsv3onwards(); | ||||||
|  |                     if (minorVersion < 4) { | ||||||
|                         // Attempting to share the results will generate the .gb3 file with |                         // Attempting to share the results will generate the .gb3 file with | ||||||
|                         // results that can then be pulled from the device. This is not possible |                         // results that can then be pulled from the device. This is not possible | ||||||
|                         // in verison 2 of Geekbench (Share option was added later). |                         // in verison 2 of Geekbench (Share option was added later). | ||||||
|                         waitForResultsv3(); |                         // Sharing is not necessary from 3.4.1 onwards as the .gb3 files are always | ||||||
|  |                         // created. | ||||||
|                         shareResults(); |                         shareResults(); | ||||||
|                         break; |                     } | ||||||
|                 } |                     break; | ||||||
|  |                 case 4: | ||||||
|  |                     runCpuBenchmarks(); | ||||||
|  |                     waitForResultsv3onwards(); | ||||||
|  |                     break; | ||||||
|  |                 default : | ||||||
|  |                     throw new RuntimeException("Invalid version of Geekbench requested"); | ||||||
|  |             } | ||||||
|  |  | ||||||
|                 if (i < (times - 1)) { |             if (i < (times - 1)) { | ||||||
|                         getUiDevice().pressBack(); |                 getUiDevice().pressBack(); | ||||||
|                         getUiDevice().pressBack();  // twice |                 getUiDevice().pressBack();  // twice | ||||||
|                 } |             } | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         Bundle status = new Bundle(); |         Bundle status = new Bundle(); | ||||||
|         getAutomationSupport().sendStatus(Activity.RESULT_OK, status); |         getAutomationSupport().sendStatus(Activity.RESULT_OK, status); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     public void dismissEula() throws Exception { | ||||||
|  |         UiObject acceptButton = | ||||||
|  |             // new UiObject(new UiSelector().textContains("Accept") | ||||||
|  |             new UiObject(new UiSelector().resourceId("android:id/button1") | ||||||
|  |                                          .className("android.widget.Button")); | ||||||
|  |         if (!acceptButton.waitForExists(WAIT_TIMEOUT_1SEC)) { | ||||||
|  |             throw new UiObjectNotFoundException("Could not find Accept button"); | ||||||
|  |         } | ||||||
|  |         acceptButton.click(); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     public void runBenchmarks() throws Exception { |     public void runBenchmarks() throws Exception { | ||||||
|         UiSelector selector = new UiSelector(); |         UiObject runButton = | ||||||
|         UiObject runButton = new UiObject(selector.text("Run Benchmarks") |             new UiObject(new UiSelector().textContains("Run Benchmarks") | ||||||
|                                                   .className("android.widget.Button")); |                                          .className("android.widget.Button")); | ||||||
|         if (!runButton.exists()) { |         if (!runButton.waitForExists(WAIT_TIMEOUT_1SEC)) { | ||||||
|             getUiDevice().pressBack(); |             throw new UiObjectNotFoundException("Could not find Run button"); | ||||||
|  |         } | ||||||
|  |         runButton.click(); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public void runCpuBenchmarks() throws Exception { | ||||||
|  |         // The run button is at the bottom of the view and may be off the screen so swipe to be sure | ||||||
|  |         uiDeviceSwipe(Direction.DOWN, 50); | ||||||
|  |  | ||||||
|  |         UiObject runButton = | ||||||
|  |             new UiObject(new UiSelector().resourceId("com.primatelabs.geekbench:id/runCpuBenchmarks") | ||||||
|  |                                          .className("android.widget.Button")); | ||||||
|  |         if (!runButton.waitForExists(WAIT_TIMEOUT_1SEC)) { | ||||||
|  |             throw new UiObjectNotFoundException("Could not find Run button"); | ||||||
|         } |         } | ||||||
|         runButton.click(); |         runButton.click(); | ||||||
|     } |     } | ||||||
| @@ -83,18 +125,21 @@ public class UiAutomation extends BaseUiAutomation { | |||||||
|     public void waitForResultsv2() throws Exception { |     public void waitForResultsv2() throws Exception { | ||||||
|         UiSelector selector = new UiSelector(); |         UiSelector selector = new UiSelector(); | ||||||
|         UiObject resultsWebview = new UiObject(selector.className("android.webkit.WebView")); |         UiObject resultsWebview = new UiObject(selector.className("android.webkit.WebView")); | ||||||
|         if (!resultsWebview.waitForExists(TimeUnit.SECONDS.toMillis(200))) { |         if (!resultsWebview.waitForExists(WAIT_TIMEOUT_5MIN)) { | ||||||
|                 throw new UiObjectNotFoundException("Did not see Geekbench results screen."); |             throw new UiObjectNotFoundException("Did not see Geekbench results screen."); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void waitForResultsv3() throws Exception { |     public void waitForResultsv3onwards() throws Exception { | ||||||
|         UiSelector selector = new UiSelector(); |         UiSelector selector = new UiSelector(); | ||||||
|         UiObject runningTextView = new UiObject(selector.text("Running Benchmarks...") |         UiObject runningTextView = new UiObject(selector.text("Running Benchmarks...") | ||||||
|                                                         .className("android.widget.TextView")); |                                                         .className("android.widget.TextView")); | ||||||
|         runningTextView.waitForExists(TimeUnit.SECONDS.toMillis(2)); |  | ||||||
|         if (!runningTextView.waitUntilGone(TimeUnit.SECONDS.toMillis(200))) { |         if (!runningTextView.waitForExists(WAIT_TIMEOUT_1SEC)) { | ||||||
|                 throw new UiObjectNotFoundException("Did not get to Geekbench results screen."); |             throw new UiObjectNotFoundException("Did not get to Running Benchmarks... screen."); | ||||||
|  |         } | ||||||
|  |         if (!runningTextView.waitUntilGone(WAIT_TIMEOUT_10MIN)) { | ||||||
|  |             throw new UiObjectNotFoundException("Did not get to Geekbench results screen."); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -110,12 +155,12 @@ public class UiAutomation extends BaseUiAutomation { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void shareResults() throws Exception { |     public void shareResults() throws Exception { | ||||||
| 	sleep(2); // transition |         sleep(2); // transition | ||||||
|         UiSelector selector = new UiSelector(); |         UiSelector selector = new UiSelector(); | ||||||
|         getUiDevice().pressMenu(); |         getUiDevice().pressMenu(); | ||||||
|         UiObject runButton = new UiObject(selector.text("Share") |         UiObject shareButton = new UiObject(selector.text("Share") | ||||||
|                                                   .className("android.widget.TextView")); |                                                     .className("android.widget.TextView")); | ||||||
|         runButton.waitForExists(500); |         shareButton.waitForExists(WAIT_TIMEOUT_1SEC); | ||||||
|         runButton.click(); |         shareButton.click(); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user