diff --git a/images/windows/scripts/build/Install-AndroidSDK.ps1 b/images/windows/scripts/build/Install-AndroidSDK.ps1 index 626cb43b9..5233e92b1 100644 --- a/images/windows/scripts/build/Install-AndroidSDK.ps1 +++ b/images/windows/scripts/build/Install-AndroidSDK.ps1 @@ -4,6 +4,58 @@ ## Supply chain security: checksum validation ################################################################################ +# Actual Android SDK installation directory +$SDKInstallRoot = "C:\Program Files (x86)\Android\android-sdk" + +# Hardlink to the Android SDK installation directory with no spaces in the path. +# ANDROID_NDK* env vars should not contain spaces, otherwise ndk-build.cmd gives an error +# https://github.com/actions/runner-images/issues/1122 +$SDKRootPath = "C:\Android\android-sdk" + +#region functions +function Install-AndroidSDKPackages { + <# + .SYNOPSIS + This function installs the specified Android SDK packages. + + .DESCRIPTION + The Install-AndroidSDKPackages function takes an array of package names as a parameter and installs each of them using the sdkmanager.bat script. + + .PARAMETER Packages + An array of package names in the format of SDK-style paths to be installed. + + .EXAMPLE + Install-AndroidSDKPackages -Packages "platforms;android-29", "build-tools;29.0.2" + + This command installs the Android SDK Platform 29 and Build-Tools 29.0.2. + + #> + Param + ( + [Parameter(Mandatory = $true)] + [AllowEmptyCollection()] + [AllowNull()] + [string[]]$Packages + ) + + # The sdkmanager.bat script is used to install Android SDK packages. + $SDKManager = "$SDKRootPath\cmdline-tools\latest\bin\sdkmanager.bat" + + $errors = @() + + foreach ($package in $Packages) { + & $SDKManager --install "$package" --sdk_root=$SDKRootPath + if ($LASTEXITCODE -ne 0) { + $errors += "Failed to install package $package with exit code $LASTEXITCODE" + } + } + + if ($errors.Count -gt 0) { + throw $errors + } +} +#endregion + # get packages to install from the toolset $androidToolset = (Get-ToolsetContent).android # Newer version(s) require Java 11 by default @@ -17,21 +69,17 @@ $localFileHash = (Get-FileHash -Path $cmdlineToolsArchPath -Algorithm SHA256).Ha Use-ChecksumComparison -LocalFileHash $localFileHash -DistributorFileHash $androidToolset.hash #endregion -$sdkInstallRoot = "C:\Program Files (x86)\Android\android-sdk" -$sdkRoot = "C:\Android\android-sdk" -Expand-7ZipArchive -Path $cmdlineToolsArchPath -DestinationPath "${sdkInstallRoot}\cmdline-tools" +Expand-7ZipArchive -Path $cmdlineToolsArchPath -DestinationPath "${SDKInstallRoot}\cmdline-tools" -# cmdline tools should be installed in ${sdkInstallRoot}\cmdline-tools\latest\bin, but archive contains ${sdkInstallRoot}\cmdline-tools\bin +# cmdline tools should be installed in ${SDKInstallRoot}\cmdline-tools\latest\bin, but archive contains ${SDKInstallRoot}\cmdline-tools\bin # we need to create the proper folder structure Invoke-SBWithRetry -Command { - Rename-Item "${sdkInstallRoot}\cmdline-tools\cmdline-tools" "latest" -ErrorAction Stop + Rename-Item "${SDKInstallRoot}\cmdline-tools\cmdline-tools" "latest" -ErrorAction Stop } -# ANDROID_NDK_PATH/HOME should not contain spaces. Otherwise, the script ndk-build.cmd gives an error https://github.com/actions/runner-images/issues/1122 -# create "C:\Android" directory and a hardlink inside pointed to sdk in Program Files -New-Item -Path "C:\Android" -ItemType Directory -New-Item -Path "$sdkRoot" -ItemType SymbolicLink -Value "$sdkInstallRoot" -$sdkManager = "$sdkRoot\cmdline-tools\latest\bin\sdkmanager.bat" +# Create hardlink at $SDKRootPath pointing to SDK installation directory in Program Files +New-Item -Path (Split-Path $SDKRootPath -Parent) -ItemType Directory -Force +New-Item -Path "$SDKRootPath" -ItemType SymbolicLink -Value "$SDKInstallRoot" # Install the standard Android SDK licenses. Currently, there isn't a better way to do this, # so we are base64-encoded a zip of the licenses directory from another installation. @@ -42,92 +90,73 @@ $sdkManager = "$sdkRoot\cmdline-tools\latest\bin\sdkmanager.bat" # $base64Content = [Convert]::ToBase64String([IO.File]::ReadAllBytes($LicensesZipFileName)) # echo $base64Content # Another possible solution that works in powershell core: -# Write-Ouptut "y" | $sdkManager +# Write-Ouptut "y" | $sdkmanager.bat $licenseContentBase64 = "UEsDBBQAAAAAAKNK11IAAAAAAAAAAAAAAAAJAAAAbGljZW5zZXMvUEsDBAoAAAAAAJ1K11K7n0IrKgAAACoAAAAhAAAAbGljZW5zZXMvYW5kcm9pZC1nb29nbGV0di1saWNlbnNlDQo2MDEwODViOTRjZDc3ZjBiNTRmZjg2NDA2OTU3MDk5ZWJlNzljNGQ2UEsDBAoAAAAAAKBK11LzQumJKgAAACoAAAAkAAAAbGljZW5zZXMvYW5kcm9pZC1zZGstYXJtLWRidC1saWNlbnNlDQo4NTlmMzE3Njk2ZjY3ZWYzZDdmMzBhNTBhNTU2MGU3ODM0YjQzOTAzUEsDBAoAAAAAAKFK11IKSOJFKgAAACoAAAAcAAAAbGljZW5zZXMvYW5kcm9pZC1zZGstbGljZW5zZQ0KMjQzMzNmOGE2M2I2ODI1ZWE5YzU1MTRmODNjMjgyOWIwMDRkMWZlZVBLAwQKAAAAAACiStdSec1a4SoAAAAqAAAAJAAAAGxpY2Vuc2VzL2FuZHJvaWQtc2RrLXByZXZpZXctbGljZW5zZQ0KODQ4MzFiOTQwOTY0NmE5MThlMzA1NzNiYWI0YzljOTEzNDZkOGFiZFBLAwQKAAAAAACiStdSk6vQKCoAAAAqAAAAGwAAAGxpY2Vuc2VzL2dvb2dsZS1nZGstbGljZW5zZQ0KMzNiNmEyYjY0NjA3ZjExYjc1OWYzMjBlZjlkZmY0YWU1YzQ3ZDk3YVBLAwQKAAAAAACiStdSrE3jESoAAAAqAAAAJAAAAGxpY2Vuc2VzL2ludGVsLWFuZHJvaWQtZXh0cmEtbGljZW5zZQ0KZDk3NWY3NTE2OThhNzdiNjYyZjEyNTRkZGJlZWQzOTAxZTk3NmY1YVBLAwQKAAAAAACjStdSkb1vWioAAAAqAAAAJgAAAGxpY2Vuc2VzL21pcHMtYW5kcm9pZC1zeXNpbWFnZS1saWNlbnNlDQplOWFjYWI1YjVmYmI1NjBhNzJjZmFlY2NlODk0Njg5NmZmNmFhYjlkUEsBAj8AFAAAAAAAo0rXUgAAAAAAAAAAAAAAAAkAJAAAAAAAAAAQAAAAAAAAAGxpY2Vuc2VzLwoAIAAAAAAAAQAYACIHOBcRaNcBIgc4FxFo1wHBTVQTEWjXAVBLAQI/AAoAAAAAAJ1K11K7n0IrKgAAACoAAAAhACQAAAAAAAAAIAAAACcAAABsaWNlbnNlcy9hbmRyb2lkLWdvb2dsZXR2LWxpY2Vuc2UKACAAAAAAAAEAGACUEFUTEWjXAZQQVRMRaNcB6XRUExFo1wFQSwECPwAKAAAAAACgStdS80LpiSoAAAAqAAAAJAAkAAAAAAAAACAAAACQAAAAbGljZW5zZXMvYW5kcm9pZC1zZGstYXJtLWRidC1saWNlbnNlCgAgAAAAAAABABgAsEM0FBFo1wGwQzQUEWjXAXb1MxQRaNcBUEsBAj8ACgAAAAAAoUrXUgpI4kUqAAAAKgAAABwAJAAAAAAAAAAgAAAA/AAAAGxpY2Vuc2VzL2FuZHJvaWQtc2RrLWxpY2Vuc2UKACAAAAAAAAEAGAAsMGUVEWjXASwwZRURaNcB5whlFRFo1wFQSwECPwAKAAAAAACiStdSec1a4SoAAAAqAAAAJAAkAAAAAAAAACAAAABgAQAAbGljZW5zZXMvYW5kcm9pZC1zZGstcHJldmlldy1saWNlbnNlCgAgAAAAAAABABgA7s3WFRFo1wHuzdYVEWjXAfGm1hURaNcBUEsBAj8ACgAAAAAAokrXUpOr0CgqAAAAKgAAABsAJAAAAAAAAAAgAAAAzAEAAGxpY2Vuc2VzL2dvb2dsZS1nZGstbGljZW5zZQoAIAAAAAAAAQAYAGRDRxYRaNcBZENHFhFo1wFfHEcWEWjXAVBLAQI/AAoAAAAAAKJK11KsTeMRKgAAACoAAAAkACQAAAAAAAAAIAAAAC8CAABsaWNlbnNlcy9pbnRlbC1hbmRyb2lkLWV4dHJhLWxpY2Vuc2UKACAAAAAAAAEAGADGsq0WEWjXAcayrRYRaNcBxrKtFhFo1wFQSwECPwAKAAAAAACjStdSkb1vWioAAAAqAAAAJgAkAAAAAAAAACAAAACbAgAAbGljZW5zZXMvbWlwcy1hbmRyb2lkLXN5c2ltYWdlLWxpY2Vuc2UKACAAAAAAAAEAGAA4LjgXEWjXATguOBcRaNcBIgc4FxFo1wFQSwUGAAAAAAgACACDAwAACQMAAAAA" $licenseContent = [System.Convert]::FromBase64String($licenseContentBase64) -Set-Content -Path "$sdkInstallRoot\android-sdk-licenses.zip" -Value $licenseContent -Encoding Byte -Expand-7ZipArchive -Path "$sdkInstallRoot\android-sdk-licenses.zip" -DestinationPath $sdkInstallRoot +Set-Content -Path "$SDKInstallRoot\android-sdk-licenses.zip" -Value $licenseContent -Encoding Byte +Expand-7ZipArchive -Path "$SDKInstallRoot\android-sdk-licenses.zip" -DestinationPath $SDKInstallRoot -# install platform-tools -$platformToolsPath = Join-Path -Path $sdkInstallRoot -ChildPath "platform-tools" -# Remove outdated platform-tools that was brought by Visual Studio Android package -if (Test-Path $platformToolsPath) -{ +# Install platform-tools +$platformToolsPath = Join-Path -Path $SDKInstallRoot -ChildPath "platform-tools" +if (Test-Path $platformToolsPath) { Write-Host "Removing previous platform-tools installation from Visual Studio component" Remove-Item $platformToolsPath -Recurse -Force } +Install-AndroidSDKPackages "platform-tools" -Install-AndroidSDKPackages -AndroidSDKManagerPath $sdkManager ` - -AndroidSDKRootPath $sdkRoot ` - -AndroidPackages "platform-tools" +# Get Android SDK packages list +$androidPackages = Get-AndroidPackages -SDKRootPath $SDKRootPath -# get packages info -$androidPackages = Get-AndroidPackages -AndroidSDKManagerPath $sdkManager +# Install Android platform versions +# that are greater than or equal to the minimum version +Write-Host "Installing Android SDK packages for platforms..." +$platformList = Get-AndroidPlatformPackages ` + -SDKRootPath $SDKRootPath ` + -minVersion $androidToolset.platform_min_version +Install-AndroidSDKPackages $platformList -# platforms -[int]$platformMinVersion = $androidToolset.platform_min_version -$platformList = Get-AndroidPackagesByVersion -AndroidPackages $androidPackages ` - -PrefixPackageName "platforms;" ` - -MinimumVersion $platformMinVersion ` - -Delimiter "-" ` - -Index 1 +# Install Android build-tools versions +# that are greater than or equal to the minimum version +Write-Host "Installing Android SDK packages for build tools..." +$buildToolsList = Get-AndroidBuildToolPackages ` + -SDKRootPath $SDKRootPath ` + -minVersion $androidToolset.build_tools_min_version +Install-AndroidSDKPackages $buildToolsList -# build-tools -[version]$buildToolsMinVersion = $androidToolset.build_tools_min_version -$buildToolsList = Get-AndroidPackagesByVersion -AndroidPackages $androidPackages ` - -PrefixPackageName "build-tools;" ` - -MinimumVersion $buildToolsMinVersion ` - -Delimiter ";" ` - -Index 1 +# Install extras, add-ons and additional tools +Write-Host "Installing Android SDK extras, add-ons and additional tools..." +Install-AndroidSDKPackages ($androidToolset.extras | ForEach-Object { "extras;$_" }) +Install-AndroidSDKPackages ($androidToolset.addons | ForEach-Object { "add-ons;$_" }) +Install-AndroidSDKPackages ($androidToolset.additional_tools) -Install-AndroidSDKPackages -AndroidSDKManagerPath $sdkManager ` - -AndroidSDKRootPath $sdkRoot ` - -AndroidPackages $platformList - -Install-AndroidSDKPackages -AndroidSDKManagerPath $sdkManager ` - -AndroidSDKRootPath $sdkRoot ` - -AndroidPackages $buildToolsList - -Install-AndroidSDKPackages -AndroidSDKManagerPath $sdkManager ` - -AndroidSDKRootPath $sdkRoot ` - -AndroidPackages $androidToolset.extra_list ` - -PrefixPackageName "extras;" - -Install-AndroidSDKPackages -AndroidSDKManagerPath $sdkManager ` - -AndroidSDKRootPath $sdkRoot ` - -AndroidPackages $androidToolset.addon_list ` - -PrefixPackageName "add-ons;" - -Install-AndroidSDKPackages -AndroidSDKManagerPath $sdkManager ` - -AndroidSDKRootPath $sdkRoot ` - -AndroidPackages $androidToolset.additional_tools - -# NDKs +# Install NDKs $ndkMajorVersions = $androidToolset.ndk.versions $ndkDefaultMajorVersion = $androidToolset.ndk.default $ndkLatestMajorVersion = $ndkMajorVersions | Select-Object -Last 1 -$androidNDKs = $ndkMajorVersions | Foreach-Object { - Get-AndroidPackagesByName -AndroidPackages $androidPackages -PrefixPackageName "ndk;$_" | Sort-Object -Unique | Select-Object -Last 1 +$androidNDKs = @() +foreach ($version in $ndkMajorVersions) { + $packageNamePrefix = "ndk;$version" + $package = $androidPackages | Where-Object { $_.StartsWith($packageNamePrefix) } | Sort-Object -Unique | Select-Object -Last 1 + $androidNDKs += $package } -Install-AndroidSDKPackages -AndroidSDKManagerPath $sdkManager ` - -AndroidSDKRootPath $sdkRoot ` - -AndroidPackages $androidNDKs +Write-Host "Installing Android SDK packages for NDKs..." +Install-AndroidSDKPackages $androidNDKs $ndkLatestVersion = ($androidNDKs | Where-Object { $_ -match "ndk;$ndkLatestMajorVersion" }).Split(';')[1] $ndkDefaultVersion = ($androidNDKs | Where-Object { $_ -match "ndk;$ndkDefaultMajorVersion" }).Split(';')[1] -$ndkRoot = "$sdkRoot\ndk\$ndkDefaultVersion" +$ndkRoot = "$SDKRootPath\ndk\$ndkDefaultVersion" # Create env variables -[Environment]::SetEnvironmentVariable("ANDROID_HOME", $sdkRoot, "Machine") -[Environment]::SetEnvironmentVariable("ANDROID_SDK_ROOT", $sdkRoot, "Machine") +[Environment]::SetEnvironmentVariable("ANDROID_HOME", $SDKRootPath, "Machine") +[Environment]::SetEnvironmentVariable("ANDROID_SDK_ROOT", $SDKRootPath, "Machine") # ANDROID_NDK, ANDROID_NDK_HOME, and ANDROID_NDK_ROOT variables should be set as many customer builds depend on them https://github.com/actions/runner-images/issues/5879 [Environment]::SetEnvironmentVariable("ANDROID_NDK", $ndkRoot, "Machine") [Environment]::SetEnvironmentVariable("ANDROID_NDK_HOME", $ndkRoot, "Machine") [Environment]::SetEnvironmentVariable("ANDROID_NDK_ROOT", $ndkRoot, "Machine") -$ndkLatestPath = "$sdkRoot\ndk\$ndkLatestVersion" +$ndkLatestPath = "$SDKRootPath\ndk\$ndkLatestVersion" if (Test-Path $ndkLatestPath) { [Environment]::SetEnvironmentVariable("ANDROID_NDK_LATEST_HOME", $ndkLatestPath, "Machine") } else { diff --git a/images/windows/scripts/docs-gen/SoftwareReport.Android.psm1 b/images/windows/scripts/docs-gen/SoftwareReport.Android.psm1 index ac614dd07..ad46586ef 100644 --- a/images/windows/scripts/docs-gen/SoftwareReport.Android.psm1 +++ b/images/windows/scripts/docs-gen/SoftwareReport.Android.psm1 @@ -15,17 +15,6 @@ function Get-AndroidSDKRoot { return "Location $path" } -function Get-AndroidSDKManagerPath { - return Join-Path $env:ANDROID_HOME "cmdline-tools\latest\bin\sdkmanager.bat" -} - -function Get-AndroidInstalledPackages { - $androidSDKManagerPath = Get-AndroidSDKManagerPath - $androidSDKManagerList = cmd /c "$androidSDKManagerPath --list_installed 2>&1" - $androidSDKManagerList = $androidSDKManagerList -notmatch "Warning" - return $androidSDKManagerList -} - function Build-AndroidTable { $packageInfo = Get-AndroidInstalledPackages return @( @@ -84,7 +73,7 @@ function Build-AndroidTable { ) | Where-Object { $_.Version } | ForEach-Object { [PSCustomObject] @{ "Package Name" = $_.Package - "Version" = $_.Version + "Version" = $_.Version } } } @@ -121,7 +110,7 @@ function Get-AndroidPlatformVersions { } function Get-AndroidCommandLineToolsVersion { - $commandLineTools = Get-AndroidSDKManagerPath + $commandLineTools = (Join-Path $env:ANDROID_HOME "cmdline-tools\latest\bin\sdkmanager.bat") (cmd /c "$commandLineTools --version 2>NUL" | Out-String).Trim() -match "(?^(\d+\.){1,}\d+$)" | Out-Null $commandLineToolsVersion = $Matches.Version return $commandLineToolsVersion diff --git a/images/windows/scripts/helpers/ImageHelpers.psm1 b/images/windows/scripts/helpers/ImageHelpers.psm1 index 1db9f5b5a..e83f530a7 100644 --- a/images/windows/scripts/helpers/ImageHelpers.psm1 +++ b/images/windows/scripts/helpers/ImageHelpers.psm1 @@ -40,10 +40,10 @@ Export-ModuleMember -Function @( 'Expand-7ZipArchive' 'Invoke-SBWithRetry' 'Get-VsCatalogJsonPath' - 'Install-AndroidSDKPackages' 'Get-AndroidPackages' - 'Get-AndroidPackagesByName' - 'Get-AndroidPackagesByVersion' + 'Get-AndroidPlatformPackages' + 'Get-AndroidBuildToolPackages' + 'Get-AndroidInstalledPackages' 'Get-VisualStudioInstance' 'Get-VisualStudioComponents' 'Get-WindowsUpdatesHistory' diff --git a/images/windows/scripts/helpers/InstallHelpers.ps1 b/images/windows/scripts/helpers/InstallHelpers.ps1 index 24db81e85..354b22115 100644 --- a/images/windows/scripts/helpers/InstallHelpers.ps1 +++ b/images/windows/scripts/helpers/InstallHelpers.ps1 @@ -431,70 +431,168 @@ function Expand-7ZipArchive { } } -function Install-AndroidSDKPackages { - Param - ( - [Parameter(Mandatory=$true)] - [string]$AndroidSDKManagerPath, - [Parameter(Mandatory=$true)] - [string]$AndroidSDKRootPath, - [Parameter(Mandatory=$true)] - [AllowEmptyCollection()] - [string[]]$AndroidPackages, - [string] $PrefixPackageName - ) - - foreach ($package in $AndroidPackages) { - & $AndroidSDKManagerPath --sdk_root=$AndroidSDKRootPath "$PrefixPackageName$package" - } -} - function Get-AndroidPackages { + <# + .SYNOPSIS + This function returns a list of available Android packages. + + .DESCRIPTION + The Get-AndroidPackages function checks if a list of packages is already available in a file. + If not, it uses the sdkmanager.bat script to generate a list of available packages and saves it to a file. + It then returns the content of this file. + + .PARAMETER SDKRootPath + The root path of the Android SDK installation. + If not specified, the function uses the ANDROID_HOME environment variable. + + .EXAMPLE + Get-AndroidPackages -SDKRootPath "C:\Android\SDK" + + This command returns a list of available Android packages for the specified SDK root path. + + .NOTES + This function requires the Android SDK to be installed and the sdkmanager.bat script to be accessible. + + #> Param ( - [Parameter(Mandatory=$true)] - [string]$AndroidSDKManagerPath + [string]$SDKRootPath ) + + if (-not $SDKRootPath) { + $SDKRootPath = $env:ANDROID_HOME + } - $packagesListFile = "C:\Android\android-sdk\packages-list.txt" + $packagesListFile = "$SDKRootPath\packages-list.txt" + $sdkManager = "$SDKRootPath\cmdline-tools\latest\bin\sdkmanager.bat" if (-Not (Test-Path -Path $packagesListFile -PathType Leaf)) { - (cmd /c "$AndroidSDKManagerPath --list --verbose 2>&1") | - Where-Object { $_ -Match "^[^\s]" } | - Where-Object { $_ -NotMatch "^(Loading |Info: Parsing |---|\[=+|Installed |Available )" } | - Where-Object { $_ -NotMatch "^[^;]*$" } | - Out-File -FilePath $packagesListFile + (cmd /c "$sdkManager --list --verbose 2>&1") | + Where-Object { $_ -Match "^[^\s]" } | + Where-Object { $_ -NotMatch "^(Loading |Info: Parsing |---|\[=+|Installed |Available )" } | + Where-Object { $_ -NotMatch "^[^;]*$" } | + Out-File -FilePath $packagesListFile } return Get-Content $packagesListFile } -function Get-AndroidPackagesByName { - Param ( - [Parameter(Mandatory=$true)] - [string[]]$AndroidPackages, - [Parameter(Mandatory=$true)] - [string]$PrefixPackageName - ) +function Get-AndroidPlatformPackages { + <# + .SYNOPSIS + This function returns a list of available Android platform packages. - return $AndroidPackages | Where-Object { "$_".StartsWith($PrefixPackageName) } + .DESCRIPTION + The Get-AndroidPlatformPackages function uses the Get-AndroidPackages function to get a list of available packages + and filters it to return only platform packages. + + .PARAMETER SDKRootPath + The root path of the Android SDK installation. + If not specified, the function uses the ANDROID_HOME environment variable. + + .PARAMETER minimumVersion + The minimum version of the platform packages to include in the result. Default is 0. + + .EXAMPLE + Get-AndroidPlatformPackages -SDKRootPath "C:\Android\SDK" -minimumVersion 29 + + This command returns a list of available Android platform packages for the specified SDK root path with a minimum version of 29. + + .NOTES + This function requires the Android SDK to be installed and the sdkmanager.bat script to be accessible. + + #> + Param + ( + [string]$SDKRootPath, + [Alias("minVersion")] + [int]$minimumVersion = 0 + ) + + if (-not $SDKRootPath) { + $SDKRootPath = $env:ANDROID_HOME + } + + return (Get-AndroidPackages -SDKRootPath $SDKRootPath) ` + | Where-Object { "$_".StartsWith("platforms;") } ` + | Where-Object { ($_.Split("-")[1] -as [int]) -ge $minimumVersion } ` + | Sort-Object -Unique } -function Get-AndroidPackagesByVersion { - Param ( - [Parameter(Mandatory=$true)] - [string[]]$AndroidPackages, - [Parameter(Mandatory=$true)] - [string]$PrefixPackageName, - [object]$MinimumVersion, - [char]$Delimiter, - [int]$Index = 0 - ) +function Get-AndroidBuildToolPackages { + <# + .SYNOPSIS + This function returns a list of available Android build tool packages. - $Type = $MinimumVersion.GetType() - $packagesByName = Get-AndroidPackagesByName -AndroidPackages $AndroidPackages -PrefixPackageName $PrefixPackageName - $packagesByVersion = $packagesByName | Where-Object { ($_.Split($Delimiter)[$Index] -as $Type) -ge $MinimumVersion } - return $packagesByVersion | Sort-Object -Unique + .DESCRIPTION + The Get-AndroidBuildToolPackages function uses the Get-AndroidPackages function to get a list of available packages + and filters it to return only build tool packages. + + .PARAMETER SDKRootPath + The root path of the Android SDK installation. + If not specified, the function uses the ANDROID_HOME environment variable. + + .PARAMETER minimumVersion + The minimum version of the build tool packages to include in the result. Default is 0.0.0. + + .EXAMPLE + Get-AndroidBuildToolPackages -SDKRootPath "C:\Android\SDK" -minimumVersion "30.0.2" + + This command returns a list of available Android build tool packages for the specified SDK root path with a minimum version of 30.0.2. + + .NOTES + This function requires the Android SDK to be installed and the sdkmanager.bat script to be accessible. + + #> + Param + ( + [string]$SDKRootPath, + [Alias("minVersion")] + [version]$minimumVersion = "0.0.0" + ) + + if (-not $SDKRootPath) { + $SDKRootPath = $env:ANDROID_HOME + } + + return (Get-AndroidPackages -SDKRootPath $SDKRootPath) ` + | Where-Object { "$_".StartsWith("build-tools;") } ` + | Where-Object { ($_.Split(";")[1] -as [version]) -ge $minimumVersion } ` + | Sort-Object -Unique +} + +function Get-AndroidInstalledPackages { + <# + .SYNOPSIS + Retrieves a list of installed Android packages. + + .DESCRIPTION + This function retrieves a list of installed Android packages using the specified SDK root path. + + .PARAMETER SDKRootPath + The root path of the Android SDK. + If not specified, the function uses the ANDROID_HOME environment variable. + + .EXAMPLE + Get-AndroidInstalledPackages -SDKRootPath "C:\Android\SDK" + Retrieves a list of installed Android packages using the specified SDK root path. + + .NOTES + This function requires the Android SDK to be installed and the SDK root path to be provided. + #> + + Param + ( + [string]$SDKRootPath + ) + + if (-not $SDKRootPath) { + $SDKRootPath = $env:ANDROID_HOME + } + + $sdkManager = "$SDKRootPath\cmdline-tools\latest\bin\sdkmanager.bat" + + return (cmd /c "$sdkManager --list_installed 2>&1") -notmatch "Warning" } function Get-WindowsUpdatesHistory { diff --git a/images/windows/scripts/tests/Android.Tests.ps1 b/images/windows/scripts/tests/Android.Tests.ps1 index b05668ce5..3ed9da8b7 100644 --- a/images/windows/scripts/tests/Android.Tests.ps1 +++ b/images/windows/scripts/tests/Android.Tests.ps1 @@ -1,58 +1,33 @@ -Import-Module (Join-Path $PSScriptRoot "..\SoftwareReport\SoftwareReport.Android.psm1") -DisableNameChecking - Describe "Android SDK" { $androidToolset = (Get-ToolsetContent).android - $androidPackages = Get-AndroidPackages -AndroidSDKManagerPath (Get-AndroidSDKManagerPath) $androidInstalledPackages = Get-AndroidInstalledPackages - $ndkDefaultMajorVersion = $androidToolset.ndk.default - $ndkDefaultFullVersion = Get-ChildItem "$env:ANDROID_HOME/ndk/$ndkDefaultMajorVersion.*" -Name | Select-Object -Last 1 - $ndkVersions = $androidToolset.ndk.versions - $ndkPackagesTestCases = $ndkVersions | ForEach-Object { + $platformList = Get-AndroidPlatformPackages -minVersion $androidToolset.platform_min_version + $platformTestCases = $platformList | ForEach-Object { + @{ platformVersion = $_; installedPackages = $androidInstalledPackages } + } + + $buildToolsList = Get-AndroidBuildToolPackages -minVersion $androidToolset.build_tools_min_version + $buildToolsTestCases = $buildToolsList | ForEach-Object { + @{ buildToolsVersion = $_; installedPackages = $androidInstalledPackages } + } + + $extraPackagesTestCases = $androidToolset.extra_list | ForEach-Object { + @{ extraPackage = $_; installedPackages = $androidInstalledPackages } + } + + $addonsTestCases = $androidToolset.addon_list | ForEach-Object { + @{ addonPackage = $_; installedPackages = $androidInstalledPackages } + } + + $additionalToolsTestCases = $androidToolset.additional_tools | ForEach-Object { + @{ additionalToolVersion = $_; installedPackages = $androidInstalledPackages } + } + + $ndkPackagesTestCases = $androidToolset.ndk.versions | ForEach-Object { @{ ndkPackage = $_; installedPackages = $androidInstalledPackages } } - $platformTestCases = @() - [int]$platformMinVersion = $androidToolset.platform_min_version - $platformList = Get-AndroidPackagesByVersion -AndroidPackages $androidPackages ` - -PrefixPackageName "platforms;" ` - -MinimumVersion $platformMinVersion ` - -Delimiter "-" ` - -Index 1 - - $platformList | ForEach-Object { - $platformTestCases += @{ platformVersion = $_; installedPackages = $androidInstalledPackages } - } - - $buildToolsTestCases = @() - [version]$buildToolsMinVersion = $androidToolset.build_tools_min_version - $buildToolsList = Get-AndroidPackagesByVersion -AndroidPackages $androidPackages ` - -PrefixPackageName "build-tools;" ` - -MinimumVersion $buildToolsMinVersion ` - -Delimiter ";" ` - -Index 1 - $buildToolsList | ForEach-Object { - $buildToolsTestCases += @{ buildToolsVersion = $_; installedPackages = $androidInstalledPackages } - } - - $extraPackagesTestCases = @() - $extraPackageList = $androidToolset.extra_list - $extraPackageList | ForEach-Object { - $extraPackagesTestCases += @{ extraPackage = $_; installedPackages = $androidInstalledPackages } - } - - $addonsTestCases = @() - $addonsPackageList = $androidToolset.addon_list - $addonsPackageList | ForEach-Object { - $addonsTestCases += @{ addonPackage = $_; installedPackages = $androidInstalledPackages } - } - - $additionalToolsTestCases = @() - $additionalToolsList = $androidToolset.additional_tools - $additionalToolsList | ForEach-Object { - $additionalToolsTestCases += @{ additionalToolVersion = $_; installedPackages = $androidInstalledPackages } - } - Context "SDKManagers" { $testCases = @( @{ diff --git a/images/windows/toolsets/toolset-2019.json b/images/windows/toolsets/toolset-2019.json index d4640fb27..0b9381a5c 100644 --- a/images/windows/toolsets/toolset-2019.json +++ b/images/windows/toolsets/toolset-2019.json @@ -151,7 +151,7 @@ "hash": "8A90E6A3DEB2FA13229B2E335EFD07687DCC8A55A3C544DA9F40B41404993E7D", "platform_min_version": "19", "build_tools_min_version": "19.1.0", - "extra_list": [ + "extras": [ "android;m2repository", "google;m2repository", "google;google_play_services", @@ -160,7 +160,7 @@ "m2repository;com;android;support;constraint;constraint-layout;1.0.2", "m2repository;com;android;support;constraint;constraint-layout;1.0.1" ], - "addon_list": [ + "addons": [ "addon-google_apis-google-24", "addon-google_apis-google-23", "addon-google_apis-google-22", diff --git a/images/windows/toolsets/toolset-2022.json b/images/windows/toolsets/toolset-2022.json index 64bf6f179..9dac7d552 100644 --- a/images/windows/toolsets/toolset-2022.json +++ b/images/windows/toolsets/toolset-2022.json @@ -135,12 +135,12 @@ "hash": "8A90E6A3DEB2FA13229B2E335EFD07687DCC8A55A3C544DA9F40B41404993E7D", "platform_min_version": "27", "build_tools_min_version": "27.0.0", - "extra_list": [ + "extras": [ "android;m2repository", "google;m2repository", "google;google_play_services" ], - "addon_list": [], + "addons": [], "additional_tools": [ "cmake;3.18.1", "cmake;3.22.1"