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 "$@"
 | |
| 
 |