#!/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/libstdc++.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;