skia2/platform_tools/android/bin/android_perf
djsollen@google.com dcdd57faf0 Copy the top level Android directory into trunk.
This CL is the first step in a series needed to move the
android directory into trunk. After the copy we will update
GYP and DEPS to point to the new location and only then
remove the original directory.

git-svn-id: http://skia.googlecode.com/svn/trunk@8891 2bbb7eff-a529-9590-31e7-b0007b416f81
2013-04-29 12:09:31 +00:00

146 lines
3.7 KiB
Bash

#!/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 )"
PERF_CMD=$1
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
# 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_LIB=$PERF_TMP_DIR/data/data/com.skia/lib
perf_setup() {
mkdir -p $TMP_SYS_BIN
mkdir -p $TMP_SYS_LIB
mkdir -p $TMP_APP_LIB
# setup symlinks to account for perf potentially looking elsewhere
mkdir -p $PERF_TMP_DIR/data/app-lib
$( cd $PERF_TMP_DIR/data/app-lib && ln -s ../data/com.skia/lib com.skia-1)
$( cd $PERF_TMP_DIR/data/app-lib && ln -s ../data/com.skia/lib com.skia-2)
echo "Copying symbol files"
$ADB pull /system/bin/skia_launcher $TMP_SYS_BIN
$ADB pull /system/lib/libc.so $TMP_SYS_LIB
$ADB pull /system/lib/libstlport.so $TMP_SYS_LIB
$ADB pull /system/lib/libcutils.so $TMP_SYS_LIB
$ADB pull /system/lib/libGLESv2.so $TMP_SYS_LIB
$ADB pull /system/lib/libandroid.so $TMP_SYS_LIB
$ADB pull /system/lib/libm.so $TMP_SYS_LIB
$ADB pull /system/lib/libz.so $TMP_SYS_LIB
if [ $# -ge 2 ]
then
APP_NAME=$(basename $2)
$ADB pull /data/data/com.skia/lib/lib${APP_NAME}.so $TMP_APP_LIB
else
$ADB pull /data/data/com.skia/lib/ $TMP_APP_LIB
fi
}
perf_record() {
APP_NAME=$(basename $2)
# Collect extra arguments to be passed to the skia_launcher binary
shift # perf_cmd
shift # app_name
while (( "$#" )); do
APP_ARGS="$APP_ARGS $1"
shift
done
echo "Checking for skia_launcher app..."
if [ ! -f $TMP_SYS_BIN/skia_launcher ]
then
echo "Unable to find the skia_launcher on the device"
rm -rf $PERF_TMP_DIR
exit 1;
fi
echo "Checking for $APP_NAME library..."
if [ ! -f $TMP_APP_LIB/lib$APP_NAME.so ]
then
echo "Unable to find the app's shared library on the device"
rm -rf $PERF_TMP_DIR
exit 1;
fi
echo "Killing any running Skia processes."
$ADB shell ps | grep skia_launcher | awk '{print $2}' | xargs $ADB shell kill
echo "Starting application"
$ADB shell skia_launcher $APP_NAME $APP_ARGS &
# 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() {
# Collect extra arguments to be passed to the perfhost binary
while (( "$#" )); do
APP_ARGS="$APP_ARGS $1"
shift
done
$PERFHOST report -i $PERF_TMP_DIR/perf.data --symfs=$PERF_TMP_DIR $APP_ARGS
}
# Clean up
perf_clean() {
rm -rf $PERF_TMP_DIR
}
case $PERF_CMD in
setup)
perf_setup $@
;;
record)
perf_setup $@
perf_record $@
;;
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;