blob: 5e4b7c8b7a1d2da83990c8f5d3b05988383bd078 (
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
133
134
135
136
137
138
139
140
141
142
143
144
145
|
#!/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 )"
PERF_CMD=$1
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
# 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_LIB=$PERF_TMP_DIR/data/data/com.skia/lib
perf_setup() {
mkdir -p $TMP_SYS_BIN
mkdir -p $TMP_SYS_LIB
mkdir -p $TMP_APP_LIB
# setup symlinks to account for perf potentially looking elsewhere
mkdir -p $PERF_TMP_DIR/data/app-lib
$( cd $PERF_TMP_DIR/data/app-lib && ln -s ../data/com.skia/lib com.skia-1)
$( cd $PERF_TMP_DIR/data/app-lib && ln -s ../data/com.skia/lib com.skia-2)
echo "Copying symbol files"
$ADB pull /system/bin/skia_launcher $TMP_SYS_BIN
$ADB pull /system/lib/libc.so $TMP_SYS_LIB
$ADB pull /system/lib/libstlport.so $TMP_SYS_LIB
$ADB pull /system/lib/libcutils.so $TMP_SYS_LIB
$ADB pull /system/lib/libGLESv2.so $TMP_SYS_LIB
$ADB pull /system/lib/libandroid.so $TMP_SYS_LIB
$ADB pull /system/lib/libm.so $TMP_SYS_LIB
$ADB pull /system/lib/libz.so $TMP_SYS_LIB
if [ $# -ge 2 ]
then
APP_NAME=$(basename $2)
$ADB pull /data/data/com.skia/lib/lib${APP_NAME}.so $TMP_APP_LIB
else
$ADB pull /data/data/com.skia/lib/ $TMP_APP_LIB
fi
}
perf_record() {
APP_NAME=$(basename $2)
# Collect extra arguments to be passed to the skia_launcher binary
shift # perf_cmd
shift # app_name
while (( "$#" )); do
APP_ARGS="$APP_ARGS $1"
shift
done
echo "Checking for skia_launcher app..."
if [ ! -f $TMP_SYS_BIN/skia_launcher ]
then
echo "Unable to find the skia_launcher on the device"
rm -rf $PERF_TMP_DIR
exit 1;
fi
echo "Checking for $APP_NAME library..."
if [ ! -f $TMP_APP_LIB/lib$APP_NAME.so ]
then
echo "Unable to find the app's shared library on the device"
rm -rf $PERF_TMP_DIR
exit 1;
fi
echo "Killing any running Skia processes."
$ADB shell ps | grep skia_launcher | awk '{print $2}' | xargs $ADB shell kill
echo "Starting application"
$ADB shell skia_launcher $APP_NAME $APP_ARGS &
# 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() {
# Collect extra arguments to be passed to the perfhost binary
while (( "$#" )); do
APP_ARGS="$APP_ARGS $1"
shift
done
$PERFHOST report -i $PERF_TMP_DIR/perf.data --symfs=$PERF_TMP_DIR $APP_ARGS
}
# Clean up
perf_clean() {
rm -rf $PERF_TMP_DIR
}
case $PERF_CMD in
setup)
perf_setup $@
;;
record)
perf_setup $@
perf_record $@
;;
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;
|