#requires -Version 5 param( [string]$RepoRoot = (Resolve-Path (Join-Path $PSScriptRoot "..\..")).Path, [string]$AndroidHome = $env:ANDROID_HOME, [switch]$SetEnvironment, [switch]$InstallMissing ) $ErrorActionPreference = "Stop" function Fail([string]$Message) { Write-Error $Message exit 1 } function Get-CommandPath([string]$Name) { $cmd = Get-Command $Name -ErrorAction SilentlyContinue if ($null -eq $cmd) { return $null } return $cmd.Source } function Parse-AndroidCompileVersion([string]$AndroidProjectDir) { $buildFile = Join-Path $AndroidProjectDir "app\build.gradle" if (-not (Test-Path $buildFile)) { return $null } $content = Get-Content $buildFile -Raw $compileMatch = [regex]::Match($content, '(?m)^\s*compileSdk\s+([0-9]+)\s*$') if ($compileMatch.Success) { return $compileMatch.Groups[1].Value } return $null } function Get-AndroidSdkHome([string]$CandidateHome) { $candidates = @( $CandidateHome, "C:\Android\Sdk", "$env:LOCALAPPDATA\Android\Sdk", "$env:USERPROFILE\AppData\Local\Android\Sdk" ) | Where-Object { $_ -and (Test-Path $_) } | Select-Object -Unique foreach ($candidate in $candidates) { if ((Test-Path (Join-Path $candidate "platform-tools")) -and (Test-Path (Join-Path $candidate "platforms"))) { return $candidate } } if ($candidates.Count -gt 0) { return $candidates[0] } return $null } Write-Host "=== RAP: подготовка Android среды сборки ===" $repoRoot = (Resolve-Path $RepoRoot).ProviderPath if (-not $repoRoot) { Fail "RepoRoot не найден: $RepoRoot" } $androidProject = Join-Path $repoRoot "clients\android" if (-not (Test-Path $androidProject)) { Fail "Не найден проект clients\android: $androidProject" } $compileSdk = Parse-AndroidCompileVersion $androidProject if ([string]::IsNullOrWhiteSpace($compileSdk)) { $compileSdk = "35" } $java = Get-CommandPath "java" if (-not $java) { Write-Host "Не найден java в PATH. Установи JDK 17+: winget install EclipseAdoptium.Temurin.17.JDK или choco install temurin17" Fail "Зависимость Java отсутствует." } $javaVersion = (& $java -version 2>&1 | Select-Object -First 1) if ($javaVersion -match 'version\s+"(\d+)\.' ) { $major = [int]$matches[1] Write-Host "Java: $java ($major)" if ($major -lt 17) { Write-Host "Найден Java $major, нужен JDK 17+." Fail "Нужен Java 17 или новее." } } else { Write-Host "Java найден, версия не распознана: $javaVersion" } $gradle = Get-CommandPath "gradle" if (-not $gradle) { Write-Host "Не найден gradle в PATH. Установи: winget install Gradle.Gradle / choco install gradle" Fail "Зависимость Gradle отсутствует." } Write-Host "Gradle: $gradle" $sdkRoot = Get-AndroidSdkHome $AndroidHome if (-not $sdkRoot) { Write-Host "Не найден Android SDK. Укажи -AndroidHome или установи SDK в C:\Android\Sdk." Fail "Android SDK не найден." } Write-Host "Android SDK: $sdkRoot" $cmdlineTools = Join-Path $sdkRoot "cmdline-tools\latest\bin\sdkmanager.bat" if (-not (Test-Path $cmdlineTools)) { Write-Host "Не найден Android cmdline-tools ($cmdlineTools)." Write-Host "Установи Android SDK Command-line Tools через Android Studio или вручную скачай SDK Manager." Fail "cmdline-tools не найдены." } Write-Host "sdkmanager: $cmdlineTools" Write-Host "Поддерживаем compileSdk: $compileSdk" $requiredComponents = @( "platform-tools", "platforms;android-$compileSdk", "build-tools;35.0.1" ) $missingComponents = @() foreach ($component in $requiredComponents) { switch -Regex ($component) { "^platform-tools$" { if (-not (Test-Path (Join-Path $sdkRoot "platform-tools"))) { $missingComponents += $component } } "^platforms;android-(?\d+)$" { if (-not (Test-Path (Join-Path $sdkRoot "platforms\android-$($Matches["api"])"))) { $missingComponents += $component } } "^build-tools;(?.+)$" { if (-not (Test-Path (Join-Path $sdkRoot "build-tools\$($Matches["bt"])"))) { $missingComponents += $component } } default { } } } if ($missingComponents.Count -gt 0) { Write-Host "" Write-Host "Отсутствуют компоненты Android SDK:" $missingComponents | ForEach-Object { Write-Host " - $_" } Write-Host "" $installCmd = "& `"$cmdlineTools`" --sdk_root=`"$sdkRoot`" --install $($missingComponents -join ' ')" Write-Host "Команда установки:" Write-Host " $installCmd" if ($InstallMissing) { Write-Host "Запускаю установку отсутствующих компонентов..." & $cmdlineTools --sdk_root=$sdkRoot --install $missingComponents if ($LASTEXITCODE -ne 0) { Fail "Не удалось установить компоненты через sdkmanager." } Write-Host "Компоненты установлены." } else { Write-Host "Добавь -InstallMissing для автo-установки." } } else { Write-Host "Все базовые компоненты SDK присутствуют." } if ($SetEnvironment) { [Environment]::SetEnvironmentVariable("ANDROID_HOME", $sdkRoot, "User") [Environment]::SetEnvironmentVariable("ANDROID_SDK_ROOT", $sdkRoot, "User") Write-Host "Персистентные переменные ANDROID_HOME/ANDROID_SDK_ROOT сохранены для текущего пользователя." } Write-Host "" Write-Host "Рекомендуется в текущей сессии:" Write-Host " `$env:ANDROID_HOME='$sdkRoot'" Write-Host " `$env:ANDROID_SDK_ROOT='$sdkRoot'" Write-Host "" Write-Host "Готово. После этого запуск:" Write-Host " pwsh -ExecutionPolicy Bypass -File scripts\\android\\build-android-apk.ps1"