| #!/bin/bash |
|
|
| |
| AVD_NAME=$1 |
| START_PORT=${2:-5554} |
| GAPPS_ZIP=$3 |
|
|
| |
| 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 |
|
|
| |
| if [ ! -x "$EMULATOR_PATH" ]; then |
| echo "$(tput setaf 1)Emulator not found at $EMULATOR_PATH$(tput sgr0)" |
| exit 1 |
| fi |
|
|
| |
| 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 |
|
|
| |
| if [ ! -x "$ADB_PATH" ]; then |
| echo "$(tput setaf 1)adb not found at $ADB_PATH$(tput sgr0)" |
| exit 1 |
| fi |
|
|
| |
| 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 |
|
|
| |
| 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 |
|
|
| |
| for pid in $(pgrep -f emulator); do |
| echo "Killing emulator process with PID $pid" |
| kill -9 "$pid" |
| done |
|
|
| |
| "$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 |
|
|
| |
| 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 |
|
|
| |
| if [ "$SOCAT_AVAILABLE" = true ]; then |
| LISTEN_PORT=$((START_PORT + 2)) |
| TARGET_PORT=$((START_PORT + 1)) |
| |
| 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 |
| |
| 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 |
|
|
| |
| 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 |
|
|