aboutsummaryrefslogtreecommitdiffhomepage
path: root/platform_tools/android/bin/android_perf
blob: 58e43202a44f272a4d1984382e0e3678e10fdb36 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
#!/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]

configuration="Debug"

for arg in ${APP_ARGS[@]}
do
  if [[ "${arg}" == "--release" ]];
  then 
    configuration="Release"
  else
    echo "${arg}"
    runVars=("${runVars[@]}" "${arg}")
  fi

shift
done

# 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/libstlport.so $TMP_SYS_LIB
    adb_pull_if_needed /system/lib/libcutils.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

    if [ ! -f "${SKIA_OUT}/${configuration}/lib.target/lib${runVars[0]}.so" ];
    then
      echo "Unable to find the ${runVars[0]} library"
      exit 1
    fi

    echo "Pushing app..."
    adb_push_if_needed "${SKIA_OUT}/${configuration}/skia_launcher" /data/local/tmp
    adb_push_if_needed "${SKIA_OUT}/${configuration}/lib.target/libskia_android.so" /data/local/tmp
    adb_push_if_needed "${SKIA_OUT}/${configuration}/lib.target/lib${runVars[0]}.so" /data/local/tmp

    cp "${SKIA_OUT}/${configuration}/skia_launcher" $TMP_APP_LOC
    cp "${SKIA_OUT}/${configuration}/lib.target/libskia_android.so" $TMP_APP_LOC
    cp "${SKIA_OUT}/${configuration}/lib.target/lib${runVars[0]}.so" $TMP_APP_LOC
}

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;