OSDN Git Service

am a5732f78: Merge "Simpleperf: support caller callgraph."
[android-x86/system-extras.git] / tests / workloads / systemapps.sh
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 view am input memreclaim"
27 totaltimetest=0
28 forcecoldstart=0
29 waitTime=3.0
30
31 appList="gmail hangouts chrome youtube play home"
32
33 function 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
61 CMDDIR=$(dirname $0 2>/dev/null)
62 CMDDIR=${CMDDIR:=.}
63 . $CMDDIR/defs.sh
64
65 tmpTraceOutBase=./tmptrace
66
67 if [ $user !=  "root" -a $totaltimetest -eq 0 ]; then
68         handleError Must be root on device
69         exit 1
70 fi
71 doKeyevent HOME
72
73 function 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 }
127 function 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
135 cur=1
136 totaltime=0
137 startTimestamp=$(date +"%s %N")
138
139 while [ $cur -le $iterations ]
140 do
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))
235 done
236 endTimestamp=$(date +"%s %N")
237 diffTime=$(computeTimeDiff $startTimestamp $endTimestamp)
238 if [ $totaltimetest -gt 0 ]; then
239         printf "%-10s %5.0f   %5.0f\n" TOTAL $totaltime $diffTime
240 fi
241
242 if [ $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
264 fi