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