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

Side by Side Diff: telemetry/telemetry/internal/platform/android_platform_backend.py

Issue 2123713005: [Telemetry] Add MeasureMemory method to action_runner (Closed) Base URL: git@github.com:catapult-project/catapult@master
Patch Set: rephrase comment Created 4 years, 4 months 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 unified diff | Download patch
OLDNEW
1 # Copyright 2013 The Chromium Authors. All rights reserved. 1 # Copyright 2013 The Chromium Authors. All rights reserved.
2 # Use of this source code is governed by a BSD-style license that can be 2 # Use of this source code is governed by a BSD-style license that can be
3 # found in the LICENSE file. 3 # found in the LICENSE file.
4 4
5 import logging 5 import logging
6 import os 6 import os
7 import posixpath 7 import posixpath
8 import re 8 import re
9 import subprocess 9 import subprocess
10 import tempfile 10 import tempfile
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
87 try: 87 try:
88 self._device.EnableRoot() 88 self._device.EnableRoot()
89 except device_errors.CommandFailedError: 89 except device_errors.CommandFailedError:
90 logging.warning('Unable to root %s', str(self._device)) 90 logging.warning('Unable to root %s', str(self._device))
91 self._battery = battery_utils.BatteryUtils(self._device) 91 self._battery = battery_utils.BatteryUtils(self._device)
92 self._enable_performance_mode = device.enable_performance_mode 92 self._enable_performance_mode = device.enable_performance_mode
93 self._surface_stats_collector = None 93 self._surface_stats_collector = None
94 self._perf_tests_setup = perf_control.PerfControl(self._device) 94 self._perf_tests_setup = perf_control.PerfControl(self._device)
95 self._thermal_throttle = thermal_throttle.ThermalThrottle(self._device) 95 self._thermal_throttle = thermal_throttle.ThermalThrottle(self._device)
96 self._raw_display_frame_rate_measurements = [] 96 self._raw_display_frame_rate_measurements = []
97 self._can_access_protected_file_contents = ( 97 self._can_elevate_privilege = (
98 self._device.HasRoot() or self._device.NeedsSU()) 98 self._device.HasRoot() or self._device.NeedsSU())
99 self._device_copy_script = None 99 self._device_copy_script = None
100 self._power_monitor = ( 100 self._power_monitor = (
101 android_power_monitor_controller.AndroidPowerMonitorController([ 101 android_power_monitor_controller.AndroidPowerMonitorController([
102 android_temperature_monitor.AndroidTemperatureMonitor(self._device), 102 android_temperature_monitor.AndroidTemperatureMonitor(self._device),
103 monsoon_power_monitor.MonsoonPowerMonitor(self._device, self), 103 monsoon_power_monitor.MonsoonPowerMonitor(self._device, self),
104 android_dumpsys_power_monitor.DumpsysPowerMonitor( 104 android_dumpsys_power_monitor.DumpsysPowerMonitor(
105 self._battery, self), 105 self._battery, self),
106 sysfs_power_monitor.SysfsPowerMonitor(self, standalone=True), 106 sysfs_power_monitor.SysfsPowerMonitor(self, standalone=True),
107 android_fuelgauge_power_monitor.FuelGaugePowerMonitor( 107 android_fuelgauge_power_monitor.FuelGaugePowerMonitor(
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
207 def CanMonitorThermalThrottling(self): 207 def CanMonitorThermalThrottling(self):
208 return True 208 return True
209 209
210 def IsThermallyThrottled(self): 210 def IsThermallyThrottled(self):
211 return self._thermal_throttle.IsThrottled() 211 return self._thermal_throttle.IsThrottled()
212 212
213 def HasBeenThermallyThrottled(self): 213 def HasBeenThermallyThrottled(self):
214 return self._thermal_throttle.HasBeenThrottled() 214 return self._thermal_throttle.HasBeenThrottled()
215 215
216 def GetCpuStats(self, pid): 216 def GetCpuStats(self, pid):
217 if not self._can_access_protected_file_contents: 217 if not self._can_elevate_privilege:
218 logging.warning('CPU stats cannot be retrieved on non-rooted device.') 218 logging.warning('CPU stats cannot be retrieved on non-rooted device.')
219 return {} 219 return {}
220 return super(AndroidPlatformBackend, self).GetCpuStats(pid) 220 return super(AndroidPlatformBackend, self).GetCpuStats(pid)
221 221
222 def GetCpuTimestamp(self): 222 def GetCpuTimestamp(self):
223 if not self._can_access_protected_file_contents: 223 if not self._can_elevate_privilege:
224 logging.warning('CPU timestamp cannot be retrieved on non-rooted device.') 224 logging.warning('CPU timestamp cannot be retrieved on non-rooted device.')
225 return {} 225 return {}
226 return super(AndroidPlatformBackend, self).GetCpuTimestamp() 226 return super(AndroidPlatformBackend, self).GetCpuTimestamp()
227 227
228 def SetGraphicsMemoryTrackingEnabled(self, enabled): 228 def SetGraphicsMemoryTrackingEnabled(self, enabled):
229 if not enabled: 229 if not enabled:
230 self.KillApplication('memtrack_helper') 230 self.KillApplication('memtrack_helper')
231 return 231 return
232 232
233 if not android_prebuilt_profiler_helper.InstallOnDevice( 233 if not android_prebuilt_profiler_helper.InstallOnDevice(
234 self._device, 'memtrack_helper'): 234 self._device, 'memtrack_helper'):
235 raise Exception('Error installing memtrack_helper.') 235 raise Exception('Error installing memtrack_helper.')
236 self._device.RunShellCommand([ 236 self._device.RunShellCommand([
237 android_prebuilt_profiler_helper.GetDevicePath('memtrack_helper'), 237 android_prebuilt_profiler_helper.GetDevicePath('memtrack_helper'),
238 '-d'], as_root=True, check_return=True) 238 '-d'], as_root=True, check_return=True)
239 239
240 def PurgeUnpinnedMemory(self): 240 def PurgeUnpinnedMemory(self):
241 """Purges the unpinned ashmem memory for the whole system. 241 """Purges the unpinned ashmem memory for the whole system.
242 242
243 This can be used to make memory measurements more stable. Requires root. 243 This can be used to make memory measurements more stable. Requires root.
244 """ 244 """
245 if not self._can_access_protected_file_contents: 245 if not self._can_elevate_privilege:
246 logging.warning('Cannot run purge_ashmem. Requires a rooted device.') 246 logging.warning('Cannot run purge_ashmem. Requires a rooted device.')
247 return 247 return
248 248
249 if not android_prebuilt_profiler_helper.InstallOnDevice( 249 if not android_prebuilt_profiler_helper.InstallOnDevice(
250 self._device, 'purge_ashmem'): 250 self._device, 'purge_ashmem'):
251 raise Exception('Error installing purge_ashmem.') 251 raise Exception('Error installing purge_ashmem.')
252 output = self._device.RunShellCommand([ 252 output = self._device.RunShellCommand([
253 android_prebuilt_profiler_helper.GetDevicePath('purge_ashmem')]) 253 android_prebuilt_profiler_helper.GetDevicePath('purge_ashmem')])
254 for l in output: 254 for l in output:
255 logging.info(l) 255 logging.info(l)
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
293 return self._device.product_model 293 return self._device.product_model
294 294
295 @decorators.Cache 295 @decorators.Cache
296 def GetOSVersionName(self): 296 def GetOSVersionName(self):
297 return self._device.GetProp('ro.build.id')[0] 297 return self._device.GetProp('ro.build.id')[0]
298 298
299 def CanFlushIndividualFilesFromSystemCache(self): 299 def CanFlushIndividualFilesFromSystemCache(self):
300 return False 300 return False
301 301
302 def FlushEntireSystemCache(self): 302 def FlushEntireSystemCache(self):
303 if not self._can_elevate_privilege:
304 logging.warning('Cannot flush system cache on non-rooted device.')
305 return
303 cache = cache_control.CacheControl(self._device) 306 cache = cache_control.CacheControl(self._device)
304 cache.DropRamCaches() 307 cache.DropRamCaches()
305 308
306 def FlushSystemCacheForDirectory(self, directory): 309 def FlushSystemCacheForDirectory(self, directory):
307 raise NotImplementedError() 310 raise NotImplementedError()
308 311
309 def FlushDnsCache(self): 312 def FlushDnsCache(self):
310 self._device.RunShellCommand( 313 self._device.RunShellCommand(
311 ['ndc', 'resolver', 'flushdefaultif'], as_root=True) 314 ['ndc', 'resolver', 'flushdefaultif'], as_root=True)
312 315
313 def StopApplication(self, application): 316 def StopApplication(self, application):
314 """Stop the given |application|. 317 """Stop the given |application|.
315 318
316 Args: 319 Args:
317 application: The full package name string of the application to stop. 320 application: The full package name string of the application to stop.
318 """ 321 """
319 self._device.ForceStop(application) 322 self._device.ForceStop(application)
320 323
321 def KillApplication(self, application): 324 def KillApplication(self, application):
322 """Kill the given |application|. 325 """Kill the given |application|.
323 326
324 Might be used instead of ForceStop for efficiency reasons. 327 Might be used instead of ForceStop for efficiency reasons.
325 328
326 Args: 329 Args:
327 application: The full package name string of the application to kill. 330 application: The full package name string of the application to kill.
328 """ 331 """
329 assert isinstance(application, basestring) 332 assert isinstance(application, basestring)
330 self._device.KillAll(application, blocking=True, quiet=True) 333 self._device.KillAll(application, blocking=True, quiet=True)
331 334
335 def CanElevatePrivilege(self):
336 return self._can_elevate_privilege
337
332 def LaunchApplication( 338 def LaunchApplication(
333 self, application, parameters=None, elevate_privilege=False): 339 self, application, parameters=None, elevate_privilege=False):
334 """Launches the given |application| with a list of |parameters| on the OS. 340 """Launches the given |application| with a list of |parameters| on the OS.
335 341
336 Args: 342 Args:
337 application: The full package name string of the application to launch. 343 application: The full package name string of the application to launch.
338 parameters: A list of parameters to be passed to the ActivityManager. 344 parameters: A list of parameters to be passed to the ActivityManager.
339 elevate_privilege: Currently unimplemented on Android. 345 elevate_privilege: Currently unimplemented on Android.
340 """ 346 """
341 if elevate_privilege: 347 if elevate_privilege:
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
409 415
410 def PathExists(self, device_path, timeout=None, retries=None): 416 def PathExists(self, device_path, timeout=None, retries=None):
411 """ Return whether the given path exists on the device. 417 """ Return whether the given path exists on the device.
412 This method is the same as 418 This method is the same as
413 devil.android.device_utils.DeviceUtils.PathExists. 419 devil.android.device_utils.DeviceUtils.PathExists.
414 """ 420 """
415 return self._device.PathExists( 421 return self._device.PathExists(
416 device_path, timeout=timeout, retries=retries) 422 device_path, timeout=timeout, retries=retries)
417 423
418 def GetFileContents(self, fname): 424 def GetFileContents(self, fname):
419 if not self._can_access_protected_file_contents: 425 if not self._can_elevate_privilege:
420 logging.warning('%s cannot be retrieved on non-rooted device.', fname) 426 logging.warning('%s cannot be retrieved on non-rooted device.', fname)
421 return '' 427 return ''
422 return self._device.ReadFile(fname, as_root=True) 428 return self._device.ReadFile(fname, as_root=True)
423 429
424 def GetPsOutput(self, columns, pid=None): 430 def GetPsOutput(self, columns, pid=None):
425 assert columns == ['pid', 'name'] or columns == ['pid'], \ 431 assert columns == ['pid', 'name'] or columns == ['pid'], \
426 'Only know how to return pid and name. Requested: ' + columns 432 'Only know how to return pid and name. Requested: ' + columns
427 cmd = ['ps'] 433 cmd = ['ps']
428 if pid: 434 if pid:
429 cmd.extend(['-p', str(pid)]) 435 cmd.extend(['-p', str(pid)])
(...skipping 323 matching lines...) Expand 10 before | Expand all | Expand 10 after
753 for process in psutil.process_iter(): 759 for process in psutil.process_iter():
754 try: 760 try:
755 if psutil.version_info >= (2, 0): 761 if psutil.version_info >= (2, 0):
756 if 'adb' in process.name(): 762 if 'adb' in process.name():
757 process.cpu_affinity([0]) 763 process.cpu_affinity([0])
758 else: 764 else:
759 if 'adb' in process.name: 765 if 'adb' in process.name:
760 process.set_cpu_affinity([0]) 766 process.set_cpu_affinity([0])
761 except (psutil.NoSuchProcess, psutil.AccessDenied): 767 except (psutil.NoSuchProcess, psutil.AccessDenied):
762 logging.warn('Failed to set adb process CPU affinity') 768 logging.warn('Failed to set adb process CPU affinity')
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698