OLD | NEW |
1 #!/bin/bash | 1 #!/bin/bash |
2 # | 2 # |
3 # Copyright 2013 The Chromium Authors. All rights reserved. | 3 # Copyright 2013 The Chromium Authors. All rights reserved. |
4 # Use of this source code is governed by a BSD-style license that can be | 4 # Use of this source code is governed by a BSD-style license that can be |
5 # found in the LICENSE file. | 5 # found in the LICENSE file. |
6 # | 6 # |
7 # Start / stop profiling in chrome. | 7 # Start / stop profiling in chrome. |
8 | 8 exec $(dirname $0)/adb_profile_chrome.py $@ |
9 # The profiling data is saved to directory /sdcard/Download. The files | |
10 # are named beginning chrome-profile-results- | |
11 # | |
12 # Assumes you have sourced the android build environment script | |
13 # (e.g. 'adb' is on your path). | |
14 set -e | |
15 | |
16 usage() { | |
17 echo "adb_profile_chrome [--start [-o file] [-c C]|--stop|-d|-t N] [-v N]" | |
18 echo "See http://dev.chromium.org/developers/how-tos/trace-event-profiling-too
l for detailed instructions on profiling." | |
19 echo "" | |
20 echo " --start Start profiling." | |
21 echo " --output|-o file Save profile output to file. " | |
22 echo " (Default is /sdcard/Download/chrome-profile-results
-*)" | |
23 echo " --categories|-c C Select categories to trace with comma-delimited wil
dcards." | |
24 echo " e.g. '*', 'cat1*,-cat1a'. Default is '*'." | |
25 echo " --continuous Using the trace buffer as a ring buffer, continuous
ly" | |
26 echo " profile until stopped." | |
27 echo " --stop Stop profiling." | |
28 echo " --download|-d Download latest trace." | |
29 echo " --time|-t N Profile for N seconds and download the resulting tr
ace." | |
30 echo " --version|v N Select among installed browsers." | |
31 echo " One of stable (default), beta, dev, build" | |
32 echo "" | |
33 echo "Profiling data is saved to the device." | |
34 exit 0 | |
35 } | |
36 | |
37 send_intent() { | |
38 local PACKAGE=$1 | |
39 local INTENT=$2 | |
40 shift | |
41 shift | |
42 adb shell am broadcast -a $PACKAGE.$INTENT $* | |
43 } | |
44 | |
45 download_latest_trace() { | |
46 (adb logcat -d | grep -q "Logging performance trace to file") || { | |
47 echo "WARNING: Trace start marker not found. Is the correct version of Chrom
e running?" | |
48 } | |
49 | |
50 local ITERATION=0 | |
51 while true; do | |
52 # Chrome logs two different messages related to tracing: | |
53 # | |
54 # 1. "Logging performance trace to file [...]" | |
55 # 2. "Profiler finished. Results are in [...]" | |
56 # | |
57 # The first one is printed when tracing starts and the second one indicates | |
58 # that the trace file is ready to be downloaded. | |
59 # | |
60 # We have to look for both of these messages to make sure we get the results | |
61 # from the latest trace and that the trace file is complete. This is done by | |
62 # first looking for the last instance of the first message and then checking | |
63 # for the second message in the remaining part of the log. | |
64 TRACE_FILE=$(adb logcat -d | \ | |
65 tac | \ | |
66 grep --max-count=1 --before-context=100000 "Logging performance trace to
file" | \ | |
67 tac | \ | |
68 grep "Profiler finished[.] Results are in " | \ | |
69 perl -pi -e "s{.*/storage/emulated/.+/([^\r]+)[.].*}{/sdcard/Download/\\
1}g") | |
70 if [ -n "$TRACE_FILE" ]; then | |
71 break | |
72 fi | |
73 if [ $ITERATION -eq 0 ]; then | |
74 echo -n "Waiting for Chrome to finish tracing..." | |
75 else | |
76 echo -n "." | |
77 fi | |
78 let ITERATION=ITERATION+1 | |
79 if [ $ITERATION -eq 60 ]; then | |
80 echo "Timed out" | |
81 exit 1 | |
82 fi | |
83 sleep 1 | |
84 done | |
85 | |
86 adb pull $TRACE_FILE 2> /dev/null | |
87 LOCAL_TRACE_FILE=$(basename $TRACE_FILE) | |
88 if [ ! -f "$LOCAL_TRACE_FILE" ]; then | |
89 echo "Unable to download trace file" | |
90 exit 1 | |
91 fi | |
92 } | |
93 | |
94 do_timed_capture() { | |
95 local PACKAGE=$1 | |
96 local INTERVAL=$2 | |
97 shift | |
98 shift | |
99 echo -n "Capturing trace..." | |
100 send_intent ${PACKAGE} "GPU_PROFILER_START" $* > /dev/null | |
101 sleep ${INTERVAL} | |
102 send_intent ${PACKAGE} "GPU_PROFILER_STOP" > /dev/null | |
103 echo "done" | |
104 | |
105 echo -n "Downloading trace..." | |
106 sleep $[${INTERVAL} / 4 + 1] | |
107 download_latest_trace | |
108 echo "done" | |
109 | |
110 echo "Trace written to ${PWD}/${LOCAL_TRACE_FILE}" | |
111 } | |
112 | |
113 PACKAGE=${DEFAULT_PACKAGE:-com.android.chrome} | |
114 | |
115 while test -n "$1"; do | |
116 case "$1" in | |
117 -v|--version) | |
118 if [[ -z "$2" ]] ; then | |
119 usage | |
120 fi | |
121 shift | |
122 case "$1" in | |
123 stable) PACKAGE="com.android.chrome" ;; | |
124 beta) PACKAGE="com.chrome.beta" ;; | |
125 dev) PACKAGE="com.google.android.apps.chrome_dev" ;; | |
126 build) PACKAGE="com.google.android.apps.chrome" ;; | |
127 *) usage ;; | |
128 esac | |
129 ;; | |
130 --start) FUNCTION="GPU_PROFILER_START" ;; | |
131 --stop) FUNCTION="GPU_PROFILER_STOP" ;; | |
132 -o|--output) | |
133 if [ -z "$2" ] ; then | |
134 usage | |
135 fi | |
136 OUTPUT="-e file '$2'" | |
137 shift | |
138 ;; | |
139 -c|--categories) | |
140 if [ -z "$2" ]; then | |
141 usage | |
142 fi | |
143 CATEGORIES="-e categories '$2'" | |
144 shift | |
145 ;; | |
146 --continuous) CONTINUOUS="-e continuous ." ;; | |
147 -t|--time) | |
148 shift | |
149 if [ -z "$1" ] ; then | |
150 usage | |
151 fi | |
152 INTERVAL="$1" | |
153 ;; | |
154 -d|--download) | |
155 shift | |
156 download_latest_trace | |
157 echo "Trace written to ${PWD}/${LOCAL_TRACE_FILE}" | |
158 ;; | |
159 *) usage ;; | |
160 esac | |
161 shift | |
162 done | |
163 | |
164 if [ -z "${INTERVAL}" ] ; then | |
165 if [ -z "${FUNCTION}" ] ; then | |
166 usage | |
167 else | |
168 send_intent ${PACKAGE} ${FUNCTION} ${OUTPUT} ${CATEGORIES} ${CONTINUOUS} | |
169 fi | |
170 else | |
171 do_timed_capture ${PACKAGE} ${INTERVAL} ${CATEGORIES} ${CONTINUOUS} | |
172 fi | |
173 exit 0 | |
OLD | NEW |