3 # Copyright 2015 The Chromium Authors. All rights reserved.
4 # Use of this source code is governed by a BSD-style license that can be
5 # found in the LICENSE file.
13 sys
.path
.append(os
.path
.join(os
.path
.dirname(__file__
), os
.pardir
,
16 from profile_chrome
import chrome_startup_controller
17 from profile_chrome
import controllers
18 from profile_chrome
import flags
19 from profile_chrome
import profiler
20 from profile_chrome
import systrace_controller
21 from profile_chrome
import ui
22 from pylib
.device
import device_utils
25 def _CreateOptionParser():
26 parser
= optparse
.OptionParser(description
='Record about://tracing profiles '
27 'from Android browsers startup, combined with '
28 'Android systrace. See http://dev.chromium.org'
29 '/developers/how-tos/trace-event-profiling-'
30 'tool for detailed instructions for '
32 parser
.add_option('--url', help='URL to visit on startup. Default: '
33 'https://www.google.com', default
='https://www.google.com',
35 parser
.add_option('--cold', help='Flush the OS page cache before starting the'
36 ' browser. Note that this require a device with root '
37 'access.', default
=False, action
='store_true')
38 parser
.add_option_group(flags
.SystraceOptions(parser
))
39 parser
.add_option_group(flags
.OutputOptions(parser
))
41 browsers
= sorted(profiler
.GetSupportedBrowsers().keys())
42 parser
.add_option('-b', '--browser', help='Select among installed browsers. '
43 'One of ' + ', '.join(browsers
) + ', "stable" is used by '
44 'default.', type='choice', choices
=browsers
,
46 parser
.add_option('-v', '--verbose', help='Verbose logging.',
48 parser
.add_option('-z', '--compress', help='Compress the resulting trace '
49 'with gzip. ', action
='store_true')
54 parser
= _CreateOptionParser()
55 options
, _
= parser
.parse_args()
58 logging
.getLogger().setLevel(logging
.DEBUG
)
60 devices
= device_utils
.DeviceUtils
.HealthyDevices()
62 logging
.error('Exactly 1 device must be attached.')
65 package_info
= profiler
.GetSupportedBrowsers()[options
.browser
]
67 if options
.systrace_categories
in ['list', 'help']:
68 ui
.PrintMessage('\n'.join(
69 systrace_controller
.SystraceController
.GetCategories(device
)))
71 systrace_categories
= (options
.systrace_categories
.split(',')
72 if options
.systrace_categories
else [])
73 enabled_controllers
= []
74 # Enable the systrace and chrome controller. The systrace controller should go
75 # first because otherwise the resulting traces miss early systrace data.
76 if systrace_categories
:
77 enabled_controllers
.append(systrace_controller
.SystraceController(
78 device
, systrace_categories
, False))
79 enabled_controllers
.append(
80 chrome_startup_controller
.ChromeStartupTracingController(
81 device
, package_info
, options
.cold
, options
.url
))
83 options
.output
= os
.path
.expanduser(options
.output
)
84 result
= profiler
.CaptureProfile(enabled_controllers
, 0,
85 output
=options
.output
,
86 compress
=options
.compress
,
87 write_json
=options
.json
)
89 if sys
.platform
== 'darwin':
90 os
.system('/usr/bin/open %s' % os
.path
.abspath(result
))
92 webbrowser
.open(result
)
95 if __name__
== '__main__':