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
2699eb5eaeb69a8ebb496daa55dc92df4caf268947Todd Kjostracecategories="gfx am memreclaim"
27684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjostotaltimetest=0
28684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjosforcecoldstart=0
29643233ded9075628010c16feb8d2401ade3ae62cTodd KjoswaitTime=3.0
3099eb5eaeb69a8ebb496daa55dc92df4caf268947Todd Kjosmemstats=0
31684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos
3299eb5eaeb69a8ebb496daa55dc92df4caf268947Todd KjosappList="gmail maps chrome youtube play home"
33684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos
34684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjosfunction processLocalOption {
35684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	ret=0
36684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	case "$1" in
37684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	(-A) unset appList;;
38684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	(-F) forcecoldstart=1;;
39684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	(-L) appList=$2; shift; ret=1;;
40684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	(-T) totaltimetest=1;;
41643233ded9075628010c16feb8d2401ade3ae62cTodd Kjos	(-W) waitTime=$2; shift; ret=1;;
4299eb5eaeb69a8ebb496daa55dc92df4caf268947Todd Kjos	(-M) memstats=1;;
43684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	(*)
44684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos		echo "$0: unrecognized option: $1"
45684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos		echo; echo "Usage: $0 [options]"
46684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos		echo "-A : use all known applications"
47684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos		echo "-F : force cold-start for all apps"
48684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos		echo "-L applist : list of applications"
49684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos		echo "   default: $appList"
50684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos		echo "-T : total time to start all apps"
51643233ded9075628010c16feb8d2401ade3ae62cTodd Kjos		echo "-W : time to wait between apps"
52684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos		echo "-g : generate activity strings"
53684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos		echo "-i iterations"
54684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos		echo "-n : keep trace files"
55684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos		echo "-o output file"
56684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos		echo "-s : stop on error"
57684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos		echo "-t trace categories"
58684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos		exit 1;;
59684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	esac
60684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	return $ret
61684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos}
62684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos
63684f65f8602d1e1a79170984acc18421fb8f4c98Todd KjosCMDDIR=$(dirname $0 2>/dev/null)
64684f65f8602d1e1a79170984acc18421fb8f4c98Todd KjosCMDDIR=${CMDDIR:=.}
65684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos. $CMDDIR/defs.sh
66684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos
67684f65f8602d1e1a79170984acc18421fb8f4c98Todd KjostmpTraceOutBase=./tmptrace
68684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos
69684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjosif [ $user !=  "root" -a $totaltimetest -eq 0 ]; then
70684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	handleError Must be root on device
71684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	exit 1
72684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjosfi
73684f65f8602d1e1a79170984acc18421fb8f4c98Todd KjosdoKeyevent HOME
74684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos
75684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjosfunction computeStats {
76684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	label=$1
77684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	t=$2
78684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	restart=$3
79684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	reclaim=$4
80684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	frames=$5
81684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	janks=$6
82ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos	l90=$7
83ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos	l95=$8
84ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos	l99=$9
85684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	curMax=$(eval "echo \$${label}max")
86684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	curMax=${curMax:=0}
87684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	curMin=$(eval "echo \$${label}min")
88684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	curMin=${curMin:=100000}
89684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	curSum=$(eval "echo \$${label}sum")
90684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	curSum=${curSum:=0}
91684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	curRestart=$(eval "echo \$${label}restart")
92684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	curRestart=${curRestart:=0}
93684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	curReclaim=$(eval "echo \$${label}reclaim")
94684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	curReclaim=${curReclaim:=0}
95684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	curFrames=$(eval "echo \$${label}frames")
96684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	curFrames=${curFrames:=0}
97684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	curJanks=$(eval "echo \$${label}janks")
98684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	curJanks=${curJanks:=0}
99ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos	cur90=$(eval "echo \$${label}90")
100ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos	cur90=${cur90:=0}
101ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos	cur95=$(eval "echo \$${label}95")
102ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos	cur95=${cur95:=0}
103ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos	cur99=$(eval "echo \$${label}99")
104ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos	cur99=${cur99:=0}
105684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	if [ $curMax -lt $t ]; then
106684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos		eval "${label}max=$t"
107684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	fi
108684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	if [ $curMin -gt $t ]; then
109684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos		eval "${label}min=$t"
110684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	fi
111684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	((curSum=curSum+t))
112684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	eval "${label}sum=$curSum"
113684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos
114684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	((curRestart=curRestart+${restart:=0}))
115684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	eval "${label}restart=$curRestart"
116684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	((curReclaim=curReclaim+${reclaim:=0}))
117684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	eval "${label}reclaim=$curReclaim"
118684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	((curFrames=curFrames+${frames:=0}))
119684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	eval "${label}frames=$curFrames"
120684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	((curJanks=curJanks+${janks:=0}))
121684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	eval "${label}janks=$curJanks"
122ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos	((cur90=cur90+${l90:=0}))
123ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos	eval "${label}90=$cur90"
124ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos	((cur95=cur95+${l95:=0}))
125ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos	eval "${label}95=$cur95"
126ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos	((cur99=cur99+${l99:=0}))
127ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos	eval "${label}99=$cur99"
128684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos}
129684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjosfunction getStats {
130684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	label=$1
131684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	echo $(eval "echo \$${label}max") $(eval "echo \$${label}min") $(eval "echo \$${label}sum") \
132684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos		$(eval "echo \$${label}restart") $(eval "echo \$${label}reclaim") \
133ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos		$(eval "echo \$${label}frames") $(eval "echo \$${label}janks") \
134ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos		$(eval "echo \$${label}90") $(eval "echo \$${label}95") $(eval "echo \$${label}99")
135684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos}
136684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos
137684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjoscur=1
138684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjostotaltime=0
139684f65f8602d1e1a79170984acc18421fb8f4c98Todd KjosstartTimestamp=$(date +"%s %N")
140684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos
141684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjoswhile [ $cur -le $iterations ]
142684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjosdo
143684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	if [ $iterations -gt 1 ]; then
144684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos		echo =========================================
145684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos		echo Iteration $cur of $iterations
14699eb5eaeb69a8ebb496daa55dc92df4caf268947Todd Kjos		date
147684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos		echo =========================================
148684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	fi
149684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	if [ $iterations -gt 1 -o $cur -eq 1 ]; then
150684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos		if [ $totaltimetest -eq 0 ]; then
151ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos			printf "%-6s    %7s(ms)  %6s(ms) %s %s %s     %s\n" App  Time AmTime Restart DirReclaim Jank Latency
152684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos		fi
153684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	fi
154684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos
155684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	appnum=-1
156684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	for app in $appList
157684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	do
158684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos		vout Starting $app...
159684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos		((appnum=appnum+1))
160684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos		loopTimestamp=$(date +"%s %N")
161ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos		resetJankyFrames
162ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos		resetJankyFrames $(getPackageName $app)
163ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos		if [ $totaltimetest -eq 0 ]; then
164ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos			tmpTraceOut="$tmpTraceOutBase-$app.out"
165ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos			>$tmpTraceOut
166ffa6c3ac841d16d72ec11eda8b0fd3b6264bab08Todd Kjos			startInstramentation "$app-$cur"
167ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos		else
16899eb5eaeb69a8ebb496daa55dc92df4caf268947Todd Kjos			if [ "$memstats" -gt 0 ]; then
169ffa6c3ac841d16d72ec11eda8b0fd3b6264bab08Todd Kjos				startInstramentation "$app-$cur" 0
17099eb5eaeb69a8ebb496daa55dc92df4caf268947Todd Kjos			fi
171684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos			if [ $appnum -eq 0 ]; then
172ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos				printf "%-8s %5s(ms) %3s(ms) %s      %s\n" App Start Iter Jank Latency
173684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos			fi
174684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos		fi
175ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos		if [ $forcecoldstart -eq 0 ]; then
176ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos			t=$(startActivity $app)
177ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos		else
178ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos			t=$(forceStartActivity $app)
179ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos		fi
180ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos
181684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos		# let app finish drawing before checking janks
182643233ded9075628010c16feb8d2401ade3ae62cTodd Kjos		sleep $waitTime
183684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos		set -- $(getJankyFrames $(getPackageName $app))
184684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos		frames=$1
185684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos		janks=$2
186ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos		l90=$3
187ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos		l95=$4
188ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos		l99=$5
189ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos		set -- $(getJankyFrames)
190ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos		systemFrames=$1
191ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos		systemJanks=$2
192ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos		s90=$3
193ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos		s95=$4
194ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos		s99=$5
195ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos		((frames=frames+systemFrames))
196ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos		((janks=janks+systemJanks))
197ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos		((l90=l90+s90))
198ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos		((l95=l95+s95))
199ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos		((l99=l99+s99))
200643233ded9075628010c16feb8d2401ade3ae62cTodd Kjos
201643233ded9075628010c16feb8d2401ade3ae62cTodd Kjos		loopEndTimestamp=$(date +"%s %N")
202643233ded9075628010c16feb8d2401ade3ae62cTodd Kjos		diffTime=$(computeTimeDiff $loopTimestamp $loopEndTimestamp)
203643233ded9075628010c16feb8d2401ade3ae62cTodd Kjos
204ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos		if [ $frames -eq 0 ]; then
205ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos			janks=0
206ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos			jankPct=0
207ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos		else
208ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos			((jankPct=100*janks/frames))
209684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos		fi
210ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos		if [ $totaltimetest -gt 0 ]; then
211ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos			# Note: using %f since %d doesn't work correctly
212ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos			# when running on lollipop
213ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd 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
214ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos			((totaltime=totaltime+t))
215ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos			continue
216ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos		else
217ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos			stopAndDumpInstramentation $tmpTraceOut
218ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos			actName=$(getActivityName $app)
219d0fefb8421a9cb57ac27d0d4fcf3abe938fcf2d1Todd Kjos			pkgName=$(getPackageName $app)
220ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos			stime=$(getStartTime $actName $tmpTraceOut)
221ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos			relaunch=$?
222d0fefb8421a9cb57ac27d0d4fcf3abe938fcf2d1Todd Kjos			etime=$(getEndTime $pkgName $tmpTraceOut)
223ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos			((tdiff=$etime-$stime))
224ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos			if [ $etime -eq 0 -o $stime -eq 0 ]; then
225ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos				handleError $app : could not compute start time stime=$stime  etime=$etime
226ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos				# use AmTime so statistics make sense
227ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos				tdiff=$t
228ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos			fi
229ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos			checkForDirectReclaim $actName $tmpTraceOut
230ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos			directReclaim=$?
231684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos
232ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos			printf "%-12s %5d     %5d     %5d    %5d    %5d(%d%%) %d/%d/%d\n" "$app" "$tdiff" "$t" "$relaunch" "$directReclaim" "$janks" "$jankPct" $l90 $l95 $l99
233ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos			computeStats "$app" "$tdiff" "$relaunch" "$directReclaim" "$frames" "$janks" $l90 $l95 $l99
234684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos
235ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos			if [ $savetmpfiles -eq 0 ]; then
236ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos				rm -f $tmpTraceOut
237ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos			fi
238684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos		fi
239684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	done
240684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	((cur=cur+1))
241684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjosdone
242684f65f8602d1e1a79170984acc18421fb8f4c98Todd KjosendTimestamp=$(date +"%s %N")
243684f65f8602d1e1a79170984acc18421fb8f4c98Todd KjosdiffTime=$(computeTimeDiff $startTimestamp $endTimestamp)
244684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjosif [ $totaltimetest -gt 0 ]; then
245684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	printf "%-10s %5.0f   %5.0f\n" TOTAL $totaltime $diffTime
246684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjosfi
247684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos
24899eb5eaeb69a8ebb496daa55dc92df4caf268947Todd KjosoverallSum=0
24999eb5eaeb69a8ebb496daa55dc92df4caf268947Todd KjosappCount=0
250684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjosif [ $iterations -gt 1 -a $totaltimetest -eq 0 ]; then
251684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	echo
252684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	echo =========================================
253684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	printf "Stats after $iterations iterations:\n"
254684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	echo =========================================
255ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos	printf "%-6s    %7s(ms) %6s(ms) %6s(ms)    %s    %s %s     %s\n" App Max Ave Min Restart DirReclaim Jank Latency
256684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	for app in $appList
257684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	do
258684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos		set -- $(getStats $app)
259684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos		sum=$3
260684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos		((ave=sum/iterations))
261684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos		frames=$6
262684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos		janks=$7
263ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos		l90=$8
264ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos		l95=$9
265ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos		l99=${10}
266ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos		((ave90=l90/iterations))
267ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos		((ave95=l95/iterations))
268ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd Kjos		((ave99=l99/iterations))
26999eb5eaeb69a8ebb496daa55dc92df4caf268947Todd Kjos		if [ $frames -gt 0 ]; then
27099eb5eaeb69a8ebb496daa55dc92df4caf268947Todd Kjos			((jankPct=100*janks/frames))
27199eb5eaeb69a8ebb496daa55dc92df4caf268947Todd Kjos		fi
272ae1f93cc3cef9c8c790330dd09f2ff87bf38eabcTodd 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
27399eb5eaeb69a8ebb496daa55dc92df4caf268947Todd Kjos		((overallSum=overallSum+ave))
27499eb5eaeb69a8ebb496daa55dc92df4caf268947Todd Kjos		((appCount=appCount+1))
275684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjos	done
27699eb5eaeb69a8ebb496daa55dc92df4caf268947Todd Kjos	if [ $appCount -gt 0 ]; then
27799eb5eaeb69a8ebb496daa55dc92df4caf268947Todd Kjos		printf "Average Start Time: %.2f\n", $(echo $overallSum $appCount | awk '{ printf "%.2f\n", $1/$2 }')
27899eb5eaeb69a8ebb496daa55dc92df4caf268947Todd Kjos	fi
279684f65f8602d1e1a79170984acc18421fb8f4c98Todd Kjosfi
280