Index: tools/skpbench/_hardware_android.py |
diff --git a/tools/skpbench/_hardware_android.py b/tools/skpbench/_hardware_android.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..a752ff5d93421822e8b5b121f17fc295add52b6d |
--- /dev/null |
+++ b/tools/skpbench/_hardware_android.py |
@@ -0,0 +1,93 @@ |
+# Copyright 2016 Google Inc. |
+# |
+# Use of this source code is governed by a BSD-style license that can be |
+# found in the LICENSE file. |
+ |
+from __future__ import print_function |
+from _hardware import Hardware |
+import sys |
+import time |
+ |
+class HardwareAndroid(Hardware): |
+ def __init__(self, adb): |
+ Hardware.__init__(self) |
+ self.kick_in_time = 5 |
+ self._adb = adb |
+ self._is_root = self._adb.attempt_root() |
+ if self._is_root: |
+ self._adb.remount() |
+ self._initial_airplane_mode = None |
+ self._initial_location_providers = None |
+ self._initial_ASLR = None |
+ |
+ def __enter__(self): |
+ # turn on airplane mode. |
+ self._initial_airplane_mode = \ |
+ self._adb.check('settings get global airplane_mode_on') |
+ self._adb.shell('settings put global airplane_mode_on 1') |
+ |
+ # disable GPS. |
+ self._initial_location_providers = \ |
+ self._adb.check('settings get secure location_providers_allowed') |
+ self._initial_location_providers = \ |
+ self._initial_location_providers.replace(',', ' ') |
+ self._adb.shell('''\ |
+ for PROVIDER in %s; do |
+ settings put secure location_providers_allowed -$PROVIDER |
+ done''' % self._initial_location_providers) |
+ |
+ if self._is_root: |
+ # disable bluetooth, wifi, and mobile data. |
+ # TODO: can we query these initial values? |
+ self._adb.shell('''\ |
+ service call bluetooth_manager 8 && |
+ svc wifi disable && |
+ svc data disable''') |
+ |
+ # kill the gui. |
+ self._adb.shell('''\ |
+ setprop ctl.stop media && |
+ setprop ctl.stop zygote && |
+ setprop ctl.stop surfaceflinger && |
+ setprop ctl.stop drm''') |
+ |
+ # disable ASLR. |
+ self._initial_ASLR = \ |
+ self._adb.check('cat /proc/sys/kernel/randomize_va_space') |
+ self._adb.shell('echo 0 > /proc/sys/kernel/randomize_va_space') |
+ else: |
+ print("WARNING: no adb root access; results may be unreliable.", |
+ file=sys.stderr) |
+ |
+ return Hardware.__enter__(self) |
+ |
+ def __exit__(self, exception_type, exception_value, traceback): |
+ Hardware.__exit__(self, exception_type, exception_value, traceback) |
+ |
+ if self._is_root: |
+ # restore ASLR. |
+ self._adb.shell('echo %s > /proc/sys/kernel/randomize_va_space' % |
+ self._initial_ASLR) |
+ |
+ # revive the gui. |
+ self._adb.shell('''\ |
+ setprop ctl.start drm && |
+ setprop ctl.start surfaceflinger && |
+ setprop ctl.start zygote && |
+ setprop ctl.start media''') |
+ |
+ # restore GPS (doesn't seem to work if we killed the gui). |
+ self._adb.shell('''\ |
+ for PROVIDER in %s; do |
+ settings put secure location_providers_allowed +$PROVIDER |
+ done''' % self._initial_location_providers) |
+ |
+ # restore airplane mode (doesn't seem to work if we killed the gui). |
+ self._adb.shell('settings put global airplane_mode_on %s' % |
+ self._initial_airplane_mode) |
+ |
+ def sanity_check(self): |
+ Hardware.sanity_check(self) |
+ |
+ def sleep(self, sleeptime): |
+ Hardware.sleep(self, sleeptime) |