android_perf revision cc95b1aeb8cbb9201712c9982d12149b0e0027f0
1dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com#!/bin/bash 2dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com# 3dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com# android_perf: utility for running perf on an android device 4dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com# 5dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com# The basic usage sequence is to run... 6dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com# 1) perf record [gm/tests/bench] # runs profiler on specified app 7dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com# 2) perf report # prints profiler results 8dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com# 3) perf clean # cleans the temporary directory used to store results 9dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com# 10dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com 11dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.comSCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" 12cc95b1aeb8cbb9201712c9982d12149b0e0027f0djsollen@google.comsource $SCRIPT_DIR/android_setup.sh 13dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.comsource $SCRIPT_DIR/utils/setup_adb.sh 14dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com 15dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.comif [ $(uname) == "Linux" ]; then 16dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com PERFHOST=$SCRIPT_DIR/linux/perfhost 17dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.comelif [ $(uname) == "Darwin" ]; then 18dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com PERFHOST=$SCRIPT_DIR/mac/perfhost 19dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.comelse 20dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com echo "Could not automatically determine OS!" 21dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com exit 1; 22dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.comfi 23dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com 24cc95b1aeb8cbb9201712c9982d12149b0e0027f0djsollen@google.com# grab and remove the perf command from the input args 25cc95b1aeb8cbb9201712c9982d12149b0e0027f0djsollen@google.comPERF_CMD=${APP_ARGS[0]} 26cc95b1aeb8cbb9201712c9982d12149b0e0027f0djsollen@google.comunset APP_ARGS[0] 27cc95b1aeb8cbb9201712c9982d12149b0e0027f0djsollen@google.com 28cc95b1aeb8cbb9201712c9982d12149b0e0027f0djsollen@google.comconfiguration="Debug" 29cc95b1aeb8cbb9201712c9982d12149b0e0027f0djsollen@google.com 30cc95b1aeb8cbb9201712c9982d12149b0e0027f0djsollen@google.comfor arg in ${APP_ARGS[@]} 31cc95b1aeb8cbb9201712c9982d12149b0e0027f0djsollen@google.comdo 32cc95b1aeb8cbb9201712c9982d12149b0e0027f0djsollen@google.com if [[ "${arg}" == "--release" ]]; 33cc95b1aeb8cbb9201712c9982d12149b0e0027f0djsollen@google.com then 34cc95b1aeb8cbb9201712c9982d12149b0e0027f0djsollen@google.com configuration="Release" 35cc95b1aeb8cbb9201712c9982d12149b0e0027f0djsollen@google.com else 36cc95b1aeb8cbb9201712c9982d12149b0e0027f0djsollen@google.com echo "${arg}" 37cc95b1aeb8cbb9201712c9982d12149b0e0027f0djsollen@google.com runVars=("${runVars[@]}" "${arg}") 38cc95b1aeb8cbb9201712c9982d12149b0e0027f0djsollen@google.com fi 39cc95b1aeb8cbb9201712c9982d12149b0e0027f0djsollen@google.com 40cc95b1aeb8cbb9201712c9982d12149b0e0027f0djsollen@google.comshift 41cc95b1aeb8cbb9201712c9982d12149b0e0027f0djsollen@google.comdone 42cc95b1aeb8cbb9201712c9982d12149b0e0027f0djsollen@google.com 43dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com# We need the debug symbols from these files 44dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.comPERF_TMP_DIR=$(pwd)/android_perf_tmp 45dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com 46dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.comTMP_SYS_BIN=$PERF_TMP_DIR/system/bin 47dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.comTMP_SYS_LIB=$PERF_TMP_DIR/system/lib 48cc95b1aeb8cbb9201712c9982d12149b0e0027f0djsollen@google.comTMP_APP_LOC=$PERF_TMP_DIR/data/local/tmp 49dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com 50dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.comperf_setup() { 51dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com 52dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com mkdir -p $TMP_SYS_BIN 53dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com mkdir -p $TMP_SYS_LIB 54cc95b1aeb8cbb9201712c9982d12149b0e0027f0djsollen@google.com mkdir -p $TMP_APP_LOC 55dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com 56dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com echo "Copying symbol files" 57cc95b1aeb8cbb9201712c9982d12149b0e0027f0djsollen@google.com adb_pull_if_needed /system/lib/libc.so $TMP_SYS_LIB 58cc95b1aeb8cbb9201712c9982d12149b0e0027f0djsollen@google.com adb_pull_if_needed /system/lib/libstlport.so $TMP_SYS_LIB 59cc95b1aeb8cbb9201712c9982d12149b0e0027f0djsollen@google.com adb_pull_if_needed /system/lib/libcutils.so $TMP_SYS_LIB 60cc95b1aeb8cbb9201712c9982d12149b0e0027f0djsollen@google.com adb_pull_if_needed /system/lib/libGLESv2.so $TMP_SYS_LIB 61cc95b1aeb8cbb9201712c9982d12149b0e0027f0djsollen@google.com adb_pull_if_needed /system/lib/libandroid.so $TMP_SYS_LIB 62cc95b1aeb8cbb9201712c9982d12149b0e0027f0djsollen@google.com adb_pull_if_needed /system/lib/libm.so $TMP_SYS_LIB 63cc95b1aeb8cbb9201712c9982d12149b0e0027f0djsollen@google.com adb_pull_if_needed /system/lib/libz.so $TMP_SYS_LIB 64cc95b1aeb8cbb9201712c9982d12149b0e0027f0djsollen@google.com 65cc95b1aeb8cbb9201712c9982d12149b0e0027f0djsollen@google.com if [ ! -f "${SKIA_OUT}/${configuration}/lib.target/lib${runVars[0]}.so" ]; 66dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com then 67cc95b1aeb8cbb9201712c9982d12149b0e0027f0djsollen@google.com echo "Unable to find the ${runVars[0]} library" 68cc95b1aeb8cbb9201712c9982d12149b0e0027f0djsollen@google.com exit 1 69dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com fi 70dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com 71cc95b1aeb8cbb9201712c9982d12149b0e0027f0djsollen@google.com echo "Pushing app..." 72cc95b1aeb8cbb9201712c9982d12149b0e0027f0djsollen@google.com adb_push_if_needed "${SKIA_OUT}/${configuration}/skia_launcher" /data/local/tmp 73cc95b1aeb8cbb9201712c9982d12149b0e0027f0djsollen@google.com adb_push_if_needed "${SKIA_OUT}/${configuration}/lib.target/libskia_android.so" /data/local/tmp 74cc95b1aeb8cbb9201712c9982d12149b0e0027f0djsollen@google.com adb_push_if_needed "${SKIA_OUT}/${configuration}/lib.target/lib${runVars[0]}.so" /data/local/tmp 75cc95b1aeb8cbb9201712c9982d12149b0e0027f0djsollen@google.com 76cc95b1aeb8cbb9201712c9982d12149b0e0027f0djsollen@google.com cp "${SKIA_OUT}/${configuration}/skia_launcher" $TMP_APP_LOC 77cc95b1aeb8cbb9201712c9982d12149b0e0027f0djsollen@google.com cp "${SKIA_OUT}/${configuration}/lib.target/libskia_android.so" $TMP_APP_LOC 78cc95b1aeb8cbb9201712c9982d12149b0e0027f0djsollen@google.com cp "${SKIA_OUT}/${configuration}/lib.target/lib${runVars[0]}.so" $TMP_APP_LOC 79dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com} 80dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com 81dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.comperf_record() { 82dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com 83dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com echo "Killing any running Skia processes." 84dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com $ADB shell ps | grep skia_launcher | awk '{print $2}' | xargs $ADB shell kill 85dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com 86dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com echo "Starting application" 87cc95b1aeb8cbb9201712c9982d12149b0e0027f0djsollen@google.com $ADB shell /data/local/tmp/skia_launcher ${runVars[@]} & 88dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com 89dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com # WE REALLY REALLY WANT TO BE ABLE TO PASS THE SKIA_LAUNCHER APP DIRECTLY TO 90dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com # PERF, BUT AT THIS POINT THE DATA FILE WE GET WHEN GOING THAT ROUTE IS UNABLE 91dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com # TO BE READ BY THE REPORTING TOOL 92dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com echo "Starting profiler" 93dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com APP_PID=$($ADB shell ps | grep skia_launcher | awk '{print $2}') 94dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com $ADB shell perf record -p ${APP_PID} sleep 70 95dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com 96dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com $ADB pull /data/perf.data $PERF_TMP_DIR/perf.data 97dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com 98dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com exit 0; 99dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com} 100dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com 101dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.comperf_report() { 102cc95b1aeb8cbb9201712c9982d12149b0e0027f0djsollen@google.com adb_pull_if_needed /data/perf.data $PERF_TMP_DIR/perf.data 103cc95b1aeb8cbb9201712c9982d12149b0e0027f0djsollen@google.com $PERFHOST report -i $PERF_TMP_DIR/perf.data --symfs=$PERF_TMP_DIR ${runVars[@]} 104dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com} 105dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com 106dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com# Clean up 107dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.comperf_clean() { 108dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com rm -rf $PERF_TMP_DIR 109dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com} 110dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com 111dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.comcase $PERF_CMD in 112dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com setup) 113cc95b1aeb8cbb9201712c9982d12149b0e0027f0djsollen@google.com perf_setup ${runVars[@]} 114dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com ;; 115dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com record) 116cc95b1aeb8cbb9201712c9982d12149b0e0027f0djsollen@google.com perf_setup ${runVars[@]} 117cc95b1aeb8cbb9201712c9982d12149b0e0027f0djsollen@google.com perf_record ${runVars[@]} 118dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com ;; 119dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com report) 120dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com perf_report 121dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com ;; 122dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com clean) 123dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com perf_clean 124dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com ;; 125dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com *) 126dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com echo -n "ERROR: unknown perf command ($PERF_CMD), valid values: " 127dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com echo "setup, record, report, clean" 128dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com exit 1; 129dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com ;; 130dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.comesac 131dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com 132dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.comexit 0; 133