108 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			108 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
#!/bin/bash
 | 
						|
#
 | 
						|
# android_perf: utility for running perf on an android device
 | 
						|
#
 | 
						|
# The basic usage sequence is to run...
 | 
						|
#  1) perf record [gm/tests/bench] # runs profiler on specified app
 | 
						|
#  2) perf report # prints profiler results
 | 
						|
#  3) perf clean # cleans the temporary directory used to store results
 | 
						|
#
 | 
						|
 | 
						|
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
 | 
						|
source $SCRIPT_DIR/utils/android_setup.sh
 | 
						|
source $SCRIPT_DIR/utils/setup_adb.sh
 | 
						|
 | 
						|
# grab and remove the perf command from the input args
 | 
						|
PERF_CMD=${APP_ARGS[0]}
 | 
						|
unset APP_ARGS[0]
 | 
						|
runVars=("${APP_ARGS[@]}")  # shift array indices
 | 
						|
 | 
						|
# We need the debug symbols from these files
 | 
						|
PERF_TMP_DIR=$(pwd)/android_perf_tmp
 | 
						|
 | 
						|
TMP_SYS_BIN=$PERF_TMP_DIR/system/bin
 | 
						|
TMP_SYS_LIB=$PERF_TMP_DIR/system/lib
 | 
						|
TMP_APP_LOC=$PERF_TMP_DIR/data/local/tmp
 | 
						|
 | 
						|
perf_setup() {
 | 
						|
 | 
						|
    mkdir -p $TMP_SYS_BIN
 | 
						|
    mkdir -p $TMP_SYS_LIB
 | 
						|
    mkdir -p $TMP_APP_LOC
 | 
						|
 | 
						|
    echo "Copying symbol files"
 | 
						|
    adb_pull_if_needed /system/lib/libc.so $TMP_SYS_LIB
 | 
						|
    adb_pull_if_needed /system/lib/libstdc++.so $TMP_SYS_LIB
 | 
						|
    adb_pull_if_needed /system/lib/libGLESv2.so $TMP_SYS_LIB
 | 
						|
    adb_pull_if_needed /system/lib/libandroid.so $TMP_SYS_LIB
 | 
						|
    adb_pull_if_needed /system/lib/libm.so $TMP_SYS_LIB
 | 
						|
    adb_pull_if_needed /system/lib/libz.so $TMP_SYS_LIB
 | 
						|
 | 
						|
    # SKIA_OUT variable is set by android_setup.sh
 | 
						|
    if [ ! -f "${SKIA_OUT}/${runVars[0]}" ];
 | 
						|
    then
 | 
						|
      echo "Unable to find the ${runVars[0]} executable"
 | 
						|
      exit 1
 | 
						|
    fi
 | 
						|
 | 
						|
    echo "Pushing simpleperf..."
 | 
						|
    adb_push_if_needed $SKIA_OUT/simpleperf /data/local/tmp
 | 
						|
 | 
						|
    echo "Pushing app..."
 | 
						|
    adb_push_if_needed "${SKIA_OUT}/${runVars[0]}" /data/local/tmp
 | 
						|
    cp "${SKIA_OUT}/${runVars[0]}" $TMP_APP_LOC
 | 
						|
}
 | 
						|
 | 
						|
perf_record() {
 | 
						|
 | 
						|
    echo "Killing any running Skia processes."
 | 
						|
    $ADB shell ps | grep ${runVars[0]} | awk '{print $2}' | xargs $ADB shell kill
 | 
						|
 | 
						|
    echo "Starting application"
 | 
						|
    $ADB shell /data/local/tmp/${runVars[@]} &
 | 
						|
 | 
						|
    # WE REALLY REALLY WANT TO BE ABLE TO PASS THE SKIA_LAUNCHER APP DIRECTLY TO
 | 
						|
    # PERF, BUT AT THIS POINT THE DATA FILE WE GET WHEN GOING THAT ROUTE IS UNABLE
 | 
						|
    # TO BE READ BY THE REPORTING TOOL
 | 
						|
    echo "Starting profiler"
 | 
						|
    APP_PID=$($ADB shell ps | grep ${runVars[0]} | awk '{print $2}')
 | 
						|
    $ADB shell /data/local/tmp/simpleperf record -p ${APP_PID} -o /data/local/tmp/perf.data sleep 70
 | 
						|
 | 
						|
    $ADB pull /data/local/tmp/perf.data $PERF_TMP_DIR/perf.data
 | 
						|
 | 
						|
    exit 0;
 | 
						|
}
 | 
						|
 | 
						|
perf_report() {
 | 
						|
    adb_pull_if_needed /data/local/tmp/perf.data $PERF_TMP_DIR/perf.data
 | 
						|
    $SKIA_OUT/perfhost_report.py -i $PERF_TMP_DIR/perf.data --symfs=$PERF_TMP_DIR ${runVars[@]}
 | 
						|
}
 | 
						|
 | 
						|
# Clean up
 | 
						|
perf_clean() {
 | 
						|
    rm -rf $PERF_TMP_DIR
 | 
						|
}
 | 
						|
 | 
						|
case $PERF_CMD in
 | 
						|
  setup)
 | 
						|
      perf_setup ${runVars[@]}
 | 
						|
      ;;
 | 
						|
  record)
 | 
						|
      perf_setup ${runVars[@]}
 | 
						|
      perf_record ${runVars[@]}
 | 
						|
      ;;
 | 
						|
  report)
 | 
						|
      perf_report
 | 
						|
      ;;
 | 
						|
  clean)
 | 
						|
      perf_clean
 | 
						|
      ;;
 | 
						|
    *)
 | 
						|
      echo -n "ERROR: unknown perf command ($PERF_CMD), valid values: "
 | 
						|
      echo "setup, record, report, clean"
 | 
						|
      exit 1;
 | 
						|
      ;;
 | 
						|
esac
 | 
						|
 | 
						|
exit 0;
 |