# 启动本机模拟器并装上 debug APK。 # # 之所以写这个脚本而不是让人手敲:这台机器上 Gradle 与 emulator 都需要几个 # 环境变量(受限沙箱下 ~/.android 不可写、%TEMP% 不可写),漏一个就报 # "AccessDeniedException" 或 "Could not connect to Kotlin compile daemon"。 # # pwsh -File android/scripts/emulator.ps1 # 只启动模拟器 # pwsh -File android/scripts/emulator.ps1 -Install # 顺带编译并安装 APK # # 首次使用前需要有: # - JDK 17(默认 .local/jdk17/...,可用 -JdkHome 覆盖) # - Android SDK platform 35 + system-images;android-35;google_apis;x86_64 # - 已创建的 AVD(默认名 dadao,可用 -AvdName 覆盖) param( [switch]$Install, [string]$AvdName = "dadao", [string]$JdkHome = "", [string]$SdkHome = "$env:LOCALAPPDATA\Android\Sdk" ) $ErrorActionPreference = "Stop" $repo = Split-Path -Parent (Split-Path -Parent $PSScriptRoot) # android/.. -> 仓库根 $local = Join-Path $repo ".local" if (-not $JdkHome) { $JdkHome = Join-Path $local "jdk17\jdk-17.0.21.0.2+1" } if (-not (Test-Path $JdkHome)) { throw "找不到 JDK 17:$JdkHome(用 -JdkHome 指定)" } if (-not (Test-Path (Join-Path $SdkHome "platform-tools\adb.exe"))) { throw "找不到 Android SDK:$SdkHome" } # 这几个目录必须是可写的,否则 Gradle/Kotlin/AGP 会以各种 AccessDenied 失败 $env:JAVA_HOME = $JdkHome $env:GRADLE_USER_HOME = Join-Path $local "gradle-home" $env:ANDROID_HOME = $SdkHome $env:ANDROID_SDK_ROOT = $SdkHome $env:ANDROID_USER_HOME = Join-Path $local "android-user" $env:ANDROID_AVD_HOME = Join-Path $local "android-avd" $env:TEMP = Join-Path $local "tmp" $env:TMP = $env:TEMP foreach ($d in @($env:GRADLE_USER_HOME, $env:ANDROID_USER_HOME, $env:ANDROID_AVD_HOME, $env:TEMP)) { New-Item -ItemType Directory -Force -Path $d | Out-Null } $adb = Join-Path $SdkHome "platform-tools\adb.exe" $emulator = Join-Path $SdkHome "emulator\emulator.exe" if ($Install) { Push-Location (Join-Path $repo "android") try { & (Join-Path $local "gradle-8.13\bin\gradle.bat") :app:assembleDebug --no-daemon --console=plain } finally { Pop-Location } } & $adb start-server | Out-Null $running = & $adb devices | Select-String "emulator-\d+\s+device" if (-not $running) { Write-Host "启动模拟器 $AvdName ..." Start-Process -FilePath $emulator -ArgumentList @( "-avd", $AvdName, "-no-window", "-no-audio", "-no-boot-anim", "-no-snapshot", "-gpu", "swiftshader_indirect" ) -WindowStyle Hidden } Write-Host "等待开机完成 ..." for ($i = 0; $i -lt 60; $i++) { Start-Sleep -Seconds 5 $boot = (& $adb shell getprop sys.boot_completed 2>$null) -join "" if ($boot.Trim() -eq "1") { break } } if ($boot.Trim() -ne "1") { throw "模拟器 5 分钟内没起来,看 $local\emulator.log" } if ($Install) { $apk = Join-Path $repo "android\app\build\outputs\apk\debug\app-debug.apk" & $adb install -r $apk & $adb shell am start -n com.dadao.task/.MainActivity | Out-Null Write-Host "已安装并启动。后端要在 8100 端口,模拟器通过 10.0.2.2 访问宿主机。" } else { Write-Host "模拟器就绪。" }