Skip to content

Instantly share code, notes, and snippets.

@c84c
Last active January 28, 2025 23:37
Show Gist options
  • Save c84c/01a38cd7fc84d26b07122716b95e7b62 to your computer and use it in GitHub Desktop.
Save c84c/01a38cd7fc84d26b07122716b95e7b62 to your computer and use it in GitHub Desktop.
Script to run Vodafone DreamLab app on Android emulator (Linux)
#!/usr/bin/bash
#
# run_dreamlab_android_emulator.sh
#
# Script to start Vodafone DreamLab app on Android emulator to run projects
# supported by DreamLab.
#
# Run this script when you want to support cancer research with your Linux PC
# and without the limitation of DreamLab app (AC charger connected).
#
# Before run this script perform this steps:
# - Create an Android Virtual Device with pre-installed PlayStore and set name
# in my_avd_name variable (eg. my_avd_name="Pixel_4_API_29")
# - Start created AVD
# - Start Play Store (inserting Google credentials)
# - Install Vodafone DreamLab
# https://play.google.com/store/apps/details?id=au.com.vodafone.dreamlabapp
# - Start Vodafone DreamLab to select a project to support
# - Stop emulator
# - Adjust my_avd_name and ANDROID_SDK_PATH variables.
# - Run this script to support cancer research!
#
set -e
#set -x
###############################################################################
# MY_AVD_NAMES: read script arguments or set default AVDS
#
if [ "$#" -eq 0 ]; then
MY_AVD_NAMES=("Pixel_4_API_31_1" "Pixel_4_API_31_2" "Pixel_4_API_31_3" "Pixel_4_API_31_4" "Pixel_4_API_31_5" "Pixel_4_API_31_6")
else
MY_AVD_NAMES=( "$@" )
fi
#
###############################################################################
# ANDROID_SDK_PATH: set Android Sdk path
ANDROID_SDK_PATH="$HOME/Android/Sdk"
# global vars for emulator
EMULATOR_LIB_PATH="$ANDROID_SDK_PATH/emulator/lib64"
QT_EMU_LIB="$ANDROID_SDK_PATH/emulator/lib64/qt/lib"
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$QT_EMU_LIB:$EMULATOR_LIB_PATH"
EMULATOR="$ANDROID_SDK_PATH/emulator/qemu/linux-x86_64/qemu-system-x86_64"
ADB="$ANDROID_SDK_PATH/platform-tools/adb"
TERMINAL="gnome-terminal"
if [ ! -z ${HEADLESS+x} ]; then
echo "Starting headless mode"
OLD_DISPLAY="$DISPLAY"
EMULATOR="$EMULATOR-headless"
TERMINAL="$TERMINAL --display=$DISPLAY "
unset DISPLAY
fi
echo "INFO: Ensure adb is running ..."
$ADB start-server
echo "INFO: adb OK"
# check for AVD_NAMES already running
# Replace array with not started avds
NEW_AVD_NAMES=()
# check which avd of MY_AVD_NAMES is running
for my_avd in ${MY_AVD_NAMES[@]}; do
# get AVD name from adb emu shell
running=0
for dev_serial in $($ADB devices | grep emulator | cut -f1); do
avd_name=$($ADB -s $dev_serial emu avd name | head -1 | dos2unix )
if [[ ! "$my_avd" = "$avd_name" ]]; then
continue
else
echo "WARN: $my_avd already running"
running=1
break
fi
done
if [[ "$running" -eq 0 ]]; then
# not running: save it
NEW_AVD_NAMES+=( "$my_avd" )
fi
done
for i in ${MY_AVD_NAMES[@]}; do
echo "OLD: $i"
done
for j in ${NEW_AVD_NAMES[@]}; do
echo "NEW: $j"
done
if [[ "${#NEW_AVD_NAMES[@]}" -eq 0 ]]; then
# not available devices. exit
echo "WARN: Nothing to run. Exiting"
exit 0
fi
#exit 1
# store PIDs to wait at end
EMULATOR_PIDS=()
for avd_name in ${NEW_AVD_NAMES[@]}; do
echo "INFO: AVD: $avd_name"
echo "INFO: Clean pending operations for $avd_name"
rm -vf $HOME/.android/avd/$avd_name.avd/*.lock
echo "INFO: Starting emulator for $avd_name ..."
# -no-snapshot \
# -no-snapshot-load \
# -no-snapshot-save \
$EMULATOR \
-no-snapshot \
-cores 4 \
-memory 2048 \
-netdelay none \
-netfast \
-netspeed full \
-no-boot-anim \
-avd $avd_name \
&
# 1>/dev/null &
pid=$!
EMULATOR_PIDS+=( $pid )
echo "INFO: Emulator $avd_name started with PID $pid"
sleep 10
done
# get device serial matching avd names
DEVICE_SERIALS=()
for dev_serial in $($ADB devices | grep emulator | cut -f1); do
# wait device is ready
echo "INFO: Waiting $dev_serial is ready ..."
$ADB -s $dev_serial wait-for-device shell 'while [[ -z $(getprop sys.boot_completed) ]]; do sleep 1; done; # input keyevent 82'
echo "INFO: $dev_serial is ready"
# get AVD name from adb emu shell
avd_name=$($ADB -s $dev_serial emu avd name | head -1 | dos2unix )
found=0
for my_avd_name in ${NEW_AVD_NAMES[@]}; do
if [[ "$my_avd_name" == "$avd_name" ]] ; then
DEVICE_SERIALS+=( $dev_serial )
found=1
break
fi
done
if [[ "$found" -eq 0 ]]; then
# not one of our avd/device. skipping
continue
fi
# sleep to ensure network is available
sleep 12
# set AC powered
echo "INFO: $avd_name: Set AC powered"
$ADB -s $dev_serial shell dumpsys battery set ac 1
sleep 5
# set battery charging
echo "INFO: $avd_name: Set battery state CHARGING DONE!"
$ADB -s $dev_serial shell dumpsys battery set status 3
sleep 5
echo "INFO: $avd_name: Starting Vodafone DreamLab ..."
# start au.com.vodafone.dreamlabapp simulating tap
$ADB -s $dev_serial shell monkey -p "au.com.vodafone.dreamlabapp" -c "android.intent.category.LAUNCHER" 1 1>/dev/null
echo "INFO: $avd_name: Started Vodafone DreamLab!"
sleep 10
echo "INFO: $avd_name: Lock screen to decrease CPU usage"
$ADB -s $dev_serial shell input keyevent 26 1>/dev/null
echo "INFO: $avd_name: Start monitoring"
export LD_PRELOAD=/usr/lib64/libfreetype.so.6
$TERMINAL --tab -t "$avd_name top" -- $ADB -s $dev_serial shell top -m 10 -o USER,%CPU,TIME+,%MEM,CMDLINE -s 2
done
trap_handler()
{
echo "INFO: Exiting tasks ..."
# kill emulator
for dev_serial in ${DEVICE_SERIALS[@]}; do
"$ADB" -s "$dev_serial" emu quit
done
echo "INFO: Emulators killed"
#$ADB kill-server
#echo "adb server killed"
}
# wait SIGINT to kill script
echo "Waiting exit signal (Ctrl+c or SIGTERM)..."
trap trap_handler SIGINT SIGTERM
for pid in ${EMULATOR_PIDS[@]}; do
wait $pid
done
sleep 3
echo "Bye Bye"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment