• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# Script to start a set of apps in order and then in each iteration
2# switch the focus to each one. For each iteration, the time to start
3# the app is reported as measured using atrace events and via am ThisTime.
4# The output also reports if applications are restarted (eg, killed by
5# LMK since previous iteration) or if there were any direct reclaim
6# events.
7#
8# Variation: the "-T" option skips all of the atrace instramentation and
9# attempts to start the apps as quickly as possible.
10#
11# Example 1: start all default apps. 2 iterations
12#
13# ./systemapps.sh -i 2
14#
15# Example 2: just start chrome, feedly, and the home screen in a loop
16#
17# ./systemapps.sh -L "chrome feedly home" -i 5
18#
19# Example 3: just start the default apps as quickly as possible
20#
21# ./systemapps.sh -T
22#
23# Other options are described below.
24#
25iterations=1
26tracecategories="gfx view am input memreclaim"
27totaltimetest=0
28forcecoldstart=0
29waitTime=3.0
30
31appList="gmail hangouts chrome youtube play home"
32
33function processLocalOption {
34	ret=0
35	case "$1" in
36	(-A) unset appList;;
37	(-F) forcecoldstart=1;;
38	(-L) appList=$2; shift; ret=1;;
39	(-T) totaltimetest=1;;
40	(-W) waitTime=$2; shift; ret=1;;
41	(*)
42		echo "$0: unrecognized option: $1"
43		echo; echo "Usage: $0 [options]"
44		echo "-A : use all known applications"
45		echo "-F : force cold-start for all apps"
46		echo "-L applist : list of applications"
47		echo "   default: $appList"
48		echo "-T : total time to start all apps"
49		echo "-W : time to wait between apps"
50		echo "-g : generate activity strings"
51		echo "-i iterations"
52		echo "-n : keep trace files"
53		echo "-o output file"
54		echo "-s : stop on error"
55		echo "-t trace categories"
56		exit 1;;
57	esac
58	return $ret
59}
60
61CMDDIR=$(dirname $0 2>/dev/null)
62CMDDIR=${CMDDIR:=.}
63. $CMDDIR/defs.sh
64
65tmpTraceOutBase=./tmptrace
66
67if [ $user !=  "root" -a $totaltimetest -eq 0 ]; then
68	handleError Must be root on device
69	exit 1
70fi
71doKeyevent HOME
72
73function computeStats {
74	label=$1
75	t=$2
76	restart=$3
77	reclaim=$4
78	frames=$5
79	janks=$6
80	l90=$7
81	l95=$8
82	l99=$9
83	curMax=$(eval "echo \$${label}max")
84	curMax=${curMax:=0}
85	curMin=$(eval "echo \$${label}min")
86	curMin=${curMin:=100000}
87	curSum=$(eval "echo \$${label}sum")
88	curSum=${curSum:=0}
89	curRestart=$(eval "echo \$${label}restart")
90	curRestart=${curRestart:=0}
91	curReclaim=$(eval "echo \$${label}reclaim")
92	curReclaim=${curReclaim:=0}
93	curFrames=$(eval "echo \$${label}frames")
94	curFrames=${curFrames:=0}
95	curJanks=$(eval "echo \$${label}janks")
96	curJanks=${curJanks:=0}
97	cur90=$(eval "echo \$${label}90")
98	cur90=${cur90:=0}
99	cur95=$(eval "echo \$${label}95")
100	cur95=${cur95:=0}
101	cur99=$(eval "echo \$${label}99")
102	cur99=${cur99:=0}
103	if [ $curMax -lt $t ]; then
104		eval "${label}max=$t"
105	fi
106	if [ $curMin -gt $t ]; then
107		eval "${label}min=$t"
108	fi
109	((curSum=curSum+t))
110	eval "${label}sum=$curSum"
111
112	((curRestart=curRestart+${restart:=0}))
113	eval "${label}restart=$curRestart"
114	((curReclaim=curReclaim+${reclaim:=0}))
115	eval "${label}reclaim=$curReclaim"
116	((curFrames=curFrames+${frames:=0}))
117	eval "${label}frames=$curFrames"
118	((curJanks=curJanks+${janks:=0}))
119	eval "${label}janks=$curJanks"
120	((cur90=cur90+${l90:=0}))
121	eval "${label}90=$cur90"
122	((cur95=cur95+${l95:=0}))
123	eval "${label}95=$cur95"
124	((cur99=cur99+${l99:=0}))
125	eval "${label}99=$cur99"
126}
127function getStats {
128	label=$1
129	echo $(eval "echo \$${label}max") $(eval "echo \$${label}min") $(eval "echo \$${label}sum") \
130		$(eval "echo \$${label}restart") $(eval "echo \$${label}reclaim") \
131		$(eval "echo \$${label}frames") $(eval "echo \$${label}janks") \
132		$(eval "echo \$${label}90") $(eval "echo \$${label}95") $(eval "echo \$${label}99")
133}
134
135cur=1
136totaltime=0
137startTimestamp=$(date +"%s %N")
138
139while [ $cur -le $iterations ]
140do
141	if [ $iterations -gt 1 ]; then
142		echo =========================================
143		echo Iteration $cur of $iterations
144		echo =========================================
145	fi
146	if [ $iterations -gt 1 -o $cur -eq 1 ]; then
147		if [ $totaltimetest -eq 0 ]; then
148			printf "%-6s    %7s(ms)  %6s(ms) %s %s %s     %s\n" App  Time AmTime Restart DirReclaim Jank Latency
149		fi
150	fi
151
152	appnum=-1
153	for app in $appList
154	do
155		vout Starting $app...
156		((appnum=appnum+1))
157		loopTimestamp=$(date +"%s %N")
158		resetJankyFrames
159		resetJankyFrames $(getPackageName $app)
160		if [ $totaltimetest -eq 0 ]; then
161			tmpTraceOut="$tmpTraceOutBase-$app.out"
162			>$tmpTraceOut
163			startInstramentation
164		else
165			if [ $appnum -eq 0 ]; then
166				printf "%-8s %5s(ms) %3s(ms) %s      %s\n" App Start Iter Jank Latency
167			fi
168		fi
169		if [ $forcecoldstart -eq 0 ]; then
170			t=$(startActivity $app)
171		else
172			t=$(forceStartActivity $app)
173		fi
174
175		# let app finish drawing before checking janks
176		sleep $waitTime
177		set -- $(getJankyFrames $(getPackageName $app))
178		frames=$1
179		janks=$2
180		l90=$3
181		l95=$4
182		l99=$5
183		set -- $(getJankyFrames)
184		systemFrames=$1
185		systemJanks=$2
186		s90=$3
187		s95=$4
188		s99=$5
189		((frames=frames+systemFrames))
190		((janks=janks+systemJanks))
191		((l90=l90+s90))
192		((l95=l95+s95))
193		((l99=l99+s99))
194
195		loopEndTimestamp=$(date +"%s %N")
196		diffTime=$(computeTimeDiff $loopTimestamp $loopEndTimestamp)
197
198		if [ $frames -eq 0 ]; then
199			janks=0
200			jankPct=0
201		else
202			((jankPct=100*janks/frames))
203		fi
204		if [ $totaltimetest -gt 0 ]; then
205			# Note: using %f since %d doesn't work correctly
206			# when running on lollipop
207			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
208			((totaltime=totaltime+t))
209			continue
210		else
211			stopAndDumpInstramentation $tmpTraceOut
212			actName=$(getActivityName $app)
213			pkgName=$(getPackageName $app)
214			stime=$(getStartTime $actName $tmpTraceOut)
215			relaunch=$?
216			etime=$(getEndTime $pkgName $tmpTraceOut)
217			((tdiff=$etime-$stime))
218			if [ $etime -eq 0 -o $stime -eq 0 ]; then
219				handleError $app : could not compute start time stime=$stime  etime=$etime
220				# use AmTime so statistics make sense
221				tdiff=$t
222			fi
223			checkForDirectReclaim $actName $tmpTraceOut
224			directReclaim=$?
225
226			printf "%-12s %5d     %5d     %5d    %5d    %5d(%d%%) %d/%d/%d\n" "$app" "$tdiff" "$t" "$relaunch" "$directReclaim" "$janks" "$jankPct" $l90 $l95 $l99
227			computeStats "$app" "$tdiff" "$relaunch" "$directReclaim" "$frames" "$janks" $l90 $l95 $l99
228
229			if [ $savetmpfiles -eq 0 ]; then
230				rm -f $tmpTraceOut
231			fi
232		fi
233	done
234	((cur=cur+1))
235done
236endTimestamp=$(date +"%s %N")
237diffTime=$(computeTimeDiff $startTimestamp $endTimestamp)
238if [ $totaltimetest -gt 0 ]; then
239	printf "%-10s %5.0f   %5.0f\n" TOTAL $totaltime $diffTime
240fi
241
242if [ $iterations -gt 1 -a $totaltimetest -eq 0 ]; then
243	echo
244	echo =========================================
245	printf "Stats after $iterations iterations:\n"
246	echo =========================================
247	printf "%-6s    %7s(ms) %6s(ms) %6s(ms)    %s    %s %s     %s\n" App Max Ave Min Restart DirReclaim Jank Latency
248	for app in $appList
249	do
250		set -- $(getStats $app)
251		sum=$3
252		((ave=sum/iterations))
253		frames=$6
254		janks=$7
255		l90=$8
256		l95=$9
257		l99=${10}
258		((ave90=l90/iterations))
259		((ave95=l95/iterations))
260		((ave99=l99/iterations))
261		((jankPct=100*janks/frames))
262		printf "%-12s %5d      %5d      %5d      %5d      %5d     %5d(%d%%) %d/%d/%d\n" $app $1 $ave $2 $4 $5 $janks $jankPct $ave90 $ave95 $ave99
263	done
264fi
265