167 lines
6.0 KiB
PowerShell
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"
|