mobsf / scripts /start_avd.sh
franyer24's picture
Upload 491 files
e12cd0f verified
Raw
History Blame Contribute Delete
5.24 kB
#!/bin/bash
# Check if START_PORT, AVD_NAME, and open_gapps.zip are provided as arguments
AVD_NAME=$1
START_PORT=${2:-5554}
GAPPS_ZIP=$3
# Determine the emulator path based on OS
if [ "$(uname)" = "Darwin" ]; then
EMULATOR_PATH="$HOME/Library/Android/sdk/emulator/emulator"
elif [ "$(uname)" = "Linux" ]; then
EMULATOR_PATH="$HOME/Android/Sdk/emulator/emulator"
else
echo "$(tput setaf 1)Unsupported OS: $(uname)$(tput sgr0)"
exit 1
fi
# Check if the emulator path exists and is executable
if [ ! -x "$EMULATOR_PATH" ]; then
echo "$(tput setaf 1)Emulator not found at $EMULATOR_PATH$(tput sgr0)"
exit 1
fi
# Locate adb path
if [ -x "$HOME/Android/Sdk/platform-tools/adb" ]; then
ADB_PATH="$HOME/Android/Sdk/platform-tools/adb"
elif [ -x "$HOME/Library/Android/sdk/platform-tools/adb" ]; then
ADB_PATH="$HOME/Library/Android/sdk/platform-tools/adb"
elif command -v adb >/dev/null 2>&1; then
ADB_PATH=$(command -v adb)
else
echo "$(tput setaf 3)adb not found in common locations. Defaulting to 'adb' in PATH.$(tput sgr0)"
ADB_PATH="adb"
fi
# Check if adb is available
if [ ! -x "$ADB_PATH" ]; then
echo "$(tput setaf 1)adb not found at $ADB_PATH$(tput sgr0)"
exit 1
fi
# If no AVD_NAME is provided, list available AVDs and exit
if [ -z "$AVD_NAME" ]; then
echo -e "$(tput bold)Available AVDs:$(tput sgr0)\n"
"$EMULATOR_PATH" -list-avds
echo -e "$(tput bold)\nUse any Android AVD 5.0 - 11.0, up to API 30 without Google Play (production image).$(tput sgr0)"
echo "$(tput bold)Usage: $0 AVD_NAME [START_PORT] [open_gapps.zip path]$(tput sgr0)"
echo "$(tput bold)Example: $0 Pixel_6_Pro_API_28 5554 /path/to/open_gapps.zip$(tput sgr0)"
exit 1
fi
# Check if provided AVD_NAME exists in available AVDs
AVAILABLE_AVDS=$("$EMULATOR_PATH" -list-avds)
if ! echo "$AVAILABLE_AVDS" | grep -q "^$AVD_NAME$"; then
echo "$(tput setaf 1)Error: AVD $AVD_NAME not found in available AVDs.$(tput sgr0)"
echo "$(tput bold)Available AVDs:$(tput sgr0)"
echo "$AVAILABLE_AVDS"
exit 1
fi
# Kill any existing emulator processes
for pid in $(pgrep -f emulator); do
echo "Killing emulator process with PID $pid"
kill -9 "$pid"
done
# Start the emulator with user-defined AVD and port
"$EMULATOR_PATH" -avd "$AVD_NAME" -writable-system -no-snapshot -wipe-data -port "$START_PORT" >/dev/null 2>&1 &
echo "$(tput setaf 2)Starting AVD $AVD_NAME on port $START_PORT$(tput sgr0)"
echo "Waiting for emulator to boot..."
"$ADB_PATH" wait-for-device
# Check if socat is available only on Linux
if [ "$(uname)" = "Linux" ]; then
if command -v socat >/dev/null; then
SOCAT_AVAILABLE=true
else
SOCAT_AVAILABLE=false
echo "$(tput setaf 3)Warning: socat is not installed. Skipping port forwarding with socat. This might be required for docker in Linux.$(tput sgr0)"
fi
else
SOCAT_AVAILABLE=false
fi
# Increment ports and start socat listeners if socat is available
if [ "$SOCAT_AVAILABLE" = true ]; then
LISTEN_PORT=$((START_PORT + 2))
TARGET_PORT=$((START_PORT + 1))
# Remove all previous forwards
for pid in $(lsof -t -i TCP:$LISTEN_PORT -sTCP:LISTEN -c socat); do
echo "Killing socat process on port $LISTEN_PORT with PID $pid"
kill -9 "$pid"
done
# Start a single socat listener
socat TCP-LISTEN:$LISTEN_PORT,fork,reuseaddr TCP:localhost:$TARGET_PORT &
echo "socat listener started on port $LISTEN_PORT forwarding to $TARGET_PORT in the host."
echo "$(tput bold)Docker users please set the environment variable MOBSF_ANALYZER_IDENTIFIER=host.docker.internal:$LISTEN_PORT for adb connectivity.$(tput sgr0)"
fi
# Install Play Store if open_gapps.zip is provided
if [ -n "$GAPPS_ZIP" ]; then
if [ ! -f "$GAPPS_ZIP" ]; then
echo "$(tput setaf 1)Error: File $GAPPS_ZIP not found.$(tput sgr0)"
exit 1
fi
echo "Installing PlayStore"
if ! command -v unzip >/dev/null; then
echo "$(tput setaf 1)Error: unzip is not installed.$(tput sgr0)"
exit 1
fi
if ! command -v lzip >/dev/null; then
echo "$(tput setaf 1)Error: lzip is not installed.$(tput sgr0)"
exit 1
fi
PLAY_EXTRACT_DIR="play"
[ -d "$PLAY_EXTRACT_DIR" ] && rm -rf $PLAY_EXTRACT_DIR
unzip "$GAPPS_ZIP" 'Core/*' -d ./$PLAY_EXTRACT_DIR || { echo "$(tput setaf 1)Error: Unzip failed$(tput sgr0)"; exit 1; }
rm $PLAY_EXTRACT_DIR/Core/setup*
lzip -d $PLAY_EXTRACT_DIR/Core/*.lz || { echo "$(tput setaf 1)Error: Decompression failed$(tput sgr0)"; exit 1; }
for f in $(ls $PLAY_EXTRACT_DIR/Core/*.tar); do
tar -x --strip-components 2 -f $f -C $PLAY_EXTRACT_DIR || { echo "$(tput setaf 1)Error: Extraction failed$(tput sgr0)"; exit 1; }
done
echo "Waiting for the emulator to be ready..."
sleep 25
echo "Installing PlayStore components"
"$ADB_PATH" root
"$ADB_PATH" remount >/dev/null 2>&1
"$ADB_PATH" push $PLAY_EXTRACT_DIR/etc /system
"$ADB_PATH" push $PLAY_EXTRACT_DIR/framework /system
"$ADB_PATH" push $PLAY_EXTRACT_DIR/app /system
"$ADB_PATH" push $PLAY_EXTRACT_DIR/priv-app /system
"$ADB_PATH" shell stop
"$ADB_PATH" shell start
[ -d "$PLAY_EXTRACT_DIR" ] && rm -rf $PLAY_EXTRACT_DIR
echo "PlayStore installed successfully"
else
echo "$(tput setaf 3)No open_gapps.zip provided. Skipping Play Store installation.$(tput sgr0)"
fi