OLD | NEW |
---|---|
1 #! /usr/bin/env python | |
1 # Copyright (c) 2015 The Chromium Authors. All rights reserved. | 2 # Copyright (c) 2015 The Chromium Authors. All rights reserved. |
2 # Use of this source code is governed by a BSD-style license that can be | 3 # Use of this source code is governed by a BSD-style license that can be |
3 # found in the LICENSE file. | 4 # found in the LICENSE file. |
4 | 5 |
5 """Utility library for running a startup profile on an Android device. | 6 """Utility library for running a startup profile on an Android device. |
6 | 7 |
7 Sets up a device for cygprofile, disables sandboxing permissions, and sets up | 8 Sets up a device for cygprofile, disables sandboxing permissions, and sets up |
8 support for web page replay, device forwarding, and fake certificate authority | 9 support for web page replay, device forwarding, and fake certificate authority |
9 to make runs repeatable. | 10 to make runs repeatable. |
10 """ | 11 """ |
11 | 12 |
13 import argparse | |
12 import logging | 14 import logging |
13 import os | 15 import os |
14 import shutil | 16 import shutil |
15 import subprocess | 17 import subprocess |
16 import sys | 18 import sys |
17 import tempfile | 19 import tempfile |
18 import time | 20 import time |
19 | 21 |
20 sys.path.append(os.path.join(sys.path[0], '..', '..', | 22 sys.path.append(os.path.join(sys.path[0], '..', '..', |
21 'third_party', 'catapult', 'devil')) | 23 'third_party', 'catapult', 'devil')) |
24 from devil.android import apk_helper | |
22 from devil.android import device_errors | 25 from devil.android import device_errors |
23 from devil.android import device_utils | 26 from devil.android import device_utils |
24 from devil.android import flag_changer | 27 from devil.android import flag_changer |
25 from devil.android import forwarder | 28 from devil.android import forwarder |
26 from devil.android.sdk import intent | 29 from devil.android.sdk import intent |
27 | 30 |
28 sys.path.append(os.path.join(sys.path[0], '..', '..', 'build', 'android')) | 31 sys.path.append(os.path.join(sys.path[0], '..', '..', 'build', 'android')) |
32 import devil_chromium | |
29 from pylib import constants | 33 from pylib import constants |
30 | 34 |
31 sys.path.append(os.path.join(sys.path[0], '..', '..', 'tools', 'perf')) | 35 sys.path.append(os.path.join(sys.path[0], '..', '..', 'tools', 'perf')) |
32 from chrome_telemetry_build import chromium_config | 36 from chrome_telemetry_build import chromium_config |
33 sys.path.append(chromium_config.GetTelemetryDir()) | 37 sys.path.append(chromium_config.GetTelemetryDir()) |
34 from telemetry.internal.util import wpr_server | 38 from telemetry.internal.util import wpr_server |
35 | 39 |
36 sys.path.append(os.path.join(sys.path[0], '..', '..', | 40 sys.path.append(os.path.join(sys.path[0], '..', '..', |
37 'third_party', 'webpagereplay')) | 41 'third_party', 'webpagereplay')) |
38 import adb_install_cert | 42 import adb_install_cert |
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
196 | 200 |
197 _DEVICE_CYGLOG_DIR = '/data/local/tmp/chrome/cyglog' | 201 _DEVICE_CYGLOG_DIR = '/data/local/tmp/chrome/cyglog' |
198 | 202 |
199 # TEST_URL must be a url in the WPR_ARCHIVE. | 203 # TEST_URL must be a url in the WPR_ARCHIVE. |
200 _TEST_URL = 'https://www.google.com/#hl=en&q=science' | 204 _TEST_URL = 'https://www.google.com/#hl=en&q=science' |
201 _WPR_ARCHIVE = os.path.join( | 205 _WPR_ARCHIVE = os.path.join( |
202 constants.DIR_SOURCE_ROOT, 'tools', 'perf', 'page_sets', 'data', | 206 constants.DIR_SOURCE_ROOT, 'tools', 'perf', 'page_sets', 'data', |
203 'top_10_mobile_002.wpr') | 207 'top_10_mobile_002.wpr') |
204 | 208 |
205 | 209 |
206 def __init__(self, output_directory): | 210 def __init__(self, output_directory, host_cyglog_dir=None): |
pasko
2017/01/04 14:17:24
why do we need this be optional? is it hard to mak
jbudorick
2017/01/04 15:11:52
Doing so in this CL would break the downstream use
pasko
2017/01/04 15:44:14
OK, sure, please add a TODO to make this a mandato
jbudorick
2017/01/04 17:08:51
Done.
| |
207 devices = device_utils.DeviceUtils.HealthyDevices() | 211 devices = device_utils.DeviceUtils.HealthyDevices() |
208 self._device = devices[0] | 212 self._device = devices[0] |
209 self._cygprofile_tests = os.path.join( | 213 self._cygprofile_tests = os.path.join( |
210 output_directory, 'cygprofile_unittests') | 214 output_directory, 'cygprofile_unittests') |
211 self._host_cyglog_dir = os.path.join( | 215 self._host_cyglog_dir = host_cyglog_dir or os.path.join( |
212 output_directory, 'cyglog_data') | 216 output_directory, 'cyglog_data') |
213 self._SetUpDevice() | 217 self._SetUpDevice() |
214 | 218 |
215 def RunCygprofileTests(self): | 219 def RunCygprofileTests(self): |
216 """Run the cygprofile unit tests suite on the device. | 220 """Run the cygprofile unit tests suite on the device. |
217 | 221 |
218 Args: | 222 Args: |
219 path_to_tests: The location on the host machine with the compiled | 223 path_to_tests: The location on the host machine with the compiled |
220 cygprofile test binary. | 224 cygprofile test binary. |
221 Returns: | 225 Returns: |
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
364 # Temporary workaround/investigation: if (for unknown reason) 'adb pull' of | 368 # Temporary workaround/investigation: if (for unknown reason) 'adb pull' of |
365 # the directory 'cyglog' into '.../Release/cyglog_data' produces | 369 # the directory 'cyglog' into '.../Release/cyglog_data' produces |
366 # '...cyglog_data/cyglog/files' instead of the usual '...cyglog_data/files', | 370 # '...cyglog_data/cyglog/files' instead of the usual '...cyglog_data/files', |
367 # list the files deeper in the tree. | 371 # list the files deeper in the tree. |
368 cyglog_dir = self._host_cyglog_dir | 372 cyglog_dir = self._host_cyglog_dir |
369 if (len(files) == 1) and (files[0] == 'cyglog'): | 373 if (len(files) == 1) and (files[0] == 'cyglog'): |
370 cyglog_dir = os.path.join(self._host_cyglog_dir, 'cyglog') | 374 cyglog_dir = os.path.join(self._host_cyglog_dir, 'cyglog') |
371 files = os.listdir(cyglog_dir) | 375 files = os.listdir(cyglog_dir) |
372 | 376 |
373 return [os.path.join(cyglog_dir, x) for x in files] | 377 return [os.path.join(cyglog_dir, x) for x in files] |
378 | |
379 | |
380 def main(raw_args): | |
381 parser = argparse.ArgumentParser() | |
382 parser.add_argument( | |
383 '--adb-path', type=os.path.realpath, | |
384 help='adb binary') | |
385 parser.add_argument( | |
386 '--apk-path', type=os.path.realpath, required=True, | |
387 help='APK to profile') | |
388 parser.add_argument( | |
389 '--output-directory', type=os.path.realpath, required=True, | |
390 help='Chromium output directory (e.g. out/Release)') | |
391 parser.add_argument( | |
392 '--trace-directory', type=os.path.realpath, | |
393 help='Directory in which cyglog traces will be stored. ' | |
394 'Defaults to <output-directory>/cyglog_data') | |
395 | |
396 args = parser.parse_args(raw_args) | |
pasko
2017/01/04 14:17:24
why not just parser.parse_args()?
jbudorick
2017/01/04 15:11:52
This is a habit I've been getting into s.t. other
pasko
2017/01/04 15:44:14
ah, ok. I'm probably from a different universe (C
| |
397 | |
398 devil_chromium.Initialize( | |
399 output_directory=args.output_directory, adb_path=args.adb_path) | |
400 | |
401 apk = apk_helper.ApkHelper(args.apk_path) | |
402 package_info = None | |
403 for p in constants.PACKAGE_INFO.itervalues(): | |
404 if p.package == apk.GetPackageName(): | |
405 package_info = p | |
406 break | |
407 else: | |
408 raise Exception('Unable to determine package info for %s' % args.apk_path) | |
409 | |
410 profiler = AndroidProfileTool( | |
411 args.output_directory, host_cyglog_dir=args.trace_directory) | |
412 profiler.CollectProfile(args.apk_path, package_info) | |
413 return 0 | |
414 | |
415 | |
416 if __name__ == '__main__': | |
417 sys.exit(main(sys.argv[1:])) | |
418 | |
OLD | NEW |