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