You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
279 lines
7.4 KiB
279 lines
7.4 KiB
# Script to start a set of apps in order and then in each iteration |
|
# switch the focus to each one. For each iteration, the time to start |
|
# the app is reported as measured using atrace events and via am ThisTime. |
|
# The output also reports if applications are restarted (eg, killed by |
|
# LMK since previous iteration) or if there were any direct reclaim |
|
# events. |
|
# |
|
# Variation: the "-T" option skips all of the atrace instramentation and |
|
# attempts to start the apps as quickly as possible. |
|
# |
|
# Example 1: start all default apps. 2 iterations |
|
# |
|
# ./systemapps.sh -i 2 |
|
# |
|
# Example 2: just start chrome, feedly, and the home screen in a loop |
|
# |
|
# ./systemapps.sh -L "chrome feedly home" -i 5 |
|
# |
|
# Example 3: just start the default apps as quickly as possible |
|
# |
|
# ./systemapps.sh -T |
|
# |
|
# Other options are described below. |
|
# |
|
iterations=1 |
|
tracecategories="gfx am memreclaim" |
|
totaltimetest=0 |
|
forcecoldstart=0 |
|
waitTime=3.0 |
|
memstats=0 |
|
|
|
appList="gmail maps chrome youtube play home" |
|
|
|
function processLocalOption { |
|
ret=0 |
|
case "$1" in |
|
(-A) unset appList;; |
|
(-F) forcecoldstart=1;; |
|
(-L) appList=$2; shift; ret=1;; |
|
(-T) totaltimetest=1;; |
|
(-W) waitTime=$2; shift; ret=1;; |
|
(-M) memstats=1;; |
|
(*) |
|
echo "$0: unrecognized option: $1" |
|
echo; echo "Usage: $0 [options]" |
|
echo "-A : use all known applications" |
|
echo "-F : force cold-start for all apps" |
|
echo "-L applist : list of applications" |
|
echo " default: $appList" |
|
echo "-T : total time to start all apps" |
|
echo "-W : time to wait between apps" |
|
echo "-g : generate activity strings" |
|
echo "-i iterations" |
|
echo "-n : keep trace files" |
|
echo "-o output file" |
|
echo "-s : stop on error" |
|
echo "-t trace categories" |
|
exit 1;; |
|
esac |
|
return $ret |
|
} |
|
|
|
CMDDIR=$(dirname $0 2>/dev/null) |
|
CMDDIR=${CMDDIR:=.} |
|
. $CMDDIR/defs.sh |
|
|
|
tmpTraceOutBase=./tmptrace |
|
|
|
if [ $user != "root" -a $totaltimetest -eq 0 ]; then |
|
handleError Must be root on device |
|
exit 1 |
|
fi |
|
doKeyevent HOME |
|
|
|
function computeStats { |
|
label=$1 |
|
t=$2 |
|
restart=$3 |
|
reclaim=$4 |
|
frames=$5 |
|
janks=$6 |
|
l90=$7 |
|
l95=$8 |
|
l99=$9 |
|
curMax=$(eval "echo \$${label}max") |
|
curMax=${curMax:=0} |
|
curMin=$(eval "echo \$${label}min") |
|
curMin=${curMin:=100000} |
|
curSum=$(eval "echo \$${label}sum") |
|
curSum=${curSum:=0} |
|
curRestart=$(eval "echo \$${label}restart") |
|
curRestart=${curRestart:=0} |
|
curReclaim=$(eval "echo \$${label}reclaim") |
|
curReclaim=${curReclaim:=0} |
|
curFrames=$(eval "echo \$${label}frames") |
|
curFrames=${curFrames:=0} |
|
curJanks=$(eval "echo \$${label}janks") |
|
curJanks=${curJanks:=0} |
|
cur90=$(eval "echo \$${label}90") |
|
cur90=${cur90:=0} |
|
cur95=$(eval "echo \$${label}95") |
|
cur95=${cur95:=0} |
|
cur99=$(eval "echo \$${label}99") |
|
cur99=${cur99:=0} |
|
if [ $curMax -lt $t ]; then |
|
eval "${label}max=$t" |
|
fi |
|
if [ $curMin -gt $t ]; then |
|
eval "${label}min=$t" |
|
fi |
|
((curSum=curSum+t)) |
|
eval "${label}sum=$curSum" |
|
|
|
((curRestart=curRestart+${restart:=0})) |
|
eval "${label}restart=$curRestart" |
|
((curReclaim=curReclaim+${reclaim:=0})) |
|
eval "${label}reclaim=$curReclaim" |
|
((curFrames=curFrames+${frames:=0})) |
|
eval "${label}frames=$curFrames" |
|
((curJanks=curJanks+${janks:=0})) |
|
eval "${label}janks=$curJanks" |
|
((cur90=cur90+${l90:=0})) |
|
eval "${label}90=$cur90" |
|
((cur95=cur95+${l95:=0})) |
|
eval "${label}95=$cur95" |
|
((cur99=cur99+${l99:=0})) |
|
eval "${label}99=$cur99" |
|
} |
|
function getStats { |
|
label=$1 |
|
echo $(eval "echo \$${label}max") $(eval "echo \$${label}min") $(eval "echo \$${label}sum") \ |
|
$(eval "echo \$${label}restart") $(eval "echo \$${label}reclaim") \ |
|
$(eval "echo \$${label}frames") $(eval "echo \$${label}janks") \ |
|
$(eval "echo \$${label}90") $(eval "echo \$${label}95") $(eval "echo \$${label}99") |
|
} |
|
|
|
cur=1 |
|
totaltime=0 |
|
startTimestamp=$(date +"%s %N") |
|
|
|
while [ $cur -le $iterations ] |
|
do |
|
if [ $iterations -gt 1 ]; then |
|
echo ========================================= |
|
echo Iteration $cur of $iterations |
|
date |
|
echo ========================================= |
|
fi |
|
if [ $iterations -gt 1 -o $cur -eq 1 ]; then |
|
if [ $totaltimetest -eq 0 ]; then |
|
printf "%-6s %7s(ms) %6s(ms) %s %s %s %s\n" App Time AmTime Restart DirReclaim Jank Latency |
|
fi |
|
fi |
|
|
|
appnum=-1 |
|
for app in $appList |
|
do |
|
vout Starting $app... |
|
((appnum=appnum+1)) |
|
loopTimestamp=$(date +"%s %N") |
|
resetJankyFrames |
|
resetJankyFrames $(getPackageName $app) |
|
if [ $totaltimetest -eq 0 ]; then |
|
tmpTraceOut="$tmpTraceOutBase-$app.out" |
|
>$tmpTraceOut |
|
startInstramentation "$app-$cur" |
|
else |
|
if [ "$memstats" -gt 0 ]; then |
|
startInstramentation "$app-$cur" 0 |
|
fi |
|
if [ $appnum -eq 0 ]; then |
|
printf "%-8s %5s(ms) %3s(ms) %s %s\n" App Start Iter Jank Latency |
|
fi |
|
fi |
|
if [ $forcecoldstart -eq 0 ]; then |
|
t=$(startActivity $app) |
|
else |
|
t=$(forceStartActivity $app) |
|
fi |
|
|
|
# let app finish drawing before checking janks |
|
sleep $waitTime |
|
set -- $(getJankyFrames $(getPackageName $app)) |
|
frames=$1 |
|
janks=$2 |
|
l90=$3 |
|
l95=$4 |
|
l99=$5 |
|
set -- $(getJankyFrames) |
|
systemFrames=$1 |
|
systemJanks=$2 |
|
s90=$3 |
|
s95=$4 |
|
s99=$5 |
|
((frames=frames+systemFrames)) |
|
((janks=janks+systemJanks)) |
|
((l90=l90+s90)) |
|
((l95=l95+s95)) |
|
((l99=l99+s99)) |
|
|
|
loopEndTimestamp=$(date +"%s %N") |
|
diffTime=$(computeTimeDiff $loopTimestamp $loopEndTimestamp) |
|
|
|
if [ $frames -eq 0 ]; then |
|
janks=0 |
|
jankPct=0 |
|
else |
|
((jankPct=100*janks/frames)) |
|
fi |
|
if [ $totaltimetest -gt 0 ]; then |
|
# Note: using %f since %d doesn't work correctly |
|
# when running on lollipop |
|
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 |
|
((totaltime=totaltime+t)) |
|
continue |
|
else |
|
stopAndDumpInstramentation $tmpTraceOut |
|
actName=$(getActivityName $app) |
|
pkgName=$(getPackageName $app) |
|
stime=$(getStartTime $actName $tmpTraceOut) |
|
relaunch=$? |
|
etime=$(getEndTime $pkgName $tmpTraceOut) |
|
((tdiff=$etime-$stime)) |
|
if [ $etime -eq 0 -o $stime -eq 0 ]; then |
|
handleError $app : could not compute start time stime=$stime etime=$etime |
|
# use AmTime so statistics make sense |
|
tdiff=$t |
|
fi |
|
checkForDirectReclaim $actName $tmpTraceOut |
|
directReclaim=$? |
|
|
|
printf "%-12s %5d %5d %5d %5d %5d(%d%%) %d/%d/%d\n" "$app" "$tdiff" "$t" "$relaunch" "$directReclaim" "$janks" "$jankPct" $l90 $l95 $l99 |
|
computeStats "$app" "$tdiff" "$relaunch" "$directReclaim" "$frames" "$janks" $l90 $l95 $l99 |
|
|
|
if [ $savetmpfiles -eq 0 ]; then |
|
rm -f $tmpTraceOut |
|
fi |
|
fi |
|
done |
|
((cur=cur+1)) |
|
done |
|
endTimestamp=$(date +"%s %N") |
|
diffTime=$(computeTimeDiff $startTimestamp $endTimestamp) |
|
if [ $totaltimetest -gt 0 ]; then |
|
printf "%-10s %5.0f %5.0f\n" TOTAL $totaltime $diffTime |
|
fi |
|
|
|
overallSum=0 |
|
appCount=0 |
|
if [ $iterations -gt 1 -a $totaltimetest -eq 0 ]; then |
|
echo |
|
echo ========================================= |
|
printf "Stats after $iterations iterations:\n" |
|
echo ========================================= |
|
printf "%-6s %7s(ms) %6s(ms) %6s(ms) %s %s %s %s\n" App Max Ave Min Restart DirReclaim Jank Latency |
|
for app in $appList |
|
do |
|
set -- $(getStats $app) |
|
sum=$3 |
|
((ave=sum/iterations)) |
|
frames=$6 |
|
janks=$7 |
|
l90=$8 |
|
l95=$9 |
|
l99=${10} |
|
((ave90=l90/iterations)) |
|
((ave95=l95/iterations)) |
|
((ave99=l99/iterations)) |
|
if [ $frames -gt 0 ]; then |
|
((jankPct=100*janks/frames)) |
|
fi |
|
printf "%-12s %5d %5d %5d %5d %5d %5d(%d%%) %d/%d/%d\n" $app $1 $ave $2 $4 $5 $janks $jankPct $ave90 $ave95 $ave99 |
|
((overallSum=overallSum+ave)) |
|
((appCount=appCount+1)) |
|
done |
|
if [ $appCount -gt 0 ]; then |
|
printf "Average Start Time: %.2f\n", $(echo $overallSum $appCount | awk '{ printf "%.2f\n", $1/$2 }') |
|
fi |
|
fi
|
|
|