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