Files
rdp-proxy/scripts/android/prepare-android-build-environment.ps1
2026-05-12 21:02:29 +03:00

167 lines
6.0 KiB
PowerShell

#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-(?<api>\d+)$" {
if (-not (Test-Path (Join-Path $sdkRoot "platforms\android-$($Matches["api"])"))) { $missingComponents += $component }
}
"^build-tools;(?<bt>.+)$" {
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"