[Windows] Refactor script installing Android SDK and packages (#8877)

This commit is contained in:
Vasilii Polikarpov
2023-11-27 12:28:21 +01:00
committed by GitHub
parent 9492109c62
commit 12066050d0
7 changed files with 276 additions and 185 deletions

View File

@@ -4,6 +4,58 @@
## Supply chain security: checksum validation ## 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 # get packages to install from the toolset
$androidToolset = (Get-ToolsetContent).android $androidToolset = (Get-ToolsetContent).android
# Newer version(s) require Java 11 by default # 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 Use-ChecksumComparison -LocalFileHash $localFileHash -DistributorFileHash $androidToolset.hash
#endregion #endregion
$sdkInstallRoot = "C:\Program Files (x86)\Android\android-sdk" Expand-7ZipArchive -Path $cmdlineToolsArchPath -DestinationPath "${SDKInstallRoot}\cmdline-tools"
$sdkRoot = "C:\Android\android-sdk"
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 # we need to create the proper folder structure
Invoke-SBWithRetry -Command { 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 hardlink at $SDKRootPath pointing to SDK installation directory in Program Files
# create "C:\Android" directory and a hardlink inside pointed to sdk in Program Files New-Item -Path (Split-Path $SDKRootPath -Parent) -ItemType Directory -Force
New-Item -Path "C:\Android" -ItemType Directory New-Item -Path "$SDKRootPath" -ItemType SymbolicLink -Value "$SDKInstallRoot"
New-Item -Path "$sdkRoot" -ItemType SymbolicLink -Value "$sdkInstallRoot"
$sdkManager = "$sdkRoot\cmdline-tools\latest\bin\sdkmanager.bat"
# Install the standard Android SDK licenses. Currently, there isn't a better way to do this, # 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. # 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)) # $base64Content = [Convert]::ToBase64String([IO.File]::ReadAllBytes($LicensesZipFileName))
# echo $base64Content # echo $base64Content
# Another possible solution that works in powershell core: # Another possible solution that works in powershell core:
# Write-Ouptut "y" | $sdkManager <packagename> # Write-Ouptut "y" | $sdkmanager.bat <packagename>
$licenseContentBase64 = "UEsDBBQAAAAAAKNK11IAAAAAAAAAAAAAAAAJAAAAbGljZW5zZXMvUEsDBAoAAAAAAJ1K11K7n0IrKgAAACoAAAAhAAAAbGljZW5zZXMvYW5kcm9pZC1nb29nbGV0di1saWNlbnNlDQo2MDEwODViOTRjZDc3ZjBiNTRmZjg2NDA2OTU3MDk5ZWJlNzljNGQ2UEsDBAoAAAAAAKBK11LzQumJKgAAACoAAAAkAAAAbGljZW5zZXMvYW5kcm9pZC1zZGstYXJtLWRidC1saWNlbnNlDQo4NTlmMzE3Njk2ZjY3ZWYzZDdmMzBhNTBhNTU2MGU3ODM0YjQzOTAzUEsDBAoAAAAAAKFK11IKSOJFKgAAACoAAAAcAAAAbGljZW5zZXMvYW5kcm9pZC1zZGstbGljZW5zZQ0KMjQzMzNmOGE2M2I2ODI1ZWE5YzU1MTRmODNjMjgyOWIwMDRkMWZlZVBLAwQKAAAAAACiStdSec1a4SoAAAAqAAAAJAAAAGxpY2Vuc2VzL2FuZHJvaWQtc2RrLXByZXZpZXctbGljZW5zZQ0KODQ4MzFiOTQwOTY0NmE5MThlMzA1NzNiYWI0YzljOTEzNDZkOGFiZFBLAwQKAAAAAACiStdSk6vQKCoAAAAqAAAAGwAAAGxpY2Vuc2VzL2dvb2dsZS1nZGstbGljZW5zZQ0KMzNiNmEyYjY0NjA3ZjExYjc1OWYzMjBlZjlkZmY0YWU1YzQ3ZDk3YVBLAwQKAAAAAACiStdSrE3jESoAAAAqAAAAJAAAAGxpY2Vuc2VzL2ludGVsLWFuZHJvaWQtZXh0cmEtbGljZW5zZQ0KZDk3NWY3NTE2OThhNzdiNjYyZjEyNTRkZGJlZWQzOTAxZTk3NmY1YVBLAwQKAAAAAACjStdSkb1vWioAAAAqAAAAJgAAAGxpY2Vuc2VzL21pcHMtYW5kcm9pZC1zeXNpbWFnZS1saWNlbnNlDQplOWFjYWI1YjVmYmI1NjBhNzJjZmFlY2NlODk0Njg5NmZmNmFhYjlkUEsBAj8AFAAAAAAAo0rXUgAAAAAAAAAAAAAAAAkAJAAAAAAAAAAQAAAAAAAAAGxpY2Vuc2VzLwoAIAAAAAAAAQAYACIHOBcRaNcBIgc4FxFo1wHBTVQTEWjXAVBLAQI/AAoAAAAAAJ1K11K7n0IrKgAAACoAAAAhACQAAAAAAAAAIAAAACcAAABsaWNlbnNlcy9hbmRyb2lkLWdvb2dsZXR2LWxpY2Vuc2UKACAAAAAAAAEAGACUEFUTEWjXAZQQVRMRaNcB6XRUExFo1wFQSwECPwAKAAAAAACgStdS80LpiSoAAAAqAAAAJAAkAAAAAAAAACAAAACQAAAAbGljZW5zZXMvYW5kcm9pZC1zZGstYXJtLWRidC1saWNlbnNlCgAgAAAAAAABABgAsEM0FBFo1wGwQzQUEWjXAXb1MxQRaNcBUEsBAj8ACgAAAAAAoUrXUgpI4kUqAAAAKgAAABwAJAAAAAAAAAAgAAAA/AAAAGxpY2Vuc2VzL2FuZHJvaWQtc2RrLWxpY2Vuc2UKACAAAAAAAAEAGAAsMGUVEWjXASwwZRURaNcB5whlFRFo1wFQSwECPwAKAAAAAACiStdSec1a4SoAAAAqAAAAJAAkAAAAAAAAACAAAABgAQAAbGljZW5zZXMvYW5kcm9pZC1zZGstcHJldmlldy1saWNlbnNlCgAgAAAAAAABABgA7s3WFRFo1wHuzdYVEWjXAfGm1hURaNcBUEsBAj8ACgAAAAAAokrXUpOr0CgqAAAAKgAAABsAJAAAAAAAAAAgAAAAzAEAAGxpY2Vuc2VzL2dvb2dsZS1nZGstbGljZW5zZQoAIAAAAAAAAQAYAGRDRxYRaNcBZENHFhFo1wFfHEcWEWjXAVBLAQI/AAoAAAAAAKJK11KsTeMRKgAAACoAAAAkACQAAAAAAAAAIAAAAC8CAABsaWNlbnNlcy9pbnRlbC1hbmRyb2lkLWV4dHJhLWxpY2Vuc2UKACAAAAAAAAEAGADGsq0WEWjXAcayrRYRaNcBxrKtFhFo1wFQSwECPwAKAAAAAACjStdSkb1vWioAAAAqAAAAJgAkAAAAAAAAACAAAACbAgAAbGljZW5zZXMvbWlwcy1hbmRyb2lkLXN5c2ltYWdlLWxpY2Vuc2UKACAAAAAAAAEAGAA4LjgXEWjXATguOBcRaNcBIgc4FxFo1wFQSwUGAAAAAAgACACDAwAACQMAAAAA" $licenseContentBase64 = "UEsDBBQAAAAAAKNK11IAAAAAAAAAAAAAAAAJAAAAbGljZW5zZXMvUEsDBAoAAAAAAJ1K11K7n0IrKgAAACoAAAAhAAAAbGljZW5zZXMvYW5kcm9pZC1nb29nbGV0di1saWNlbnNlDQo2MDEwODViOTRjZDc3ZjBiNTRmZjg2NDA2OTU3MDk5ZWJlNzljNGQ2UEsDBAoAAAAAAKBK11LzQumJKgAAACoAAAAkAAAAbGljZW5zZXMvYW5kcm9pZC1zZGstYXJtLWRidC1saWNlbnNlDQo4NTlmMzE3Njk2ZjY3ZWYzZDdmMzBhNTBhNTU2MGU3ODM0YjQzOTAzUEsDBAoAAAAAAKFK11IKSOJFKgAAACoAAAAcAAAAbGljZW5zZXMvYW5kcm9pZC1zZGstbGljZW5zZQ0KMjQzMzNmOGE2M2I2ODI1ZWE5YzU1MTRmODNjMjgyOWIwMDRkMWZlZVBLAwQKAAAAAACiStdSec1a4SoAAAAqAAAAJAAAAGxpY2Vuc2VzL2FuZHJvaWQtc2RrLXByZXZpZXctbGljZW5zZQ0KODQ4MzFiOTQwOTY0NmE5MThlMzA1NzNiYWI0YzljOTEzNDZkOGFiZFBLAwQKAAAAAACiStdSk6vQKCoAAAAqAAAAGwAAAGxpY2Vuc2VzL2dvb2dsZS1nZGstbGljZW5zZQ0KMzNiNmEyYjY0NjA3ZjExYjc1OWYzMjBlZjlkZmY0YWU1YzQ3ZDk3YVBLAwQKAAAAAACiStdSrE3jESoAAAAqAAAAJAAAAGxpY2Vuc2VzL2ludGVsLWFuZHJvaWQtZXh0cmEtbGljZW5zZQ0KZDk3NWY3NTE2OThhNzdiNjYyZjEyNTRkZGJlZWQzOTAxZTk3NmY1YVBLAwQKAAAAAACjStdSkb1vWioAAAAqAAAAJgAAAGxpY2Vuc2VzL21pcHMtYW5kcm9pZC1zeXNpbWFnZS1saWNlbnNlDQplOWFjYWI1YjVmYmI1NjBhNzJjZmFlY2NlODk0Njg5NmZmNmFhYjlkUEsBAj8AFAAAAAAAo0rXUgAAAAAAAAAAAAAAAAkAJAAAAAAAAAAQAAAAAAAAAGxpY2Vuc2VzLwoAIAAAAAAAAQAYACIHOBcRaNcBIgc4FxFo1wHBTVQTEWjXAVBLAQI/AAoAAAAAAJ1K11K7n0IrKgAAACoAAAAhACQAAAAAAAAAIAAAACcAAABsaWNlbnNlcy9hbmRyb2lkLWdvb2dsZXR2LWxpY2Vuc2UKACAAAAAAAAEAGACUEFUTEWjXAZQQVRMRaNcB6XRUExFo1wFQSwECPwAKAAAAAACgStdS80LpiSoAAAAqAAAAJAAkAAAAAAAAACAAAACQAAAAbGljZW5zZXMvYW5kcm9pZC1zZGstYXJtLWRidC1saWNlbnNlCgAgAAAAAAABABgAsEM0FBFo1wGwQzQUEWjXAXb1MxQRaNcBUEsBAj8ACgAAAAAAoUrXUgpI4kUqAAAAKgAAABwAJAAAAAAAAAAgAAAA/AAAAGxpY2Vuc2VzL2FuZHJvaWQtc2RrLWxpY2Vuc2UKACAAAAAAAAEAGAAsMGUVEWjXASwwZRURaNcB5whlFRFo1wFQSwECPwAKAAAAAACiStdSec1a4SoAAAAqAAAAJAAkAAAAAAAAACAAAABgAQAAbGljZW5zZXMvYW5kcm9pZC1zZGstcHJldmlldy1saWNlbnNlCgAgAAAAAAABABgA7s3WFRFo1wHuzdYVEWjXAfGm1hURaNcBUEsBAj8ACgAAAAAAokrXUpOr0CgqAAAAKgAAABsAJAAAAAAAAAAgAAAAzAEAAGxpY2Vuc2VzL2dvb2dsZS1nZGstbGljZW5zZQoAIAAAAAAAAQAYAGRDRxYRaNcBZENHFhFo1wFfHEcWEWjXAVBLAQI/AAoAAAAAAKJK11KsTeMRKgAAACoAAAAkACQAAAAAAAAAIAAAAC8CAABsaWNlbnNlcy9pbnRlbC1hbmRyb2lkLWV4dHJhLWxpY2Vuc2UKACAAAAAAAAEAGADGsq0WEWjXAcayrRYRaNcBxrKtFhFo1wFQSwECPwAKAAAAAACjStdSkb1vWioAAAAqAAAAJgAkAAAAAAAAACAAAACbAgAAbGljZW5zZXMvbWlwcy1hbmRyb2lkLXN5c2ltYWdlLWxpY2Vuc2UKACAAAAAAAAEAGAA4LjgXEWjXATguOBcRaNcBIgc4FxFo1wFQSwUGAAAAAAgACACDAwAACQMAAAAA"
$licenseContent = [System.Convert]::FromBase64String($licenseContentBase64) $licenseContent = [System.Convert]::FromBase64String($licenseContentBase64)
Set-Content -Path "$sdkInstallRoot\android-sdk-licenses.zip" -Value $licenseContent -Encoding Byte Set-Content -Path "$SDKInstallRoot\android-sdk-licenses.zip" -Value $licenseContent -Encoding Byte
Expand-7ZipArchive -Path "$sdkInstallRoot\android-sdk-licenses.zip" -DestinationPath $sdkInstallRoot Expand-7ZipArchive -Path "$SDKInstallRoot\android-sdk-licenses.zip" -DestinationPath $SDKInstallRoot
# install platform-tools # Install platform-tools
$platformToolsPath = Join-Path -Path $sdkInstallRoot -ChildPath "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) {
if (Test-Path $platformToolsPath)
{
Write-Host "Removing previous platform-tools installation from Visual Studio component" Write-Host "Removing previous platform-tools installation from Visual Studio component"
Remove-Item $platformToolsPath -Recurse -Force Remove-Item $platformToolsPath -Recurse -Force
} }
Install-AndroidSDKPackages "platform-tools"
Install-AndroidSDKPackages -AndroidSDKManagerPath $sdkManager ` # Get Android SDK packages list
-AndroidSDKRootPath $sdkRoot ` $androidPackages = Get-AndroidPackages -SDKRootPath $SDKRootPath
-AndroidPackages "platform-tools"
# get packages info # Install Android platform versions
$androidPackages = Get-AndroidPackages -AndroidSDKManagerPath $sdkManager # 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 # Install Android build-tools versions
[int]$platformMinVersion = $androidToolset.platform_min_version # that are greater than or equal to the minimum version
$platformList = Get-AndroidPackagesByVersion -AndroidPackages $androidPackages ` Write-Host "Installing Android SDK packages for build tools..."
-PrefixPackageName "platforms;" ` $buildToolsList = Get-AndroidBuildToolPackages `
-MinimumVersion $platformMinVersion ` -SDKRootPath $SDKRootPath `
-Delimiter "-" ` -minVersion $androidToolset.build_tools_min_version
-Index 1 Install-AndroidSDKPackages $buildToolsList
# build-tools # Install extras, add-ons and additional tools
[version]$buildToolsMinVersion = $androidToolset.build_tools_min_version Write-Host "Installing Android SDK extras, add-ons and additional tools..."
$buildToolsList = Get-AndroidPackagesByVersion -AndroidPackages $androidPackages ` Install-AndroidSDKPackages ($androidToolset.extras | ForEach-Object { "extras;$_" })
-PrefixPackageName "build-tools;" ` Install-AndroidSDKPackages ($androidToolset.addons | ForEach-Object { "add-ons;$_" })
-MinimumVersion $buildToolsMinVersion ` Install-AndroidSDKPackages ($androidToolset.additional_tools)
-Delimiter ";" `
-Index 1
Install-AndroidSDKPackages -AndroidSDKManagerPath $sdkManager ` # Install NDKs
-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
$ndkMajorVersions = $androidToolset.ndk.versions $ndkMajorVersions = $androidToolset.ndk.versions
$ndkDefaultMajorVersion = $androidToolset.ndk.default $ndkDefaultMajorVersion = $androidToolset.ndk.default
$ndkLatestMajorVersion = $ndkMajorVersions | Select-Object -Last 1 $ndkLatestMajorVersion = $ndkMajorVersions | Select-Object -Last 1
$androidNDKs = $ndkMajorVersions | Foreach-Object { $androidNDKs = @()
Get-AndroidPackagesByName -AndroidPackages $androidPackages -PrefixPackageName "ndk;$_" | Sort-Object -Unique | Select-Object -Last 1 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 ` Write-Host "Installing Android SDK packages for NDKs..."
-AndroidSDKRootPath $sdkRoot ` Install-AndroidSDKPackages $androidNDKs
-AndroidPackages $androidNDKs
$ndkLatestVersion = ($androidNDKs | Where-Object { $_ -match "ndk;$ndkLatestMajorVersion" }).Split(';')[1] $ndkLatestVersion = ($androidNDKs | Where-Object { $_ -match "ndk;$ndkLatestMajorVersion" }).Split(';')[1]
$ndkDefaultVersion = ($androidNDKs | Where-Object { $_ -match "ndk;$ndkDefaultMajorVersion" }).Split(';')[1] $ndkDefaultVersion = ($androidNDKs | Where-Object { $_ -match "ndk;$ndkDefaultMajorVersion" }).Split(';')[1]
$ndkRoot = "$sdkRoot\ndk\$ndkDefaultVersion" $ndkRoot = "$SDKRootPath\ndk\$ndkDefaultVersion"
# Create env variables # Create env variables
[Environment]::SetEnvironmentVariable("ANDROID_HOME", $sdkRoot, "Machine") [Environment]::SetEnvironmentVariable("ANDROID_HOME", $SDKRootPath, "Machine")
[Environment]::SetEnvironmentVariable("ANDROID_SDK_ROOT", $sdkRoot, "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 # 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", $ndkRoot, "Machine")
[Environment]::SetEnvironmentVariable("ANDROID_NDK_HOME", $ndkRoot, "Machine") [Environment]::SetEnvironmentVariable("ANDROID_NDK_HOME", $ndkRoot, "Machine")
[Environment]::SetEnvironmentVariable("ANDROID_NDK_ROOT", $ndkRoot, "Machine") [Environment]::SetEnvironmentVariable("ANDROID_NDK_ROOT", $ndkRoot, "Machine")
$ndkLatestPath = "$sdkRoot\ndk\$ndkLatestVersion" $ndkLatestPath = "$SDKRootPath\ndk\$ndkLatestVersion"
if (Test-Path $ndkLatestPath) { if (Test-Path $ndkLatestPath) {
[Environment]::SetEnvironmentVariable("ANDROID_NDK_LATEST_HOME", $ndkLatestPath, "Machine") [Environment]::SetEnvironmentVariable("ANDROID_NDK_LATEST_HOME", $ndkLatestPath, "Machine")
} else { } else {

View File

@@ -15,17 +15,6 @@ function Get-AndroidSDKRoot {
return "Location $path" 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 { function Build-AndroidTable {
$packageInfo = Get-AndroidInstalledPackages $packageInfo = Get-AndroidInstalledPackages
return @( return @(
@@ -84,7 +73,7 @@ function Build-AndroidTable {
) | Where-Object { $_.Version } | ForEach-Object { ) | Where-Object { $_.Version } | ForEach-Object {
[PSCustomObject] @{ [PSCustomObject] @{
"Package Name" = $_.Package "Package Name" = $_.Package
"Version" = $_.Version "Version" = $_.Version
} }
} }
} }
@@ -121,7 +110,7 @@ function Get-AndroidPlatformVersions {
} }
function Get-AndroidCommandLineToolsVersion { 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 "(?<version>^(\d+\.){1,}\d+$)" | Out-Null (cmd /c "$commandLineTools --version 2>NUL" | Out-String).Trim() -match "(?<version>^(\d+\.){1,}\d+$)" | Out-Null
$commandLineToolsVersion = $Matches.Version $commandLineToolsVersion = $Matches.Version
return $commandLineToolsVersion return $commandLineToolsVersion

View File

@@ -40,10 +40,10 @@ Export-ModuleMember -Function @(
'Expand-7ZipArchive' 'Expand-7ZipArchive'
'Invoke-SBWithRetry' 'Invoke-SBWithRetry'
'Get-VsCatalogJsonPath' 'Get-VsCatalogJsonPath'
'Install-AndroidSDKPackages'
'Get-AndroidPackages' 'Get-AndroidPackages'
'Get-AndroidPackagesByName' 'Get-AndroidPlatformPackages'
'Get-AndroidPackagesByVersion' 'Get-AndroidBuildToolPackages'
'Get-AndroidInstalledPackages'
'Get-VisualStudioInstance' 'Get-VisualStudioInstance'
'Get-VisualStudioComponents' 'Get-VisualStudioComponents'
'Get-WindowsUpdatesHistory' 'Get-WindowsUpdatesHistory'

View File

@@ -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 { 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 Param
( (
[Parameter(Mandatory=$true)] [string]$SDKRootPath
[string]$AndroidSDKManagerPath
) )
$packagesListFile = "C:\Android\android-sdk\packages-list.txt" if (-not $SDKRootPath) {
$SDKRootPath = $env:ANDROID_HOME
}
$packagesListFile = "$SDKRootPath\packages-list.txt"
$sdkManager = "$SDKRootPath\cmdline-tools\latest\bin\sdkmanager.bat"
if (-Not (Test-Path -Path $packagesListFile -PathType Leaf)) { if (-Not (Test-Path -Path $packagesListFile -PathType Leaf)) {
(cmd /c "$AndroidSDKManagerPath --list --verbose 2>&1") | (cmd /c "$sdkManager --list --verbose 2>&1") |
Where-Object { $_ -Match "^[^\s]" } | Where-Object { $_ -Match "^[^\s]" } |
Where-Object { $_ -NotMatch "^(Loading |Info: Parsing |---|\[=+|Installed |Available )" } | Where-Object { $_ -NotMatch "^(Loading |Info: Parsing |---|\[=+|Installed |Available )" } |
Where-Object { $_ -NotMatch "^[^;]*$" } | Where-Object { $_ -NotMatch "^[^;]*$" } |
Out-File -FilePath $packagesListFile Out-File -FilePath $packagesListFile
} }
return Get-Content $packagesListFile return Get-Content $packagesListFile
} }
function Get-AndroidPackagesByName { function Get-AndroidPlatformPackages {
Param ( <#
[Parameter(Mandatory=$true)] .SYNOPSIS
[string[]]$AndroidPackages, This function returns a list of available Android platform packages.
[Parameter(Mandatory=$true)]
[string]$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
) )
return $AndroidPackages | Where-Object { "$_".StartsWith($PrefixPackageName) } 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 { function Get-AndroidBuildToolPackages {
Param ( <#
[Parameter(Mandatory=$true)] .SYNOPSIS
[string[]]$AndroidPackages, This function returns a list of available Android build tool packages.
[Parameter(Mandatory=$true)]
[string]$PrefixPackageName, .DESCRIPTION
[object]$MinimumVersion, The Get-AndroidBuildToolPackages function uses the Get-AndroidPackages function to get a list of available packages
[char]$Delimiter, and filters it to return only build tool packages.
[int]$Index = 0
.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"
) )
$Type = $MinimumVersion.GetType() if (-not $SDKRootPath) {
$packagesByName = Get-AndroidPackagesByName -AndroidPackages $AndroidPackages -PrefixPackageName $PrefixPackageName $SDKRootPath = $env:ANDROID_HOME
$packagesByVersion = $packagesByName | Where-Object { ($_.Split($Delimiter)[$Index] -as $Type) -ge $MinimumVersion } }
return $packagesByVersion | Sort-Object -Unique
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 { function Get-WindowsUpdatesHistory {

View File

@@ -1,58 +1,33 @@
Import-Module (Join-Path $PSScriptRoot "..\SoftwareReport\SoftwareReport.Android.psm1") -DisableNameChecking
Describe "Android SDK" { Describe "Android SDK" {
$androidToolset = (Get-ToolsetContent).android $androidToolset = (Get-ToolsetContent).android
$androidPackages = Get-AndroidPackages -AndroidSDKManagerPath (Get-AndroidSDKManagerPath)
$androidInstalledPackages = Get-AndroidInstalledPackages $androidInstalledPackages = Get-AndroidInstalledPackages
$ndkDefaultMajorVersion = $androidToolset.ndk.default $platformList = Get-AndroidPlatformPackages -minVersion $androidToolset.platform_min_version
$ndkDefaultFullVersion = Get-ChildItem "$env:ANDROID_HOME/ndk/$ndkDefaultMajorVersion.*" -Name | Select-Object -Last 1 $platformTestCases = $platformList | ForEach-Object {
$ndkVersions = $androidToolset.ndk.versions @{ platformVersion = $_; installedPackages = $androidInstalledPackages }
$ndkPackagesTestCases = $ndkVersions | ForEach-Object { }
$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 } @{ 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" { Context "SDKManagers" {
$testCases = @( $testCases = @(
@{ @{

View File

@@ -151,7 +151,7 @@
"hash": "8A90E6A3DEB2FA13229B2E335EFD07687DCC8A55A3C544DA9F40B41404993E7D", "hash": "8A90E6A3DEB2FA13229B2E335EFD07687DCC8A55A3C544DA9F40B41404993E7D",
"platform_min_version": "19", "platform_min_version": "19",
"build_tools_min_version": "19.1.0", "build_tools_min_version": "19.1.0",
"extra_list": [ "extras": [
"android;m2repository", "android;m2repository",
"google;m2repository", "google;m2repository",
"google;google_play_services", "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.2",
"m2repository;com;android;support;constraint;constraint-layout;1.0.1" "m2repository;com;android;support;constraint;constraint-layout;1.0.1"
], ],
"addon_list": [ "addons": [
"addon-google_apis-google-24", "addon-google_apis-google-24",
"addon-google_apis-google-23", "addon-google_apis-google-23",
"addon-google_apis-google-22", "addon-google_apis-google-22",

View File

@@ -135,12 +135,12 @@
"hash": "8A90E6A3DEB2FA13229B2E335EFD07687DCC8A55A3C544DA9F40B41404993E7D", "hash": "8A90E6A3DEB2FA13229B2E335EFD07687DCC8A55A3C544DA9F40B41404993E7D",
"platform_min_version": "27", "platform_min_version": "27",
"build_tools_min_version": "27.0.0", "build_tools_min_version": "27.0.0",
"extra_list": [ "extras": [
"android;m2repository", "android;m2repository",
"google;m2repository", "google;m2repository",
"google;google_play_services" "google;google_play_services"
], ],
"addon_list": [], "addons": [],
"additional_tools": [ "additional_tools": [
"cmake;3.18.1", "cmake;3.18.1",
"cmake;3.22.1" "cmake;3.22.1"