Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(919)

Unified Diff: scripts/android_stats.py

Issue 1491603002: Add android_stats.py script (Closed) Base URL: https://skia.googlesource.com/buildbot@master
Patch Set: Fix comment Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: scripts/android_stats.py
diff --git a/scripts/android_stats.py b/scripts/android_stats.py
new file mode 100755
index 0000000000000000000000000000000000000000..e723fb090a8af4aebe3e4fea96c4b7ce66136823
--- /dev/null
+++ b/scripts/android_stats.py
@@ -0,0 +1,86 @@
+#!/usr/bin/env python
+# Copyright (c) 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+
+"""Produce health statistics for all attached Android devices."""
+
+
+import json
+import re
+import shlex
+import subprocess
+
+
+def sanitize(string):
+ """Return a string which is safe for InfluxDB."""
+ return re.sub('\W+', '_', string.strip())
+
+
+def get_devices():
+ """Return a list of attached-and-ready Android devices."""
+ devices = []
+ for line in subprocess.check_output(['adb', 'devices']).splitlines()[1:]:
+ if not line:
+ continue
+ parts = shlex.split(line)
+ if len(parts) != 2:
+ continue
+ if parts[1] == 'device':
+ devices.append(parts[0])
+ return devices
+
+
+def get_device_model(serial):
+ """Return the model name for the given device."""
+ cmd = ['adb', '-s', serial, 'shell', 'getprop', 'ro.product.model']
+ return sanitize(subprocess.check_output(cmd))
+
+
+def get_battery_stats(serial):
+ """Obtain and return a dictionary of battery statistics for the device."""
+ cmd = ['adb', '-s', serial, 'shell', 'dumpsys', 'batteryproperties']
rmistry 2015/12/01 16:33:17 I ran this on N5 and it said: Can't find service:
borenet 2015/12/01 20:00:07 Yeah, the services are apparently different betwee
djsollen 2015/12/02 15:46:03 I think that batteryproperties should be available
+ output = subprocess.check_output(cmd)
+ parts = re.findall('([a-zA-Z0-9\s]+): (\d+)\s*', output)
+ rv = {}
+ for k, v in parts:
+ rv[sanitize(k)] = int(v)
+ return rv
+
+
+def get_temperature(serial):
+ """Obtain and return the temperature of the device."""
+ temp_file = '/sys/devices/virtual/thermal/thermal_zone0/temp'
rmistry 2015/12/01 16:33:17 What about the other zones? On the N5 it is showin
borenet 2015/12/01 20:00:07 Dunno. I'm still hoping to find a better way to d
djsollen 2015/12/02 15:46:03 You could loop through all the zones and print the
borenet 2015/12/02 15:59:26 I think I'll leave as-is for now and update if/whe
+ cmd = ['adb', '-s', serial, 'shell', 'cat', temp_file]
+ output = subprocess.check_output(cmd).strip()
+ try:
+ temp = float(output)
+ except Exception:
+ return -1
+ # Normalize the temperature, assuming it's 9 < t < 100 degrees C.
+ while temp > 100.0:
+ temp /= 10
rmistry 2015/12/01 16:33:17 Why is this necessary? do some devices output 30C
borenet 2015/12/01 20:00:07 Yes. The two devices on my desk report 2780 and 3
+ return temp
+
+
+def get_device_stats(serial):
+ """Obtain and return a dictionary of device statistics."""
+ return {
+ 'battery': get_battery_stats(serial),
+ 'model': get_device_model(serial),
+ 'temperature': get_temperature(serial),
+ }
+
+
+def get_all_device_stats():
+ """Obtain and return statistics for all attached devices."""
+ devices = get_devices()
+ stats = {}
+ for device in devices:
+ stats[device] = get_device_stats(device)
+ return stats
+
+
+if __name__ == '__main__':
+ print json.dumps(get_all_device_stats(), sort_keys=True, indent=4)
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698