1#!/bin/bash 2# 3# android_perf: utility for running perf on an android device 4# 5# The basic usage sequence is to run... 6# 1) perf record [gm/tests/bench] # runs profiler on specified app 7# 2) perf report # prints profiler results 8# 3) perf clean # cleans the temporary directory used to store results 9# 10 11SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" 12source $SCRIPT_DIR/utils/android_setup.sh 13source $SCRIPT_DIR/utils/setup_adb.sh 14 15# grab and remove the perf command from the input args 16PERF_CMD=${APP_ARGS[0]} 17unset APP_ARGS[0] 18runVars=("${APP_ARGS[@]}") # shift array indices 19 20# We need the debug symbols from these files 21PERF_TMP_DIR=$(pwd)/android_perf_tmp 22 23TMP_SYS_BIN=$PERF_TMP_DIR/system/bin 24TMP_SYS_LIB=$PERF_TMP_DIR/system/lib 25TMP_APP_LOC=$PERF_TMP_DIR/data/local/tmp 26 27perf_setup() { 28 29 mkdir -p $TMP_SYS_BIN 30 mkdir -p $TMP_SYS_LIB 31 mkdir -p $TMP_APP_LOC 32 33 echo "Copying symbol files" 34 adb_pull_if_needed /system/lib/libc.so $TMP_SYS_LIB 35 adb_pull_if_needed /system/lib/libstdc++.so $TMP_SYS_LIB 36 adb_pull_if_needed /system/lib/libGLESv2.so $TMP_SYS_LIB 37 adb_pull_if_needed /system/lib/libandroid.so $TMP_SYS_LIB 38 adb_pull_if_needed /system/lib/libm.so $TMP_SYS_LIB 39 adb_pull_if_needed /system/lib/libz.so $TMP_SYS_LIB 40 41 # BUILDTYPE variable is set by android_setup.sh 42 if [ ! -f "${SKIA_OUT}/${runVars[0]}" ]; 43 then 44 echo "Unable to find the ${runVars[0]} executable" 45 exit 1 46 fi 47 48 echo "Pushing simpleperf..." 49 adb_push_if_needed $SKIA_OUT/simpleperf /data/local/tmp 50 51 echo "Pushing app..." 52 adb_push_if_needed "${SKIA_OUT}/${runVars[0]}" /data/local/tmp 53 cp "${SKIA_OUT}/${runVars[0]}" $TMP_APP_LOC 54} 55 56perf_record() { 57 58 echo "Killing any running Skia processes." 59 $ADB shell ps | grep ${runVars[0]} | awk '{print $2}' | xargs $ADB shell kill 60 61 echo "Starting application" 62 $ADB shell /data/local/tmp/${runVars[@]} & 63 64 # WE REALLY REALLY WANT TO BE ABLE TO PASS THE SKIA_LAUNCHER APP DIRECTLY TO 65 # PERF, BUT AT THIS POINT THE DATA FILE WE GET WHEN GOING THAT ROUTE IS UNABLE 66 # TO BE READ BY THE REPORTING TOOL 67 echo "Starting profiler" 68 APP_PID=$($ADB shell ps | grep ${runVars[0]} | awk '{print $2}') 69 $ADB shell /data/local/tmp/simpleperf record -p ${APP_PID} -o /data/local/tmp/perf.data sleep 70 70 71 $ADB pull /data/local/tmp/perf.data $PERF_TMP_DIR/perf.data 72 73 exit 0; 74} 75 76perf_report() { 77 adb_pull_if_needed /data/local/tmp/perf.data $PERF_TMP_DIR/perf.data 78 $SKIA_OUT/perfhost_report.py -i $PERF_TMP_DIR/perf.data --symfs=$PERF_TMP_DIR ${runVars[@]} 79} 80 81# Clean up 82perf_clean() { 83 rm -rf $PERF_TMP_DIR 84} 85 86case $PERF_CMD in 87 setup) 88 perf_setup ${runVars[@]} 89 ;; 90 record) 91 perf_setup ${runVars[@]} 92 perf_record ${runVars[@]} 93 ;; 94 report) 95 perf_report 96 ;; 97 clean) 98 perf_clean 99 ;; 100 *) 101 echo -n "ERROR: unknown perf command ($PERF_CMD), valid values: " 102 echo "setup, record, report, clean" 103 exit 1; 104 ;; 105esac 106 107exit 0; 108