blob: d9464ef08f60915e7984dee93d20ec35437eda38 [file] [log] [blame]
#!/bin/bash
#set -vex
script_start_time=$(date +%s)
default_vkreplay_apk=./vkreplay/bin/NativeActivity-debug.apk
default_vktrace_exe=../build/vktrace/vktrace
default_vktrace32_exe=../build32/vktrace/vktrace32
default_target_abi=$(adb shell getprop ro.product.cpu.abi)
default_activity=android.app.NativeActivity
default_frame=1
#if [[ $(basename "$PWD") != "build-android" ]]
#then
# echo "Please run this script from the build-android directory"
# exit 1
#fi
#
# Parse parameters
#
function printUsage {
echo "Supported parameters are:"
echo " --serial <target device serial number>"
echo " --abi <abi to install>"
echo " --vktrace <full path to vktrace on host> (optional)"
echo " --vkreplay <full path to vkreplay APK> (optional)"
echo " --apk <full path to APK>"
echo " --package <package name>"
echo " --actvity <launchable-activity name>"
echo " --frame <frame number to capture>"
echo
echo "i.e. ${0##*/} --serial 01234567 \\"
echo " --abi arm64-v8a \\"
echo " --vktrace ../build/vktrace/vktrace \\"
echo " --vkreplay ./vkreplay/bin/NativeActivity-debug.apk \\"
echo " --apk ~/Downloads/foo.apk.apk \\"
echo " --package com.example.foo \\"
echo " --actvity android.app.NativeActivity \\"
echo " --frame 1"
exit 1
}
if [[ $(($# % 2)) -ne 0 ]]
then
echo Parameters must be provided in pairs.
echo parameter count = $#
echo
printUsage
exit 1
fi
while [[ $# -gt 0 ]]
do
case $1 in
--serial)
# include the flag, because we need to leave it off if not provided
serial="$2"
serialFlag="-s $serial"
shift 2
;;
--abi)
target_abi="$2"
shift 2
;;
--vktrace)
vktrace_exe="$2"
shift 2
;;
--vkreplay)
vkreplay_apk="$2"
shift 2
;;
--apk)
apk="$2"
shift 2
;;
--package)
package="$2"
shift 2
;;
--activity)
activity="$2"
shift 2
;;
--frame)
frame="$2"
shift 2
;;
-*)
# unknown option
echo Unknown option: $1
echo
printUsage
exit 1
;;
esac
done
echo serial = $serial
if [[ -z $serial ]]
then
echo Please provide a serial number.
echo
printUsage
exit 1
fi
if [[ $(adb devices) != *"$serial"* ]];
then
echo Device not found: $serial
echo
printUsage
exit 1
fi
if [[ -z $target_abi ]];
then
echo Using default target_abi
target_abi=$default_target_abi
fi
echo target_abi = $target_abi
if [[ $target_abi == "armeabi-v7a" ]] ||
[[ $target_abi == "mips" ]] ||
[[ $target_abi == "x86" ]];
then
echo Targeting 32-bit abi $target_abi
target_32bit_abi=1
fi
if [[ -z $vktrace_exe ]];
then
echo Using default vktrace_exe
vktrace_exe=$default_vktrace_exe
if [[ $target_32bit_abi ]]
then
vktrace_exe=$default_vktrace32_exe
fi
else
if [[ $target_32bit_abi ]]
then
echo Ensure your vktrace is 32-bit, i.e. vktrace32
fi
fi
echo vktrace_exe = $vktrace_exe
if [[ -z $vkreplay_apk ]];
then
echo Using default vkreplay_apk
vkreplay_apk=$default_vkreplay_apk
fi
echo vkreplay_apk = $vkreplay_apk
if [[ -z $apk ]];
then
echo target APK required
exit 1
fi
echo apk = $apk
if [[ -z $package ]];
then
echo target package name required
exit 1
fi
echo package = $package
if [[ -z $activity ]];
then
echo Using default activity
activity=$default_activity
fi
echo activity = $activity
if [[ -z $frame ]];
then
echo Using default screenshot frame
frame=$default_frame
fi
echo frame = $frame
function printLayerBuild() {
echo "To build layers:"
echo "./update_external_sources_android.sh"
echo "./android-generate.sh"
echo "ndk-build -j"
}
function printvkreplayBuild() {
echo "To build vkreplay apk"
echo "android update project -s -p . -t \"android-23\""
echo "ndk-build -j"
echo "ant -buildfile vkreplay debug"
}
function printvktraceBuild() {
echo "To build vktrace"
echo "pushd .."
echo "mkdir build"
echo "cd build"
echo "cmake -DCMAKE_BUILD_TYPE=Debug .."
echo "make -j"
}
#
# If any parameter not found, print how to build it
#
if [ ! -f $vkreplay_apk ]; then
echo "$vkreplay_apk not found!"
printvkreplayBuild
exit 1
fi
if [ ! -f $vktrace_exe ]; then
echo "$vktrace_exe not found!"
printvktraceBuild
exit 1
fi
#
# Check for required tools
#
adb_path=$(which adb)
if [[ $? == 0 ]];
then
echo using $adb_path
else
echo adb not found, exiting
echo check your NDK for it and add to path
exit 1
fi
aapt_path=$(which aapt)
if [[ $? == 0 ]];
then
echo using $aapt_path
else
echo aapt not found, exiting
echo check your NDK for it and add to path
exit 1
fi
jar_path=$(which jar)
if [[ $? == 0 ]];
then
echo using $jar_path
else
echo jar not found, exiting
exit 1
fi
#
# Ensure APKs can be traced
#
apk_badging=$(aapt dump badging $apk)
if [[ $apk_badging != *"uses-permission: name='android.permission.READ_EXTERNAL_STORAGE'"* ]] ||
[[ $apk_badging != *"uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE'"* ]] ||
[[ $apk_badging != *"uses-permission: name='android.permission.INTERNET'"* ]];
then
echo Please package APK with the following permissions:
echo android.permission.READ_EXTERNAL_STORAGE
echo android.permission.WRITE_EXTERNAL_STORAGE
echo android.permission.INTERNET
exit 1
fi
apk_contents=$(jar tvf $apk)
if [[ $apk_contents != *"libVkLayer_screenshot.so"* ]] ||
[[ $apk_contents != *"libVkLayer_vktrace_layer.so"* ]];
then
echo Your APK does not contain the following layers:
echo libVkLayer_screenshot.so
echo libVkLayer_vktrace_layer.so
echo You\'ll need to provide them another way.
echo Continuing...
fi
#
# Start up
#
# We want to halt on errors here
set -e
# Wake up the device
adb $serialFlag shell input keyevent "KEYCODE_MENU"
adb $serialFlag shell input keyevent "KEYCODE_HOME"
# clean up anything lingering from previous runs
adb $serialFlag shell am force-stop $package
adb $serialFlag shell am force-stop com.example.vkreplay
if [[ $(adb $serialFlag shell pm list packages $package) == "package:$package" ]]
then
adb $serialFlag uninstall $package && echo continuing...
fi
if [[ $(adb $serialFlag shell pm list packages com.example.vkreplay) == "package:com.example.vkreplay" ]]
then
adb $serialFlag uninstall com.example.vkreplay && echo continuing...
fi
adb $serialFlag shell rm -f /sdcard/Android/$frame.ppm
adb $serialFlag shell rm -f /sdcard/Android/$package.$frame.vktrace.ppm
adb $serialFlag shell rm -f /sdcard/Android/$package.$frame.vkreplay.ppm
rm -f $package.$frame.vktrace.ppm
rm -f $package.$frame.vkreplay.ppm
rm -f $package.vktrace
rm -f $package\0.vktrace
# Ensure vktrace wasn't already running
let "script_run_time=$(date +%s)-$script_start_time"
killall --older-than "$script_run_time"s vktrace || echo continuing...
# install the latest APK, possibly packaged with vktrace and screenshot
adb $serialFlag install --abi $target_abi $apk
# install vkreplay APK
adb $serialFlag install --abi $target_abi $vkreplay_apk
# trace and screenshot
adb $serialFlag shell setprop debug.vulkan.layer.1 VK_LAYER_LUNARG_vktrace
adb $serialFlag shell setprop debug.vulkan.layer.2 VK_LAYER_LUNARG_screenshot
adb $serialFlag shell pm grant $package android.permission.READ_EXTERNAL_STORAGE
adb $serialFlag shell pm grant $package android.permission.WRITE_EXTERNAL_STORAGE
adb $serialFlag shell setprop debug.vulkan.screenshot $frame
# vktrace
adb $serialFlag reverse tcp:34201 tcp:34201
$vktrace_exe -v full -o $package.vktrace &
adb $serialFlag shell am start $package/$activity
# don't halt on error for this loop
set +e
# wait until trace screenshot arrives, or a timeout
vktrace_seconds=300 # Duration in seconds.
vktrace_end_time=$(( $(date +%s) + vktrace_seconds )) # Calculate end time.
sleep 5 # pause to let the screenshot write finish
until adb $serialFlag shell ls -la /sdcard/Android/$frame.ppm
do
echo "Waiting for $package.vktrace screenshot on $serial"
if [ $(date +%s) -gt $vktrace_end_time ]
then
echo "vktrace timeout reached: $vktrace_seconds seconds"
echo "No vktrace screenshot, closing down"
exit 1
fi
sleep 5
done
# stop our background vktrace
kill $!
# pause for a moment to let our trace file finish writing
sleep 1
# halt on errors here
set -e
# set up for vkreplay
adb $serialFlag shell am force-stop $package
if [ -f $package.vktrace ]; then
adb $serialFlag push $package.vktrace /sdcard/$package.vktrace
fi
if [ -f $package\0.vktrace ]; then
adb $serialFlag push $package\0.vktrace /sdcard/$package.vktrace
fi
# grab the screenshot
adb $serialFlag pull /sdcard/Android/$frame.ppm $package.$frame.vktrace.ppm
adb $serialFlag shell mv /sdcard/Android/$frame.ppm /sdcard/Android/$package.$frame.vktrace.ppm
# replay and screenshot
adb $serialFlag shell setprop debug.vulkan.layer.1 VK_LAYER_LUNARG_screenshot
adb $serialFlag shell setprop debug.vulkan.layer.2 '""'
adb $serialFlag shell setprop debug.vulkan.screenshot $frame
adb $serialFlag shell pm grant com.example.vkreplay android.permission.READ_EXTERNAL_STORAGE
adb $serialFlag shell pm grant com.example.vkreplay android.permission.WRITE_EXTERNAL_STORAGE
sleep 5 # small pause to allow permission to take
# Wake up the device
adb $serialFlag shell input keyevent "KEYCODE_MENU"
adb $serialFlag shell input keyevent "KEYCODE_HOME"
adb $serialFlag shell am start -a android.intent.action.MAIN -c android-intent.category.LAUNCH -n com.example.vkreplay/android.app.NativeActivity --es args "-v\ full\ -t\ /sdcard/$package.vktrace"
# don't halt on the errors in this loop
set +e
# wait until vkreplay screenshot arrives, or a timeout
vkreplay_seconds=300 # Duration in seconds.
vkreplay_end_time=$(( $(date +%s) + vkreplay_seconds )) # Calculate end time.
sleep 5 # pause to let the screenshot write finish
until adb $serialFlag shell ls -la /sdcard/Android/$frame.ppm
do
echo "Waiting for vkreplay screenshot on $serial"
if [ $(date +%s) -gt $vkreplay_end_time ]
then
echo "vkreplay timeout reached: $vkreplay_seconds seconds"
echo "No vkreplay screenshot, closing down"
exit 1
fi
sleep 5
done
# halt on any errors here
set -e
# grab the screenshot
adb $serialFlag pull /sdcard/Android/$frame.ppm $package.$frame.vkreplay.ppm
adb $serialFlag shell mv /sdcard/Android/$frame.ppm /sdcard/Android/$package.$frame.vkreplay.ppm
# clean up
adb $serialFlag shell am force-stop com.example.vkreplay
adb $serialFlag shell setprop debug.vulkan.layer.1 '""'
# don't halt in the exit code below
set +e
# the rest is a quick port from vktracereplay.sh
if [ -t 1 ] ; then
RED='\033[0;31m'
GREEN='\033[0;32m'
NC='\033[0m' # No Color
else
RED=''
GREEN=''
NC=''
fi
cmp -s $package.$frame.vktrace.ppm $package.$frame.vkreplay.ppm
if [ $? -eq 0 ] ; then
printf "$GREEN[ PASSED ]$NC {$apk-$package}\n"
else
printf "$RED[ FAILED ]$NC screenshot file compare failed\n"
printf "$RED[ FAILED ]$NC {$apk-$package}\n"
printf "TEST FAILED\n"
exit 1
fi
exit 0