android_perf revision e8846f3d3fbb84e96ea049459377af9b2b1faba6
1#!/bin/bash
2#
3# android_perf: utility for running perf on an android device
4# 
5# The basic usage sequence is to run...
6#  1) perf record [gm/tests/bench] # runs profiler on specified app
7#  2) perf report # prints profiler results
8#  3) perf clean # cleans the temporary directory used to store results
9#
10
11SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
12source $SCRIPT_DIR/android_setup.sh
13source $SCRIPT_DIR/utils/setup_adb.sh
14
15if [ $(uname) == "Linux" ]; then
16    PERFHOST=$SCRIPT_DIR/linux/perfhost
17elif [ $(uname) == "Darwin" ]; then
18    PERFHOST=$SCRIPT_DIR/mac/perfhost
19else
20    echo "Could not automatically determine OS!"
21    exit 1;
22fi
23
24# grab and remove the perf command from the input args
25PERF_CMD=${APP_ARGS[0]}
26unset APP_ARGS[0]
27runVars=("${APP_ARGS[@]}")  # shift array indices
28
29# We need the debug symbols from these files
30PERF_TMP_DIR=$(pwd)/android_perf_tmp
31
32TMP_SYS_BIN=$PERF_TMP_DIR/system/bin
33TMP_SYS_LIB=$PERF_TMP_DIR/system/lib
34TMP_APP_LOC=$PERF_TMP_DIR/data/local/tmp
35
36perf_setup() {
37
38    mkdir -p $TMP_SYS_BIN
39    mkdir -p $TMP_SYS_LIB
40    mkdir -p $TMP_APP_LOC
41
42    echo "Copying symbol files"
43    adb_pull_if_needed /system/lib/libc.so $TMP_SYS_LIB
44    adb_pull_if_needed /system/lib/libstlport.so $TMP_SYS_LIB
45    adb_pull_if_needed /system/lib/libcutils.so $TMP_SYS_LIB
46    adb_pull_if_needed /system/lib/libGLESv2.so $TMP_SYS_LIB
47    adb_pull_if_needed /system/lib/libandroid.so $TMP_SYS_LIB
48    adb_pull_if_needed /system/lib/libm.so $TMP_SYS_LIB
49    adb_pull_if_needed /system/lib/libz.so $TMP_SYS_LIB
50
51    # BUILDTYPE variable is set by android_setup.sh
52    BUILDDIR="${SKIA_OUT}/${BUILDTYPE}"
53    if [ ! -f "${BUILDDIR}/lib/lib${runVars[0]}.so" ];
54    then
55      echo "Unable to find the ${runVars[0]} library in ${BUILDDIR}/lib."
56      exit 1
57    fi
58
59    echo "Pushing app..."
60    for lib_file in \
61        "${BUILDDIR}/skia_launcher" \
62        "${BUILDDIR}/lib/libskia_android.so" \
63        "${BUILDDIR}/lib/lib${runVars[0]}.so" \
64      ; do
65      adb_push_if_needed "$lib_file" /data/local/tmp
66      cp "$lib_file" $TMP_APP_LOC
67    done
68}
69
70perf_record() {
71
72    echo "Killing any running Skia processes."
73    $ADB shell ps | grep skia_launcher | awk '{print $2}' | xargs $ADB shell kill
74
75    echo "Starting application"
76    $ADB shell /data/local/tmp/skia_launcher ${runVars[@]} &
77
78    # WE REALLY REALLY WANT TO BE ABLE TO PASS THE SKIA_LAUNCHER APP DIRECTLY TO
79    # PERF, BUT AT THIS POINT THE DATA FILE WE GET WHEN GOING THAT ROUTE IS UNABLE
80    # TO BE READ BY THE REPORTING TOOL
81    echo "Starting profiler"
82    APP_PID=$($ADB shell ps | grep skia_launcher | awk '{print $2}')
83    $ADB shell perf record -p ${APP_PID} sleep 70
84
85    $ADB pull /data/perf.data $PERF_TMP_DIR/perf.data
86
87    exit 0;
88}
89
90perf_report() {
91    adb_pull_if_needed /data/perf.data $PERF_TMP_DIR/perf.data
92    $PERFHOST report -i $PERF_TMP_DIR/perf.data --symfs=$PERF_TMP_DIR ${runVars[@]}
93}
94
95# Clean up
96perf_clean() {
97    rm -rf $PERF_TMP_DIR
98}
99
100case $PERF_CMD in
101  setup)
102      perf_setup ${runVars[@]}
103      ;;
104  record)
105      perf_setup ${runVars[@]}
106      perf_record ${runVars[@]}
107      ;;
108  report)
109      perf_report
110      ;;
111  clean)
112      perf_clean
113      ;;
114    *)
115      echo -n "ERROR: unknown perf command ($PERF_CMD), valid values: "
116      echo "setup, record, report, clean"
117      exit 1;
118      ;;
119esac
120
121exit 0;
122