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