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/libGLESv2.so $TMP_SYS_LIB
46    adb_pull_if_needed /system/lib/libandroid.so $TMP_SYS_LIB
47    adb_pull_if_needed /system/lib/libm.so $TMP_SYS_LIB
48    adb_pull_if_needed /system/lib/libz.so $TMP_SYS_LIB
49
50    # BUILDTYPE variable is set by android_setup.sh
51    BUILDDIR="${SKIA_OUT}/${BUILDTYPE}"
52    if [ ! -f "${BUILDDIR}/lib/lib${runVars[0]}.so" ];
53    then
54      echo "Unable to find the ${runVars[0]} library in ${BUILDDIR}/lib."
55      exit 1
56    fi
57
58    echo "Pushing app..."
59    for lib_file in \
60        "${BUILDDIR}/skia_launcher" \
61        "${BUILDDIR}/lib/libskia_android.so" \
62        "${BUILDDIR}/lib/lib${runVars[0]}.so" \
63      ; do
64      adb_push_if_needed "$lib_file" /data/local/tmp
65      cp "$lib_file" $TMP_APP_LOC
66    done
67}
68
69perf_record() {
70
71    echo "Killing any running Skia processes."
72    $ADB shell ps | grep skia_launcher | awk '{print $2}' | xargs $ADB shell kill
73
74    echo "Starting application"
75    $ADB shell /data/local/tmp/skia_launcher ${runVars[@]} &
76
77    # WE REALLY REALLY WANT TO BE ABLE TO PASS THE SKIA_LAUNCHER APP DIRECTLY TO
78    # PERF, BUT AT THIS POINT THE DATA FILE WE GET WHEN GOING THAT ROUTE IS UNABLE
79    # TO BE READ BY THE REPORTING TOOL
80    echo "Starting profiler"
81    APP_PID=$($ADB shell ps | grep skia_launcher | awk '{print $2}')
82    $ADB shell perf record -p ${APP_PID} sleep 70
83
84    $ADB pull /data/perf.data $PERF_TMP_DIR/perf.data
85
86    exit 0;
87}
88
89perf_report() {
90    adb_pull_if_needed /data/perf.data $PERF_TMP_DIR/perf.data
91    $PERFHOST report -i $PERF_TMP_DIR/perf.data --symfs=$PERF_TMP_DIR ${runVars[@]}
92}
93
94# Clean up
95perf_clean() {
96    rm -rf $PERF_TMP_DIR
97}
98
99case $PERF_CMD in
100  setup)
101      perf_setup ${runVars[@]}
102      ;;
103  record)
104      perf_setup ${runVars[@]}
105      perf_record ${runVars[@]}
106      ;;
107  report)
108      perf_report
109      ;;
110  clean)
111      perf_clean
112      ;;
113    *)
114      echo -n "ERROR: unknown perf command ($PERF_CMD), valid values: "
115      echo "setup, record, report, clean"
116      exit 1;
117      ;;
118esac
119
120exit 0;
121