aboutsummaryrefslogtreecommitdiffhomepage
path: root/platform_tools/android/bin/android_perf
blob: 43285f044ed513483db0f66d5f17e7f76497b68a (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
#!/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/utils/android_setup.sh
source $SCRIPT_DIR/utils/setup_adb.sh

# grab and remove the perf command from the input args
PERF_CMD=${APP_ARGS[0]}
unset APP_ARGS[0]
runVars=("${APP_ARGS[@]}")  # shift array indices

# 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/libstdc++.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

    # SKIA_OUT variable is set by android_setup.sh
    if [ ! -f "${SKIA_OUT}/${runVars[0]}" ];
    then
      echo "Unable to find the ${runVars[0]} executable"
      exit 1
    fi

    echo "Pushing simpleperf..."
    adb_push_if_needed $SKIA_OUT/simpleperf /data/local/tmp

    echo "Pushing app..."
    adb_push_if_needed "${SKIA_OUT}/${runVars[0]}" /data/local/tmp
    cp "${SKIA_OUT}/${runVars[0]}" $TMP_APP_LOC
}

perf_record() {

    echo "Killing any running Skia processes."
    $ADB shell ps | grep ${runVars[0]} | awk '{print $2}' | xargs $ADB shell kill

    echo "Starting application"
    $ADB shell /data/local/tmp/${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 ${runVars[0]} | awk '{print $2}')
    $ADB shell /data/local/tmp/simpleperf record -p ${APP_PID} -o /data/local/tmp/perf.data sleep 70

    $ADB pull /data/local/tmp/perf.data $PERF_TMP_DIR/perf.data

    exit 0;
}

perf_report() {
    adb_pull_if_needed /data/local/tmp/perf.data $PERF_TMP_DIR/perf.data
    $SKIA_OUT/perfhost_report.py -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;