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 11 SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" 12 source $SCRIPT_DIR/utils/android_setup.sh 13 source $SCRIPT_DIR/utils/setup_adb.sh 14 15 # grab and remove the perf command from the input args 16 PERF_CMD=${APP_ARGS[0]} 17 unset APP_ARGS[0] 18 runVars=("${APP_ARGS[@]}") # shift array indices 19 20 # We need the debug symbols from these files 21 PERF_TMP_DIR=$(pwd)/android_perf_tmp 22 23 TMP_SYS_BIN=$PERF_TMP_DIR/system/bin 24 TMP_SYS_LIB=$PERF_TMP_DIR/system/lib 25 TMP_APP_LOC=$PERF_TMP_DIR/data/local/tmp 26 27 perf_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 # SKIA_OUT 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 56 perf_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 76 perf_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 82 perf_clean() { 83 rm -rf $PERF_TMP_DIR 84 } 85 86 case $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 ;; 105 esac 106 107 exit 0; 108