1684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos# Script to start a set of apps in order and then in each iteration
2684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos# switch the focus to each one. For each iteration, the time to start
3684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos# the app is reported as measured using atrace events and via am ThisTime.
4684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos# The output also reports if applications are restarted (eg, killed by
5684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos# LMK since previous iteration) or if there were any direct reclaim
6684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos# events.
7684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos#
8684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos# Variation: the "-T" option skips all of the atrace instramentation and
9684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos# attempts to start the apps as quickly as possible.
10684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos#
11684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos# Example 1: start all default apps. 2 iterations
12684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos#
13684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos# ./systemapps.sh -i 2
14684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos#
15684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos# Example 2: just start chrome, feedly, and the home screen in a loop
16684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos#
17684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos# ./systemapps.sh -L "chrome feedly home" -i 5
18684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos#
19684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos# Example 3: just start the default apps as quickly as possible
20684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos#
21684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos# ./systemapps.sh -T
22684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos#
23684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos# Other options are described below.
24684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos#
25684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjositerations=1
26684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjostracecategories="gfx view am input memreclaim"
27684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjostotaltimetest=0
28684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjosforcecoldstart=0
29643233ded9075628010c16feb8d2401ade3ae62cTodd KjoswaitTime=3.0
30684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos
31684f65f8602d1e1a79170984acc18421fb8f4c98Todd KjosappList="gmail hangouts chrome youtube play home"
32684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos
33684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjosfunction processLocalOption {
34684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	ret=0
35684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	case "$1" in
36684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	(-A) unset appList;;
37684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	(-F) forcecoldstart=1;;
38684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	(-L) appList=$2; shift; ret=1;;
39684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	(-T) totaltimetest=1;;
40643233ded9075628010c16feb8d2401ade3ae62cTodd Kjos	(-W) waitTime=$2; shift; ret=1;;
41684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	(*)
42684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos		echo "$0: unrecognized option: $1"
43684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos		echo; echo "Usage: $0 [options]"
44684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos		echo "-A : use all known applications"
45684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos		echo "-F : force cold-start for all apps"
46684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos		echo "-L applist : list of applications"
47684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos		echo "   default: $appList"
48684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos		echo "-T : total time to start all apps"
49643233ded9075628010c16feb8d2401ade3ae62cTodd Kjos		echo "-W : time to wait between apps"
50684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos		echo "-g : generate activity strings"
51684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos		echo "-i iterations"
52684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos		echo "-n : keep trace files"
53684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos		echo "-o output file"
54684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos		echo "-s : stop on error"
55684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos		echo "-t trace categories"
56684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos		exit 1;;
57684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	esac
58684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	return $ret
59684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos}
60684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos
61684f65f8602d1e1a79170984acc18421fb8f4c98Todd KjosCMDDIR=$(dirname $0 2>/dev/null)
62684f65f8602d1e1a79170984acc18421fb8f4c98Todd KjosCMDDIR=${CMDDIR:=.}
63684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos. $CMDDIR/defs.sh
64684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos
65684f65f8602d1e1a79170984acc18421fb8f4c98Todd KjostmpTraceOutBase=./tmptrace
66684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos
67684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjosif [ $user !=  "root" -a $totaltimetest -eq 0 ]; then
68684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	handleError Must be root on device
69684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	exit 1
70684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjosfi
71684f65f8602d1e1a79170984acc18421fb8f4c98Todd KjosdoKeyevent HOME
72684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos
73684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjosfunction computeStats {
74684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	label=$1
75684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	t=$2
76684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	restart=$3
77684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	reclaim=$4
78684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	frames=$5
79684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	janks=$6
80ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos	l90=$7
81ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos	l95=$8
82ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos	l99=$9
83684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	curMax=$(eval "echo \$${label}max")
84684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	curMax=${curMax:=0}
85684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	curMin=$(eval "echo \$${label}min")
86684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	curMin=${curMin:=100000}
87684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	curSum=$(eval "echo \$${label}sum")
88684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	curSum=${curSum:=0}
89684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	curRestart=$(eval "echo \$${label}restart")
90684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	curRestart=${curRestart:=0}
91684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	curReclaim=$(eval "echo \$${label}reclaim")
92684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	curReclaim=${curReclaim:=0}
93684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	curFrames=$(eval "echo \$${label}frames")
94684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	curFrames=${curFrames:=0}
95684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	curJanks=$(eval "echo \$${label}janks")
96684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	curJanks=${curJanks:=0}
97ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos	cur90=$(eval "echo \$${label}90")
98ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos	cur90=${cur90:=0}
99ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos	cur95=$(eval "echo \$${label}95")
100ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos	cur95=${cur95:=0}
101ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos	cur99=$(eval "echo \$${label}99")
102ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos	cur99=${cur99:=0}
103684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	if [ $curMax -lt $t ]; then
104684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos		eval "${label}max=$t"
105684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	fi
106684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	if [ $curMin -gt $t ]; then
107684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos		eval "${label}min=$t"
108684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	fi
109684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	((curSum=curSum+t))
110684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	eval "${label}sum=$curSum"
111684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos
112684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	((curRestart=curRestart+${restart:=0}))
113684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	eval "${label}restart=$curRestart"
114684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	((curReclaim=curReclaim+${reclaim:=0}))
115684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	eval "${label}reclaim=$curReclaim"
116684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	((curFrames=curFrames+${frames:=0}))
117684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	eval "${label}frames=$curFrames"
118684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	((curJanks=curJanks+${janks:=0}))
119684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	eval "${label}janks=$curJanks"
120ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos	((cur90=cur90+${l90:=0}))
121ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos	eval "${label}90=$cur90"
122ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos	((cur95=cur95+${l95:=0}))
123ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos	eval "${label}95=$cur95"
124ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos	((cur99=cur99+${l99:=0}))
125ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos	eval "${label}99=$cur99"
126684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos}
127684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjosfunction getStats {
128684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	label=$1
129684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	echo $(eval "echo \$${label}max") $(eval "echo \$${label}min") $(eval "echo \$${label}sum") \
130684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos		$(eval "echo \$${label}restart") $(eval "echo \$${label}reclaim") \
131ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos		$(eval "echo \$${label}frames") $(eval "echo \$${label}janks") \
132ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos		$(eval "echo \$${label}90") $(eval "echo \$${label}95") $(eval "echo \$${label}99")
133684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos}
134684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos
135684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjoscur=1
136684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjostotaltime=0
137684f65f8602d1e1a79170984acc18421fb8f4c98Todd KjosstartTimestamp=$(date +"%s %N")
138684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos
139684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjoswhile [ $cur -le $iterations ]
140684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjosdo
141684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	if [ $iterations -gt 1 ]; then
142684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos		echo =========================================
143684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos		echo Iteration $cur of $iterations
144684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos		echo =========================================
145684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	fi
146684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	if [ $iterations -gt 1 -o $cur -eq 1 ]; then
147684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos		if [ $totaltimetest -eq 0 ]; then
148ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos			printf "%-6s    %7s(ms)  %6s(ms) %s %s %s     %s\n" App  Time AmTime Restart DirReclaim Jank Latency
149684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos		fi
150684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	fi
151684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos
152684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	appnum=-1
153684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	for app in $appList
154684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	do
155684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos		vout Starting $app...
156684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos		((appnum=appnum+1))
157684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos		loopTimestamp=$(date +"%s %N")
158ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos		resetJankyFrames
159ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos		resetJankyFrames $(getPackageName $app)
160ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos		if [ $totaltimetest -eq 0 ]; then
161ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos			tmpTraceOut="$tmpTraceOutBase-$app.out"
162ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos			>$tmpTraceOut
163ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos			startInstramentation
164ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos		else
165684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos			if [ $appnum -eq 0 ]; then
166ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos				printf "%-8s %5s(ms) %3s(ms) %s      %s\n" App Start Iter Jank Latency
167684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos			fi
168684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos		fi
169ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos		if [ $forcecoldstart -eq 0 ]; then
170ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos			t=$(startActivity $app)
171ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos		else
172ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos			t=$(forceStartActivity $app)
173ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos		fi
174ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos
175684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos		# let app finish drawing before checking janks
176643233ded9075628010c16feb8d2401ade3ae62cTodd Kjos		sleep $waitTime
177684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos		set -- $(getJankyFrames $(getPackageName $app))
178684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos		frames=$1
179684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos		janks=$2
180ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos		l90=$3
181ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos		l95=$4
182ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos		l99=$5
183ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos		set -- $(getJankyFrames)
184ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos		systemFrames=$1
185ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos		systemJanks=$2
186ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos		s90=$3
187ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos		s95=$4
188ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos		s99=$5
189ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos		((frames=frames+systemFrames))
190ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos		((janks=janks+systemJanks))
191ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos		((l90=l90+s90))
192ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos		((l95=l95+s95))
193ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos		((l99=l99+s99))
194643233ded9075628010c16feb8d2401ade3ae62cTodd Kjos
195643233ded9075628010c16feb8d2401ade3ae62cTodd Kjos		loopEndTimestamp=$(date +"%s %N")
196643233ded9075628010c16feb8d2401ade3ae62cTodd Kjos		diffTime=$(computeTimeDiff $loopTimestamp $loopEndTimestamp)
197643233ded9075628010c16feb8d2401ade3ae62cTodd Kjos
198ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos		if [ $frames -eq 0 ]; then
199ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos			janks=0
200ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos			jankPct=0
201ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos		else
202ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos			((jankPct=100*janks/frames))
203684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos		fi
204ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos		if [ $totaltimetest -gt 0 ]; then
205ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos			# Note: using %f since %d doesn't work correctly
206ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos			# when running on lollipop
207ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos			printf "%-10s %5.0f   %5.0f    %4.0f(%2.0f%%) %2.0f/%2.0f/%2.0f\n" $app $t $diffTime $janks $jankPct $l90 $l95 $l99
208ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos			((totaltime=totaltime+t))
209ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos			continue
210ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos		else
211ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos			stopAndDumpInstramentation $tmpTraceOut
212ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos			actName=$(getActivityName $app)
213d0fefb8421a9cb57ac27d0d4fcf3abe938fcf2d1Todd Kjos			pkgName=$(getPackageName $app)
214ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos			stime=$(getStartTime $actName $tmpTraceOut)
215ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos			relaunch=$?
216d0fefb8421a9cb57ac27d0d4fcf3abe938fcf2d1Todd Kjos			etime=$(getEndTime $pkgName $tmpTraceOut)
217ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos			((tdiff=$etime-$stime))
218ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos			if [ $etime -eq 0 -o $stime -eq 0 ]; then
219ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos				handleError $app : could not compute start time stime=$stime  etime=$etime
220ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos				# use AmTime so statistics make sense
221ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos				tdiff=$t
222ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos			fi
223ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos			checkForDirectReclaim $actName $tmpTraceOut
224ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos			directReclaim=$?
225684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos
226ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos			printf "%-12s %5d     %5d     %5d    %5d    %5d(%d%%) %d/%d/%d\n" "$app" "$tdiff" "$t" "$relaunch" "$directReclaim" "$janks" "$jankPct" $l90 $l95 $l99
227ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos			computeStats "$app" "$tdiff" "$relaunch" "$directReclaim" "$frames" "$janks" $l90 $l95 $l99
228684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos
229ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos			if [ $savetmpfiles -eq 0 ]; then
230ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos				rm -f $tmpTraceOut
231ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos			fi
232684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos		fi
233684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	done
234684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	((cur=cur+1))
235684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjosdone
236684f65f8602d1e1a79170984acc18421fb8f4c98Todd KjosendTimestamp=$(date +"%s %N")
237684f65f8602d1e1a79170984acc18421fb8f4c98Todd KjosdiffTime=$(computeTimeDiff $startTimestamp $endTimestamp)
238684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjosif [ $totaltimetest -gt 0 ]; then
239684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	printf "%-10s %5.0f   %5.0f\n" TOTAL $totaltime $diffTime
240684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjosfi
241684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos
242684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjosif [ $iterations -gt 1 -a $totaltimetest -eq 0 ]; then
243684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	echo
244684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	echo =========================================
245684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	printf "Stats after $iterations iterations:\n"
246684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	echo =========================================
247ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos	printf "%-6s    %7s(ms) %6s(ms) %6s(ms)    %s    %s %s     %s\n" App Max Ave Min Restart DirReclaim Jank Latency
248684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	for app in $appList
249684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	do
250684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos		set -- $(getStats $app)
251684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos		sum=$3
252684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos		((ave=sum/iterations))
253684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos		frames=$6
254684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos		janks=$7
255ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos		l90=$8
256ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos		l95=$9
257ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos		l99=${10}
258ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos		((ave90=l90/iterations))
259ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos		((ave95=l95/iterations))
260ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos		((ave99=l99/iterations))
261684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos		((jankPct=100*janks/frames))
262ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos		printf "%-12s %5d      %5d      %5d      %5d      %5d     %5d(%d%%) %d/%d/%d\n" $app $1 $ave $2 $4 $5 $janks $jankPct $ave90 $ave95 $ave99
263684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	done
264684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjosfi
265