1eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#!/bin/bash
2eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#
3eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch# Copyright 2013 The Chromium Authors. All rights reserved.
4eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch# Use of this source code is governed by a BSD-style license that can be
5eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch# found in the LICENSE file.
6eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#
7eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch# Start / stop profiling in chrome.
8eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
9eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch# The profiling data is saved to directory /sdcard/Download. The files
10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch# are named beginning chrome-profile-results-
11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#
12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch# Assumes you have sourced the android build environment script
13eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch# (e.g. 'adb' is on your path).
14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochset -e
15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochusage() {
17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  echo "adb_profile_chrome [--start [-o file] [-c C]|--stop|-d|-t N] [-v N]"
18eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  echo "See http://dev.chromium.org/developers/how-tos/trace-event-profiling-tool for detailed instructions on profiling."
19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  echo ""
20eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  echo "  --start            Start profiling."
21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  echo "  --output|-o file   Save profile output to file. "
22eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  echo "                     (Default is /sdcard/Download/chrome-profile-results-*)"
23eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  echo "  --categories|-c C  Select categories to trace with comma-delimited wildcards."
24eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  echo "                     e.g. '*', 'cat1*,-cat1a'. Default is '*'."
25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  echo "  --stop             Stop profiling."
26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  echo "  --download|-d      Download latest trace."
27eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  echo "  --time|-t N        Profile for N seconds and download the resulting trace."
28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  echo "  --version|v N      Select among installed browsers."
29eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  echo "                     One of stable (default), beta, dev, build"
30eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  echo ""
31eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  echo "Profiling data is saved to the device."
32eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  exit 0
33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
35eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochsend_intent() {
36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  local PACKAGE=$1
37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  local INTENT=$2
38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  shift
39eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  shift
40eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  adb shell am broadcast -a $PACKAGE.$INTENT $*
41eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochdownload_latest_trace() {
44eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  TRACE_FILE=$(adb logcat -d | \
45eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      grep "Logging performance trace to file: " | \
46eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      tail -1 | \
47bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      perl -pi -e "s/.*\/storage\/emulated\/.+\/([^\r]+).*/\/sdcard\/Download\/\\1/g")
48eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if [ -z "$TRACE_FILE" ]; then
49eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    echo "Unable to determine trace file name"
50eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    exit 1
51eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  fi
52eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
53eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  adb pull $TRACE_FILE 2> /dev/null
54eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  LOCAL_TRACE_FILE=$(basename $TRACE_FILE)
55eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if [ ! -f "$LOCAL_TRACE_FILE" ]; then
56eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    echo "Unable to download trace file"
57eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    exit 1
58eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  fi
59eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
60eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
61eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochdo_timed_capture() {
62eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  local PACKAGE=$1
63eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  local INTERVAL=$2
64eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  shift
65eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  shift
66eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  echo -n "Capturing trace..."
67eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  send_intent ${PACKAGE} "GPU_PROFILER_START" $* > /dev/null
68eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  sleep ${INTERVAL}
69eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  send_intent ${PACKAGE} "GPU_PROFILER_STOP" > /dev/null
70eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  echo "done"
71eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
72eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  echo -n "Downloading trace..."
73eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  sleep $[${INTERVAL} / 4 + 1]
74eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  download_latest_trace
75eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  echo "done"
76eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
77eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  echo "Trace written to ${PWD}/${LOCAL_TRACE_FILE}"
78eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
79eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
80eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochPACKAGE=${DEFAULT_PACKAGE:-com.android.chrome}
81eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
82eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochwhile test -n "$1"; do
83eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  case "$1" in
84eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    -v|--version)
85eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      if [[ -z "$2" ]] ; then
86eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        usage
87eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      fi
88eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      shift
89eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      case "$1" in
90eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        stable) PACKAGE="com.android.chrome" ;;
91eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        beta) PACKAGE="com.chrome.beta" ;;
92eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        dev) PACKAGE="com.google.android.apps.chrome_dev" ;;
93eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        build) PACKAGE="com.google.android.apps.chrome" ;;
94eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        *) usage ;;
95eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      esac
96eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      ;;
97eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    --start) FUNCTION="GPU_PROFILER_START" ;;
98eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    --stop) FUNCTION="GPU_PROFILER_STOP" ;;
99eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    -o|--output)
100eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      if [ -z "$2" ] ; then
101eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        usage
102eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      fi
103eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      OUTPUT="-e file '$2'"
104eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      shift
105eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      ;;
106eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    -c|--categories)
107eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      if [ -z "$2" ]; then
108eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        usage
109eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      fi
110eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      CATEGORIES="-e categories '$2'"
111eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      shift
112eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      ;;
113eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    -t|--time)
114eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      shift
115eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      if [ -z "$1" ] ; then
116eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        usage
117eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      fi
118eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      INTERVAL="$1"
119eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      ;;
120eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    -d|--download)
121eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      shift
122eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      download_latest_trace
123eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      echo "Trace written to ${PWD}/${LOCAL_TRACE_FILE}"
124eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      ;;
125eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    *) usage ;;
126eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  esac
127eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  shift
128eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochdone
129eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
130eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochif [ -z "${INTERVAL}" ] ; then
131eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if [ -z "${FUNCTION}" ] ; then
132eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    usage
133eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  else
134eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    send_intent ${PACKAGE} ${FUNCTION} ${OUTPUT} ${CATEGORIES}
135eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  fi
136eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochelse
137eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  do_timed_capture ${PACKAGE} ${INTERVAL} ${CATEGORIES}
138eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochfi
139eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochexit 0
140