Index: tools/telemetry/telemetry/core/backends/chrome/android_browser_finder.py |
diff --git a/tools/telemetry/telemetry/core/backends/chrome/android_browser_finder.py b/tools/telemetry/telemetry/core/backends/chrome/android_browser_finder.py |
index 1d12d81f201be93185ab38f7de14cede8b85532e..a4270f18bf56a12007a8ab91c3ae228611bbf44b 100644 |
--- a/tools/telemetry/telemetry/core/backends/chrome/android_browser_finder.py |
+++ b/tools/telemetry/telemetry/core/backends/chrome/android_browser_finder.py |
@@ -9,9 +9,11 @@ import os |
from telemetry import decorators |
from telemetry.core import browser |
+from telemetry.core import exceptions |
from telemetry.core import possible_browser |
from telemetry.core import platform |
from telemetry.core import util |
+from telemetry.core.backends import adb_commands |
from telemetry.core.platform import android_device |
from telemetry.core.backends.chrome import android_browser_backend |
@@ -71,8 +73,14 @@ class PossibleAndroidBrowser(possible_browser.PossibleBrowser): |
self._backend_settings = backend_settings |
self._local_apk = None |
- chrome_root = util.GetChromiumSrcDir() |
- if apk_name: |
+ if browser_type == 'exact': |
+ if not os.path.exists(apk_name): |
+ raise exceptions.PathMissingError( |
+ 'Unable to find exact apk %s specified by --browser-executable' % |
+ apk_name) |
+ self._local_apk = apk_name |
+ elif apk_name: |
+ chrome_root = util.GetChromiumSrcDir() |
candidate_apks = [] |
for build_dir, build_type in util.GetBuildDirectories(): |
apk_full_name = os.path.join(chrome_root, build_dir, build_type, 'apks', |
@@ -139,8 +147,12 @@ def CanFindAvailableBrowsers(): |
return android_device.CanDiscoverDevices() |
+def CanPossiblyHandlePath(target_path): |
+ return os.path.splitext(target_path.lower())[1] == '.apk' |
+ |
+ |
def FindAllBrowserTypes(_options): |
- return CHROME_PACKAGE_NAMES.keys() |
+ return CHROME_PACKAGE_NAMES.keys() + ['exact'] |
def _FindAllPossibleBrowsers(finder_options, android_platform): |
@@ -148,6 +160,34 @@ def _FindAllPossibleBrowsers(finder_options, android_platform): |
if not android_platform: |
return [] |
possible_browsers = [] |
+ |
+ # Add the exact APK if given. |
+ if (finder_options.browser_executable and |
+ CanPossiblyHandlePath(finder_options.browser_executable)): |
+ normalized_path = os.path.expanduser(finder_options.browser_executable) |
+ |
+ exact_package = adb_commands.GetPackageName(normalized_path) |
+ if not exact_package: |
+ raise exceptions.PackageDetectionError( |
+ 'Unable to find package for %s specified by --browser-executable' % |
+ normalized_path) |
+ |
+ package_info = next((info for info in CHROME_PACKAGE_NAMES.itervalues() |
+ if info[0] == exact_package), None) |
+ if package_info: |
+ [package, backend_settings, _] = package_info |
+ possible_browsers.append( |
+ PossibleAndroidBrowser( |
+ 'exact', |
+ finder_options, |
+ android_platform, |
+ backend_settings(package), |
+ normalized_path)) |
+ else: |
+ raise exceptions.UnknownPackageError( |
+ '%s specified by --browser-executable has an unknown package: %s' % |
+ (normalized_path, exact_package)) |
+ |
for name, package_info in CHROME_PACKAGE_NAMES.iteritems(): |
package, backend_settings, local_apk = package_info |
b = PossibleAndroidBrowser(name, |