def BatteryMeasurement(self, timeout=None, retries=None): """Context manager that enables battery data collection. It makes the device appear to stop charging so that dumpsys will start collecting power data since last charge. Once the with block is exited, charging is resumed and power data since last charge is no longer collected. Only for devices L and higher. Example usage: with BatteryMeasurement(): browser_actions() get_power_data() # report usage within this block after_measurements() # Anything that runs after power # measurements are collected Args: timeout: timeout in seconds retries: number of retries Raises: device_errors.DeviceVersionError: If device is not L or higher. """ if self._device.build_version_sdk < version_codes.LOLLIPOP: raise device_errors.DeviceVersionError( 'Device must be L or higher.') try: self.DisableBatteryUpdates(timeout=timeout, retries=retries) yield finally: self.EnableBatteryUpdates(timeout=timeout, retries=retries)
def GetPowerData(self, timeout=None, retries=None): """Get power data for device. Args: timeout: timeout in seconds retries: number of retries Returns: Dict containing system power, and a per-package power dict keyed on package names. { 'system_total': 23.1, 'per_package' : { package_name: { 'uid': uid, 'data': [1,2,3] }, } } """ if 'uids' not in self._cache: self._cache['uids'] = {} dumpsys_output = self._device.RunShellCommand( ['dumpsys', 'batterystats', '-c'], check_return=True, large_output=True) csvreader = csv.reader(dumpsys_output) pwi_entries = collections.defaultdict(list) system_total = None for entry in csvreader: if entry[_DUMP_VERSION_INDEX] not in ['8', '9']: # Wrong dumpsys version. raise device_errors.DeviceVersionError( 'Dumpsys version must be 8 or 9. "%s" found.' % entry[_DUMP_VERSION_INDEX]) if _ROW_TYPE_INDEX < len(entry) and entry[_ROW_TYPE_INDEX] == 'uid': current_package = entry[_PACKAGE_NAME_INDEX] if (self._cache['uids'].get(current_package) and self._cache['uids'].get(current_package) != entry[_PACKAGE_UID_INDEX]): raise device_errors.CommandFailedError( 'Package %s found multiple times with different UIDs %s and %s' % (current_package, self._cache['uids'][current_package], entry[_PACKAGE_UID_INDEX])) self._cache['uids'][current_package] = entry[_PACKAGE_UID_INDEX] elif (_PWI_POWER_CONSUMPTION_INDEX < len(entry) and entry[_ROW_TYPE_INDEX] == 'pwi' and entry[_PWI_AGGREGATION_INDEX] == 'l'): pwi_entries[entry[_PWI_UID_INDEX]].append( float(entry[_PWI_POWER_CONSUMPTION_INDEX])) elif (_PWS_POWER_CONSUMPTION_INDEX < len(entry) and entry[_ROW_TYPE_INDEX] == 'pws' and entry[_PWS_AGGREGATION_INDEX] == 'l'): # This entry should only appear once. assert system_total is None system_total = float(entry[_PWS_POWER_CONSUMPTION_INDEX]) per_package = {p: {'uid': uid, 'data': pwi_entries[uid]} for p, uid in self._cache['uids'].iteritems()} return {'system_total': system_total, 'per_package': per_package}