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