Index: build/android/pylib/device/device_utils.py |
diff --git a/build/android/pylib/device/device_utils.py b/build/android/pylib/device/device_utils.py |
index fe9d2c64324ecb378bf43b4c63aa8e1d13a94acc..54f9a5dd505581394b8e5bd85a366a742454bd5a 100644 |
--- a/build/android/pylib/device/device_utils.py |
+++ b/build/android/pylib/device/device_utils.py |
@@ -126,6 +126,7 @@ class DeviceUtils(object): |
self._default_timeout = default_timeout |
self._default_retries = default_retries |
self._cache = {} |
+ self._cache['application_paths'] = {} |
assert hasattr(self, decorators.DEFAULT_TIMEOUT_ATTR) |
assert hasattr(self, decorators.DEFAULT_RETRIES_ATTR) |
@@ -279,6 +280,10 @@ class DeviceUtils(object): |
# in Lollipop. |
# TODO(jbudorick): Check if this is fixed as new Android versions are |
# released to put an upper bound on this. |
+ application_paths = self._cache['application_paths'] |
jbudorick
2015/01/21 22:54:09
If we stay with the cache, please move this above
|
+ if package in application_paths: |
+ return application_paths[package] |
+ |
should_check_return = (self.build_version_sdk < |
jbudorick
2015/01/21 22:54:09
w.r.t. my tuning suggestion: we already have some
|
constants.ANDROID_SDK_VERSION_CODES.LOLLIPOP) |
output = self.RunShellCommand(['pm', 'path', package], single_line=True, |
@@ -288,7 +293,8 @@ class DeviceUtils(object): |
if not output.startswith('package:'): |
raise device_errors.CommandFailedError('pm path returned: %r' % output, |
str(self)) |
- return output[len('package:'):] |
+ application_paths[package] = output[len('package:'):] |
+ return application_paths[package] |
@decorators.WithTimeoutAndRetriesFromInstance() |
def WaitUntilFullyBooted(self, wifi=False, timeout=None, retries=None): |
@@ -359,6 +365,7 @@ class DeviceUtils(object): |
self.adb.Reboot() |
self._cache = {} |
+ self._cache['application_paths'] = {} |
timeout_retry.WaitFor(device_offline, wait_period=1) |
if block: |
self.WaitUntilFullyBooted() |
@@ -396,6 +403,10 @@ class DeviceUtils(object): |
if should_install: |
self.adb.Install(apk_path, reinstall=reinstall) |
+ application_paths = self._cache['application_paths'] |
+ if package_name in application_paths: |
+ del application_paths[package_name] |
+ |
@decorators.WithTimeoutAndRetriesFromInstance() |
def RunShellCommand(self, cmd, check_return=False, cwd=None, env=None, |
as_root=False, single_line=False, |
@@ -421,6 +432,9 @@ class DeviceUtils(object): |
TODO(perezju) Change the default of |check_return| to True when callers |
have switched to the new behaviour. |
+ TODO(jaekyun) Should clear some of non-RO cache items if this command |
+ affects them. |
+ |
Args: |
cmd: A string with the full command to run on the device, or a sequence |
containing the command and its arguments. |
@@ -456,6 +470,10 @@ class DeviceUtils(object): |
if not isinstance(cmd, basestring): |
cmd = ' '.join(cmd_helper.SingleQuote(s) for s in cmd) |
+ |
+ if cmd.startswith('pm install') or cmd.startswith('pm uninstall'): |
jbudorick
2015/01/21 22:54:09
O_O
This looks _extremely_ dangerous / flaky / te
|
+ self._cache['application_paths'] = {} |
+ |
if env: |
env = ' '.join(env_quote(k, v) for k, v in env.iteritems()) |
cmd = '%s %s' % (env, cmd) |