| OLD | NEW |
| 1 # Copyright 2014 The Chromium Authors. All rights reserved. | 1 # Copyright 2014 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 """Provides a variety of device interactions based on adb. | 5 """Provides a variety of device interactions based on adb. |
| 6 | 6 |
| 7 Eventually, this will be based on adb_wrapper. | 7 Eventually, this will be based on adb_wrapper. |
| 8 """ | 8 """ |
| 9 # pylint: disable=unused-argument | 9 # pylint: disable=unused-argument |
| 10 | 10 |
| 11 import collections | 11 import collections |
| 12 import contextlib | 12 import contextlib |
| 13 import itertools | 13 import itertools |
| 14 import logging | 14 import logging |
| 15 import multiprocessing | 15 import multiprocessing |
| 16 import os | 16 import os |
| 17 import posixpath | 17 import posixpath |
| 18 import re | 18 import re |
| 19 import shutil | 19 import shutil |
| 20 import sys | 20 import sys |
| 21 import tempfile | 21 import tempfile |
| 22 import threading |
| 22 import time | 23 import time |
| 23 import zipfile | 24 import zipfile |
| 24 | 25 |
| 25 import pylib.android_commands | 26 import pylib.android_commands |
| 26 from pylib import cmd_helper | 27 from pylib import cmd_helper |
| 27 from pylib import constants | 28 from pylib import constants |
| 28 from pylib import device_signal | 29 from pylib import device_signal |
| 29 from pylib.constants import keyevent | 30 from pylib.constants import keyevent |
| 30 from pylib.device import adb_wrapper | 31 from pylib.device import adb_wrapper |
| 31 from pylib.device import decorators | 32 from pylib.device import decorators |
| (...skipping 1053 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1085 def _ComputeDeviceChecksumsForApks(self, package_name): | 1086 def _ComputeDeviceChecksumsForApks(self, package_name): |
| 1086 ret = self._cache['package_apk_checksums'].get(package_name) | 1087 ret = self._cache['package_apk_checksums'].get(package_name) |
| 1087 if ret is None: | 1088 if ret is None: |
| 1088 device_paths = self._GetApplicationPathsInternal(package_name) | 1089 device_paths = self._GetApplicationPathsInternal(package_name) |
| 1089 file_to_checksums = md5sum.CalculateDeviceMd5Sums(device_paths, self) | 1090 file_to_checksums = md5sum.CalculateDeviceMd5Sums(device_paths, self) |
| 1090 ret = set(file_to_checksums.values()) | 1091 ret = set(file_to_checksums.values()) |
| 1091 self._cache['package_apk_checksums'][package_name] = ret | 1092 self._cache['package_apk_checksums'][package_name] = ret |
| 1092 return ret | 1093 return ret |
| 1093 | 1094 |
| 1094 def _ComputeStaleApks(self, package_name, host_apk_paths): | 1095 def _ComputeStaleApks(self, package_name, host_apk_paths): |
| 1095 host_checksums = md5sum.CalculateHostMd5Sums(host_apk_paths) | 1096 host_checksums_holder = [None] |
| 1097 def compute_host_checksums(): |
| 1098 host_checksums_holder[0] = md5sum.CalculateHostMd5Sums(host_apk_paths) |
| 1099 |
| 1100 host_thread = threading.Thread(target=compute_host_checksums) |
| 1101 host_thread.start() |
| 1096 device_checksums = self._ComputeDeviceChecksumsForApks(package_name) | 1102 device_checksums = self._ComputeDeviceChecksumsForApks(package_name) |
| 1103 host_thread.join() |
| 1104 host_checksums = host_checksums_holder[0] |
| 1097 stale_apks = [k for (k, v) in host_checksums.iteritems() | 1105 stale_apks = [k for (k, v) in host_checksums.iteritems() |
| 1098 if v not in device_checksums] | 1106 if v not in device_checksums] |
| 1099 return stale_apks, set(host_checksums.values()) | 1107 return stale_apks, set(host_checksums.values()) |
| 1100 | 1108 |
| 1101 def _PushFilesImpl(self, host_device_tuples, files): | 1109 def _PushFilesImpl(self, host_device_tuples, files): |
| 1102 size = sum(host_utils.GetRecursiveDiskUsage(h) for h, _ in files) | 1110 size = sum(host_utils.GetRecursiveDiskUsage(h) for h, _ in files) |
| 1103 file_count = len(files) | 1111 file_count = len(files) |
| 1104 dir_size = sum(host_utils.GetRecursiveDiskUsage(h) | 1112 dir_size = sum(host_utils.GetRecursiveDiskUsage(h) |
| 1105 for h, _ in host_device_tuples) | 1113 for h, _ in host_device_tuples) |
| 1106 dir_file_count = 0 | 1114 dir_file_count = 0 |
| (...skipping 773 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1880 return [cls(adb) for adb in adb_wrapper.AdbWrapper.Devices() | 1888 return [cls(adb) for adb in adb_wrapper.AdbWrapper.Devices() |
| 1881 if not blacklisted(adb)] | 1889 if not blacklisted(adb)] |
| 1882 | 1890 |
| 1883 @decorators.WithTimeoutAndRetriesFromInstance() | 1891 @decorators.WithTimeoutAndRetriesFromInstance() |
| 1884 def RestartAdbd(self, timeout=None, retries=None): | 1892 def RestartAdbd(self, timeout=None, retries=None): |
| 1885 logging.info('Restarting adbd on device.') | 1893 logging.info('Restarting adbd on device.') |
| 1886 with device_temp_file.DeviceTempFile(self.adb, suffix='.sh') as script: | 1894 with device_temp_file.DeviceTempFile(self.adb, suffix='.sh') as script: |
| 1887 self.WriteFile(script.name, _RESTART_ADBD_SCRIPT) | 1895 self.WriteFile(script.name, _RESTART_ADBD_SCRIPT) |
| 1888 self.RunShellCommand(['source', script.name], as_root=True) | 1896 self.RunShellCommand(['source', script.name], as_root=True) |
| 1889 self.adb.WaitForDevice() | 1897 self.adb.WaitForDevice() |
| OLD | NEW |