# Script to gather perf and perf/watt data for several workloads
#
# Setup:
#
# - device connected to monsoon with USB passthrough enabled
# - network enabled (baseline will be measured and subtracted
# from results) (network needed for chrome, youtube tests)
# - the device is rebooted after each test (can be inhibited
# with "-r 0")
#
# Default behavior is to run each of the known workloads for
# 30 minutes gathering both performance and power data.
#
# The default time can be overridden with the -t option. To
# change individual test times, a config file can be specifed
# via -f with times for individual tests. Example file contents:
#
# idleTime=60
# recentflingTime=60
# chromeTime=60
# youtubeTime=0
# sysappsTime=60
# suntempleTime=5
#
# Output goes to the current directory.
#
# Examples:
#
# - Run all tests for 15 minutes (default is 30): ./pwrtest.sh -t 15 -R MDA20
#
# - Use a config file for test times: ./pwrtest.sh -f ./myconfig -R MDA20
#
# - Use a init file to setup device tuneables after each restart (this is
# a bash script which should include adb commands to set up device):
# ./pwrtest.sh -F devtunables
#
defaultTime=30
garbageminutes=8
function Usage {
echo "Usage: $0 [OPTIONS]"
echo "-d device : device type (shamu, bullhead, ...)"
echo "-f configFile : config file to override individual test times"
echo "-g garbageMinutes : time to skip power measurement at beginning of test"
echo " default=$garbagetime minutes"
echo "-r restart : 0=no reboot between tests, 1=reboot (default)"
echo "-t defaultTimeMin : default time to run each test"
echo " default=$defaultTime minutes"
echo "-D cmddir : directory to find defs.sh"
echo "-F restartHookFile : file of commands to set device tunables after restart (optional)"
echo "-R release : release running on device (MDA20, 2054728, etc)"
}
restart=1
hz=5
shadowgrid2TimeMax=25
CMDDIR=$(dirname $0 2>/dev/null)
CMDDIR=${CMDDIR:=.}
MONSOON=monsoon.par
while [ $# -gt 0 ]
do
case "$1" in
(-D) CMDDIR=$2; shift;;
(-r) restart=$2; shift;;
(-t) defaultTime=$2; shift;;
(-F) restartfile=$2; shift;;
(-g) garbageminutes=$2; shift;;
(-f)
configFile=$2;
echo "Reading configs from $configFile..."
. ./$configFile
shift;;
(-R) echo $2 > ./build; shift;;
(--) ;;
(--help)
Usage
exit 0;;
(*)
echo "Unknown option: $1"
Usage
exit 1;;
esac
shift
done
. $CMDDIR/defs.sh --
devdir="/data/local/tmp"
suntempledir=${CMDDIR}/suntemple
case $DEVICE in
(shamu|hammerhead)
HWUITEST=hwuitest
onSwipe="700 1847 700 400 50"
;;
(*)
HWUITEST=hwuitest64
onSwipe="500 1200 500 550 150"
;;
esac
scripts="defs.sh systemapps.sh recentfling.sh youtube.sh chromefling.sh $HWUITEST"
if ! $MONSOON >/dev/null 2>&1; then
echo $MONSOON must be in your PATH >&2
exit 1
fi
function usbpassthru {
if [ "$1" = off ]; then
state=off
else
state=on
fi
echo Setting usb pass-thru to $state
monsoon.par --usbpassthrough=$state
}
function pwrcollect {
collectmin=$1
collectmin=${collectmin:=60}
# samples = hz * 60 * minutes
((samples=5*60*collectmin))
monsoon.par --timestamp --samples $samples --hz 5
}
function copy_files {
adb shell mkdir -p $devdir
for file in $scripts
do
adb push $CMDDIR/$file $devdir
done
}
function install_suntemple {
echo Checking for suntemple installation...
#stdest=/storage/sdcard0/obb/com.BrueComputing.SunTemple
stdest=/storage/emulated/0/obb/com.BrueComputing.SunTemple
dircontents=$(adb ls $stdest 2>/dev/null)
if [ "$dircontents" = "" ]; then
echo Installing suntemple...
adb install $suntempledir/*.apk
adb shell mkdir -p $stdest
adb push $suntempledir/main*obb $stdest
else
echo dircontents=$dircontents
echo Suntemple already installed.
fi
}
function run_test {
testName=$1
collectMinutes=$2
collectOutput=${testName}-power-raw.out
powerOutput=${testName}-power.out
echo -----------------------------------------------------
echo TEST: $testName
echo enabled Cores $(adb shell "cat /sys/devices/system/cpu/online")
date
echo -----------------------------------------------------
usbpassthru off
pwrcollect $collectMinutes > $collectOutput 2>/dev/null
# take off the first 2min of samples
totalSamples=$(cat $collectOutput | wc -l)
# we throw away the first "garbageminutes" of the data
# since it is volatile
((garbage=hz*60*garbageminutes))
((remaining=totalSamples-garbage))
if [ $remaining -gt 0 ]; then
tail -$remaining $collectOutput > $powerOutput
else
cp $collectOutput $powerOutput
fi
echo power data for $testName copied to $collectOutput
usbpassthru on
sleep 10
adb devices
sleep 10
}
function start_job {
cmdline="$1"
echo Running $cmdline
(adb shell "cd $devdir && nohup $cmdline > test.out") &
sleep 5
kill %1 2>/dev/null
}
function cleanup_job {
testName=$1
processName=$2
processName=${processName:=" sh "}
set -- $(adb shell ps | tr "\r" " " | grep "$processName")
echo killing PID=$2...
adb shell kill $2
sleep 1
echo copying test output to $testName...
adb pull $devdir/test.out
mv test.out ${testName}.out
if [ $restart -gt 0 ]; then
restart_device
else
doKeyevent HOME
fi
}
function airplane_mode {
if [ "$1" = "on" ]; then
mode=true
setting=1
else
mode=false
setting=0
fi
adb shell settings put global airplane_mode_on $setting
adb shell am broadcast -a android.intent.action.AIRPLANE_MODE --ez state $mode
echo Set airplane mode to $mode
}
function restart_device {
adb reboot
echo Wait 60s for device to restart...
sleep 60
while ! adb root
do
echo Waiting for device to come up...
sleep 10
done
echo Wait 30s to complete boot activities...
sleep 30
echo Restart complete.
doTap 897 1075
sleep 2
doSwipe $onSwipe
restartfile=${restartfile:="./restarthook"}
if [ -f $restartfile ]; then
# hook to change tunables after a restart
. $restartfile
fi
}
usbpassthru on
adb devices 2>/dev/null
airplane_mode off
if [ $restart -gt 0 ]; then
restart_device
fi
echo Copying $scripts to device $devdir...
copy_files
tests=""
# measure background power
idleTime=${idleTime:=$defaultTime}
if [ $idleTime -gt 0 ]; then
echo Test 1 : measure idle power for $idleTime minutes
run_test idle $idleTime
airplane_mode on
echo Restarting for power baseline in airplane mode...
restart_device
run_test idle-airplane $idleTime
airplane_mode off
# the screen blanks after 30 minutes. The first 2 minutes of the test
# have already been filtered off. For our power baseline, keep the first
# 20 minutes of the results
((twentyminutes=hz*20*60))
powerOutput="idle-power.out"
displayPowerOutput="idle-display-power.out"
airplanePowerOutput="idle-airplane-power.out"
airplaneDisplayPowerOutput="idle-airplane-display-power.out"
totalSamples=$(cat $powerOutput | wc -l)
if [ $twentyminutes -lt $totalSamples ]; then
head -$twentyminutes $powerOutput > $displayPowerOutput
head -$twentyminutes $airplanePowerOutput > $airplaneDisplayPowerOutput
else
cp $powerOutput $displayPowerOutput
cp $airplanePowerOutput $airplaneDisplayPowerOutput
fi
tests="$tests idle"
fi
recentflingTime=${recentflingTime:=$defaultTime}
if [ $recentflingTime -gt 0 ]; then
echo $(date) Test 2 : recents fling for $recentflingTime minutes
airplane_mode on
adb shell "cd $devdir && ./systemapps.sh -A -T -i 1"
start_job "./recentfling.sh -N -i 1000 -d $DEVICE"
run_test recentfling $recentflingTime
cleanup_job recentfling
airplane_mode off
date
tests="$tests recentfling"
fi
suntempleTime=${suntempleTime:=$defaultTime}
if [ $suntempleTime -gt 0 ]; then
echo $(date) Test 2 : run Sun Temple $suntempleTime minutes
airplane_mode on
install_suntemple
adb shell "am start $suntempleActivity"
run_test suntemple $suntempleTime
adb pull /sdcard/SunTemple/SunTemple/Saved/Logs/SunTemple.log
cleanup_job suntemple BrueComp
airplane_mode off
mv SunTemple.log suntemple.out
# grab the suntemple log
date
tests="$tests suntemple"
fi
chromeTime=${chromeTime:=$defaultTime}
if [ $chromeTime -gt 0 ]; then
echo $(date) Test 3 : chrome fling for $chromeTime minutes
start_job "./chromefling.sh -i 1000 -d $DEVICE"
run_test chrome $chromeTime
cleanup_job chrome
date
tests="$tests chrome"
fi
shadowgrid2Time=${shadowgrid2Time:=$defaultTime}
if [ $shadowgrid2Time -gt $shadowgrid2TimeMax ]; then
# we cap shadowgrid2 time since the display goes
# off after 30 minutes
$shadowgrid2Time=$shadowgrid2TimeMax
fi
if [ $shadowgrid2Time -gt 0 ]; then
airplane_mode on
echo $(date) Test 4 : shadowgrid2 for $shadowgrid2Time minutes
start_job "./$HWUITEST shadowgrid2 100000"
run_test shadowgrid2 $shadowgrid2Time
cleanup_job shadowgrid2 $HWUITEST
airplane_mode off
date
tests="$tests shadowgrid2"
fi
youtubeTime=${youtubeTime:=$defaultTime}
if [ $youtubeTime -gt 0 ]; then
echo $(date) Test 5 : youtube for $youtubeTime minutes
start_job "./youtube.sh -i 1000 -d $DEVICE"
run_test youtube $youtubeTime
cleanup_job youtube
date
tests="$tests youtube"
fi
sysappsTime=${sysappsTime:=$defaultTime}
if [ $sysappsTime -gt 0 ]; then
echo $(date) Test 6 : app switching for $sysappsTime minutes
start_job "./systemapps.sh -T -i 1000 -d $DEVICE"
run_test sysapps $sysappsTime
cleanup_job sysapps
date
tests="$tests sysapps"
fi
echo Ran tests: $tests
echo $tests > tests