You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
389 lines
11 KiB
389 lines
11 KiB
#!/bin/bash
|
|
# avd-resource-checker.sh
|
|
# Author: Matthew Raymer
|
|
# Date: 2025-01-27
|
|
# Description: Check system resources and recommend optimal AVD configuration
|
|
|
|
set -e
|
|
|
|
# Source common utilities
|
|
source "$(dirname "$0")/common.sh"
|
|
|
|
# Colors for output
|
|
RED_COLOR='\033[0;31m'
|
|
GREEN_COLOR='\033[0;32m'
|
|
YELLOW_COLOR='\033[1;33m'
|
|
BLUE_COLOR='\033[0;34m'
|
|
NC_COLOR='\033[0m' # No Color
|
|
|
|
# Function to print colored output
|
|
print_status() {
|
|
local color=$1
|
|
local message=$2
|
|
echo -e "${color}${message}${NC_COLOR}"
|
|
}
|
|
|
|
# Function to get system memory in MB
|
|
get_system_memory() {
|
|
if command -v free >/dev/null 2>&1; then
|
|
free -m | awk 'NR==2{print $2}'
|
|
else
|
|
echo "0"
|
|
fi
|
|
}
|
|
|
|
# Function to get available memory in MB
|
|
get_available_memory() {
|
|
if command -v free >/dev/null 2>&1; then
|
|
free -m | awk 'NR==2{print $7}'
|
|
else
|
|
echo "0"
|
|
fi
|
|
}
|
|
|
|
# Function to get CPU core count
|
|
get_cpu_cores() {
|
|
if command -v nproc >/dev/null 2>&1; then
|
|
nproc
|
|
elif [ -f /proc/cpuinfo ]; then
|
|
grep -c ^processor /proc/cpuinfo
|
|
else
|
|
echo "1"
|
|
fi
|
|
}
|
|
|
|
# Function to check GPU capabilities
|
|
check_gpu_capabilities() {
|
|
local gpu_type="unknown"
|
|
local gpu_memory="0"
|
|
|
|
# Check for NVIDIA GPU
|
|
if command -v nvidia-smi >/dev/null 2>&1; then
|
|
gpu_type="nvidia"
|
|
gpu_memory=$(nvidia-smi --query-gpu=memory.total --format=csv,noheader,nounits 2>/dev/null | head -1 || echo "0")
|
|
print_status $GREEN_COLOR "✓ NVIDIA GPU detected (${gpu_memory}MB VRAM)"
|
|
return 0
|
|
fi
|
|
|
|
# Check for AMD GPU
|
|
if command -v rocm-smi >/dev/null 2>&1; then
|
|
gpu_type="amd"
|
|
print_status $GREEN_COLOR "✓ AMD GPU detected"
|
|
return 0
|
|
fi
|
|
|
|
# Check for Intel GPU
|
|
if lspci 2>/dev/null | grep -i "vga.*intel" >/dev/null; then
|
|
gpu_type="intel"
|
|
print_status $YELLOW_COLOR "✓ Intel integrated GPU detected"
|
|
return 1
|
|
fi
|
|
|
|
# Check for generic GPU
|
|
if lspci 2>/dev/null | grep -i "vga" >/dev/null; then
|
|
gpu_type="generic"
|
|
print_status $YELLOW_COLOR "✓ Generic GPU detected"
|
|
return 1
|
|
fi
|
|
|
|
print_status $RED_COLOR "✗ No GPU detected"
|
|
return 2
|
|
}
|
|
|
|
# Function to check if hardware acceleration is available
|
|
check_hardware_acceleration() {
|
|
local gpu_capable=$1
|
|
|
|
if [ $gpu_capable -eq 0 ]; then
|
|
print_status $GREEN_COLOR "✓ Hardware acceleration recommended"
|
|
return 0
|
|
elif [ $gpu_capable -eq 1 ]; then
|
|
print_status $YELLOW_COLOR "⚠ Limited hardware acceleration"
|
|
return 1
|
|
else
|
|
print_status $RED_COLOR "✗ No hardware acceleration available"
|
|
return 2
|
|
fi
|
|
}
|
|
|
|
# Function to recommend AVD configuration
|
|
recommend_avd_config() {
|
|
local total_memory=$1
|
|
local available_memory=$2
|
|
local cpu_cores=$3
|
|
local gpu_capable=$4
|
|
|
|
print_status $BLUE_COLOR "\n=== AVD Configuration Recommendation ==="
|
|
|
|
# Calculate recommended memory (leave 2GB for system)
|
|
local system_reserve=2048
|
|
local recommended_memory=$((available_memory - system_reserve))
|
|
|
|
# Cap memory at reasonable limits
|
|
if [ $recommended_memory -gt 4096 ]; then
|
|
recommended_memory=4096
|
|
elif [ $recommended_memory -lt 1024 ]; then
|
|
recommended_memory=1024
|
|
fi
|
|
|
|
# Calculate recommended cores (leave 2 cores for system)
|
|
local recommended_cores=$((cpu_cores - 2))
|
|
if [ $recommended_cores -lt 1 ]; then
|
|
recommended_cores=1
|
|
elif [ $recommended_cores -gt 4 ]; then
|
|
recommended_cores=4
|
|
fi
|
|
|
|
# Determine GPU setting
|
|
local gpu_setting=""
|
|
case $gpu_capable in
|
|
0) gpu_setting="-gpu host" ;;
|
|
1) gpu_setting="-gpu swiftshader_indirect" ;;
|
|
2) gpu_setting="-gpu swiftshader_indirect" ;;
|
|
esac
|
|
|
|
# Generate recommendation
|
|
print_status $GREEN_COLOR "Recommended AVD Configuration:"
|
|
echo " Memory: ${recommended_memory}MB"
|
|
echo " Cores: ${recommended_cores}"
|
|
echo " GPU: ${gpu_setting}"
|
|
|
|
# Get AVD name from function parameter (passed from main)
|
|
local avd_name=$5
|
|
local command="emulator -avd ${avd_name} -no-audio -memory ${recommended_memory} -cores ${recommended_cores} ${gpu_setting} &"
|
|
|
|
print_status $BLUE_COLOR "\nGenerated Command:"
|
|
echo " ${command}"
|
|
|
|
# Save to file for easy execution
|
|
local script_file="/tmp/start-avd-${avd_name}.sh"
|
|
cat > "$script_file" << EOF
|
|
#!/bin/bash
|
|
# Auto-generated AVD startup script
|
|
# Generated by avd-resource-checker.sh on $(date)
|
|
|
|
echo "Starting AVD: ${avd_name}"
|
|
echo "Memory: ${recommended_memory}MB"
|
|
echo "Cores: ${recommended_cores}"
|
|
echo "GPU: ${gpu_setting}"
|
|
|
|
${command}
|
|
|
|
echo "AVD started in background"
|
|
echo "Check status with: adb devices"
|
|
echo "View logs with: adb logcat"
|
|
EOF
|
|
|
|
chmod +x "$script_file"
|
|
print_status $GREEN_COLOR "\n✓ Startup script saved to: ${script_file}"
|
|
|
|
return 0
|
|
}
|
|
|
|
# Function to test AVD startup
|
|
test_avd_startup() {
|
|
local avd_name=$1
|
|
local test_duration=${2:-30}
|
|
|
|
print_status $BLUE_COLOR "\n=== Testing AVD Startup ==="
|
|
|
|
# Check if AVD exists
|
|
if ! avdmanager list avd | grep -q "$avd_name"; then
|
|
print_status $RED_COLOR "✗ AVD '$avd_name' not found"
|
|
return 1
|
|
fi
|
|
|
|
print_status $YELLOW_COLOR "Testing AVD startup for ${test_duration} seconds..."
|
|
|
|
# Start emulator in test mode
|
|
emulator -avd "$avd_name" -no-audio -no-window -no-snapshot -memory 1024 -cores 1 -gpu swiftshader_indirect &
|
|
local emulator_pid=$!
|
|
|
|
# Wait for boot
|
|
local boot_time=0
|
|
local max_wait=$test_duration
|
|
|
|
while [ $boot_time -lt $max_wait ]; do
|
|
if adb devices | grep -q "emulator.*device"; then
|
|
print_status $GREEN_COLOR "✓ AVD booted successfully in ${boot_time} seconds"
|
|
break
|
|
fi
|
|
sleep 2
|
|
boot_time=$((boot_time + 2))
|
|
done
|
|
|
|
# Cleanup
|
|
kill $emulator_pid 2>/dev/null || true
|
|
adb emu kill 2>/dev/null || true
|
|
|
|
if [ $boot_time -ge $max_wait ]; then
|
|
print_status $RED_COLOR "✗ AVD failed to boot within ${test_duration} seconds"
|
|
return 1
|
|
fi
|
|
|
|
return 0
|
|
}
|
|
|
|
# Function to list available AVDs
|
|
list_available_avds() {
|
|
print_status $BLUE_COLOR "\n=== Available AVDs ==="
|
|
|
|
if ! command -v avdmanager >/dev/null 2>&1; then
|
|
print_status $RED_COLOR "✗ avdmanager not found. Please install Android SDK command line tools."
|
|
return 1
|
|
fi
|
|
|
|
local avd_list=$(avdmanager list avd 2>/dev/null)
|
|
if [ -z "$avd_list" ]; then
|
|
print_status $YELLOW_COLOR "⚠ No AVDs found. Create one with:"
|
|
echo " avdmanager create avd --name TimeSafari_Emulator --package system-images;android-34;google_apis;x86_64"
|
|
return 1
|
|
fi
|
|
|
|
echo "$avd_list"
|
|
return 0
|
|
}
|
|
|
|
# Function to create optimized AVD
|
|
create_optimized_avd() {
|
|
local avd_name=$1
|
|
local memory=$2
|
|
local cores=$3
|
|
|
|
print_status $BLUE_COLOR "\n=== Creating Optimized AVD ==="
|
|
|
|
# Check if system image is available
|
|
local system_image="system-images;android-34;google_apis;x86_64"
|
|
if ! sdkmanager --list | grep -q "$system_image"; then
|
|
print_status $YELLOW_COLOR "Installing system image: $system_image"
|
|
sdkmanager "$system_image"
|
|
fi
|
|
|
|
# Create AVD
|
|
print_status $YELLOW_COLOR "Creating AVD: $avd_name"
|
|
avdmanager create avd \
|
|
--name "$avd_name" \
|
|
--package "$system_image" \
|
|
--device "pixel_7" \
|
|
--force
|
|
|
|
# Configure AVD
|
|
local avd_config_file="$HOME/.android/avd/${avd_name}.avd/config.ini"
|
|
if [ -f "$avd_config_file" ]; then
|
|
print_status $YELLOW_COLOR "Configuring AVD settings..."
|
|
|
|
# Set memory
|
|
sed -i "s/vm.heapSize=.*/vm.heapSize=${memory}/" "$avd_config_file"
|
|
|
|
# Set cores
|
|
sed -i "s/hw.cpu.ncore=.*/hw.cpu.ncore=${cores}/" "$avd_config_file"
|
|
|
|
# Disable unnecessary features
|
|
echo "hw.audioInput=no" >> "$avd_config_file"
|
|
echo "hw.audioOutput=no" >> "$avd_config_file"
|
|
echo "hw.camera.back=none" >> "$avd_config_file"
|
|
echo "hw.camera.front=none" >> "$avd_config_file"
|
|
echo "hw.gps=no" >> "$avd_config_file"
|
|
echo "hw.sensors.orientation=no" >> "$avd_config_file"
|
|
echo "hw.sensors.proximity=no" >> "$avd_config_file"
|
|
|
|
print_status $GREEN_COLOR "✓ AVD configured successfully"
|
|
fi
|
|
|
|
return 0
|
|
}
|
|
|
|
# Main function
|
|
main() {
|
|
print_status $BLUE_COLOR "=== TimeSafari AVD Resource Checker ==="
|
|
print_status $BLUE_COLOR "Checking system resources and recommending optimal AVD configuration\n"
|
|
|
|
# Get system information
|
|
local total_memory=$(get_system_memory)
|
|
local available_memory=$(get_available_memory)
|
|
local cpu_cores=$(get_cpu_cores)
|
|
|
|
print_status $BLUE_COLOR "=== System Information ==="
|
|
echo "Total Memory: ${total_memory}MB"
|
|
echo "Available Memory: ${available_memory}MB"
|
|
echo "CPU Cores: ${cpu_cores}"
|
|
|
|
# Check GPU capabilities
|
|
print_status $BLUE_COLOR "\n=== GPU Analysis ==="
|
|
check_gpu_capabilities
|
|
local gpu_capable=$?
|
|
|
|
# Check hardware acceleration
|
|
check_hardware_acceleration $gpu_capable
|
|
local hw_accel=$?
|
|
|
|
# List available AVDs
|
|
list_available_avds
|
|
|
|
# Get AVD name from user or use default
|
|
local avd_name="TimeSafari_Emulator"
|
|
if [ $# -gt 0 ]; then
|
|
avd_name="$1"
|
|
fi
|
|
|
|
# Recommend configuration
|
|
recommend_avd_config $total_memory $available_memory $cpu_cores $gpu_capable "$avd_name"
|
|
|
|
# Test AVD if requested
|
|
if [ "$2" = "--test" ]; then
|
|
test_avd_startup "$avd_name"
|
|
fi
|
|
|
|
# Create optimized AVD if requested
|
|
if [ "$2" = "--create" ]; then
|
|
local recommended_memory=$((available_memory - 2048))
|
|
if [ $recommended_memory -gt 4096 ]; then
|
|
recommended_memory=4096
|
|
elif [ $recommended_memory -lt 1024 ]; then
|
|
recommended_memory=1024
|
|
fi
|
|
|
|
local recommended_cores=$((cpu_cores - 2))
|
|
if [ $recommended_cores -lt 1 ]; then
|
|
recommended_cores=1
|
|
elif [ $recommended_cores -gt 4 ]; then
|
|
recommended_cores=4
|
|
fi
|
|
|
|
create_optimized_avd "$avd_name" $recommended_memory $recommended_cores
|
|
fi
|
|
|
|
print_status $GREEN_COLOR "\n=== Resource Check Complete ==="
|
|
print_status $YELLOW_COLOR "Tip: Use the generated startup script for consistent AVD launches"
|
|
}
|
|
|
|
# Show help
|
|
show_help() {
|
|
echo "Usage: $0 [AVD_NAME] [OPTIONS]"
|
|
echo ""
|
|
echo "Options:"
|
|
echo " --test Test AVD startup (30 second test)"
|
|
echo " --create Create optimized AVD with recommended settings"
|
|
echo " --help Show this help message"
|
|
echo ""
|
|
echo "Examples:"
|
|
echo " $0 # Check resources and recommend config"
|
|
echo " $0 TimeSafari_Emulator # Check resources for specific AVD"
|
|
echo " $0 TimeSafari_Emulator --test # Test AVD startup"
|
|
echo " $0 TimeSafari_Emulator --create # Create optimized AVD"
|
|
echo ""
|
|
echo "The script will:"
|
|
echo " - Analyze system resources (RAM, CPU, GPU)"
|
|
echo " - Recommend optimal AVD configuration"
|
|
echo " - Generate startup command and script"
|
|
echo " - Optionally test or create AVD"
|
|
}
|
|
|
|
# Parse command line arguments
|
|
if [ "$1" = "--help" ] || [ "$1" = "-h" ]; then
|
|
show_help
|
|
exit 0
|
|
fi
|
|
|
|
# Run main function
|
|
main "$@"
|
|
|