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