| #!/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/android_setup.sh | |
| source $SCRIPT_DIR/utils/setup_adb.sh | |
| if [ $(uname) == "Linux" ]; then | |
| PERFHOST=$SCRIPT_DIR/linux/perfhost | |
| elif [ $(uname) == "Darwin" ]; then | |
| PERFHOST=$SCRIPT_DIR/mac/perfhost | |
| else | |
| echo "Could not automatically determine OS!" | |
| exit 1; | |
| fi | |
| # 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/libc++.so $TMP_SYS_LIB | |
| adb_pull_if_needed /system/lib/libstlport.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 | |
| # BUILDTYPE variable is set by android_setup.sh | |
| BUILDDIR="${SKIA_OUT}/${BUILDTYPE}" | |
| if [ ! -f "${BUILDDIR}/lib/lib${runVars[0]}.so" ]; | |
| then | |
| echo "Unable to find the ${runVars[0]} library in ${BUILDDIR}/lib." | |
| exit 1 | |
| fi | |
| echo "Pushing app..." | |
| for lib_file in \ | |
| "${BUILDDIR}/skia_launcher" \ | |
| "${BUILDDIR}/lib/libskia_android.so" \ | |
| "${BUILDDIR}/lib/lib${runVars[0]}.so" \ | |
| ; do | |
| adb_push_if_needed "$lib_file" /data/local/tmp | |
| cp "$lib_file" $TMP_APP_LOC | |
| done | |
| } | |
| perf_record() { | |
| echo "Killing any running Skia processes." | |
| $ADB shell ps | grep skia_launcher | awk '{print $2}' | xargs $ADB shell kill | |
| echo "Starting application" | |
| $ADB shell /data/local/tmp/skia_launcher ${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 skia_launcher | awk '{print $2}') | |
| $ADB shell perf record -p ${APP_PID} sleep 70 | |
| $ADB pull /data/perf.data $PERF_TMP_DIR/perf.data | |
| exit 0; | |
| } | |
| perf_report() { | |
| adb_pull_if_needed /data/perf.data $PERF_TMP_DIR/perf.data | |
| $PERFHOST report -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; |