From 6e7af98600e03cc5b487f8fec6631889b4374e50 Mon Sep 17 00:00:00 2001 From: Mikhail Timofeev <48208649+miketimofeev@users.noreply.github.com> Date: Wed, 7 Jul 2021 15:16:35 +0300 Subject: [PATCH] [Windows] Switch android tools installation to use cmdline-tools' sdkmanager (#3682) * Switch android installation to use cmdline-tools * Rename update-android sdk to install-android sdk as for the other OSs * Remove cmdline-tools installation from toolset as it's installed * Regenerate licenses for the new sdkmanager * Add tests to check that both sdkmanagers are available * Simplify Get-AndroidInstalledPackages function to use list_installed * Resolve nitpicks from @AlenaSviridenko * Add extra lines to separate comments from the code * Remove extra line after $androidNDKs * Modify software report to output any version number * Change regex pattern to output the group * Currently the function returns 4. instead of 4.0, this change fixes it --- .../scripts/Installers/Install-AndroidSDK.ps1 | 148 ++++++++++++++++++ .../scripts/Installers/Update-AndroidSDK.ps1 | 132 ---------------- .../SoftwareReport.Android.psm1 | 23 ++- images/win/scripts/Tests/Android.Tests.ps1 | 63 +++++--- images/win/toolsets/toolset-2016.json | 3 +- images/win/toolsets/toolset-2019.json | 3 +- images/win/windows2016.json | 2 +- images/win/windows2019.json | 2 +- 8 files changed, 204 insertions(+), 172 deletions(-) create mode 100644 images/win/scripts/Installers/Install-AndroidSDK.ps1 delete mode 100644 images/win/scripts/Installers/Update-AndroidSDK.ps1 diff --git a/images/win/scripts/Installers/Install-AndroidSDK.ps1 b/images/win/scripts/Installers/Install-AndroidSDK.ps1 new file mode 100644 index 000000000..acb6aefd5 --- /dev/null +++ b/images/win/scripts/Installers/Install-AndroidSDK.ps1 @@ -0,0 +1,148 @@ +################################################################################ +## File: Install-AndroidSDK.ps1 +## Desc: Install and update Android SDK and tools +################################################################################ + +# install command-line tools +$cmdlineToolsUrl = "https://dl.google.com/android/repository/commandlinetools-win-7302050_latest.zip" +$cmdlineToolsArchPath = Start-DownloadWithRetry -Url $cmdlineToolsUrl -Name "cmdline-tools.zip" +$sdkInstallRoot = "C:\Program Files (x86)\Android\android-sdk" +$sdkRoot = "C:\Android\android-sdk" +Expand-Archive -Path $cmdlineToolsArchPath -DestinationPath "${sdkInstallRoot}\cmdline-tools" -Force + +# 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 +Rename-Item "${sdkInstallRoot}\cmdline-tools\cmdline-tools" "latest" + +# ANDROID_NDK_PATH/HOME should not contain spaces. Otherwise, the script ndk-build.cmd gives an error https://github.com/actions/virtual-environments/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" + +# 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. +# To create this base64 string, create a zip file that contains nothing but a 'licenses' folder, +# which folder contains the accepted license files found in 'C:\Program Files (x86)\Android\android-sdk\licenses'. +# Then, run this in PowerShell: +# $LicensesZipFileName = 'C:\Program Files (x86)\Android\android-sdk\Licenses.zip' +# $base64Content = [Convert]::ToBase64String([IO.File]::ReadAllBytes($LicensesZipFileName)) +# echo $base64Content +# Another possible solution that works in powershell core: +# Write-Ouptut "y" | $sdkManager +$licenseContentBase64 = "UEsDBBQAAAAAAKNK11IAAAAAAAAAAAAAAAAJAAAAbGljZW5zZXMvUEsDBAoAAAAAAJ1K11K7n0IrKgAAACoAAAAhAAAAbGljZW5zZXMvYW5kcm9pZC1nb29nbGV0di1saWNlbnNlDQo2MDEwODViOTRjZDc3ZjBiNTRmZjg2NDA2OTU3MDk5ZWJlNzljNGQ2UEsDBAoAAAAAAKBK11LzQumJKgAAACoAAAAkAAAAbGljZW5zZXMvYW5kcm9pZC1zZGstYXJtLWRidC1saWNlbnNlDQo4NTlmMzE3Njk2ZjY3ZWYzZDdmMzBhNTBhNTU2MGU3ODM0YjQzOTAzUEsDBAoAAAAAAKFK11IKSOJFKgAAACoAAAAcAAAAbGljZW5zZXMvYW5kcm9pZC1zZGstbGljZW5zZQ0KMjQzMzNmOGE2M2I2ODI1ZWE5YzU1MTRmODNjMjgyOWIwMDRkMWZlZVBLAwQKAAAAAACiStdSec1a4SoAAAAqAAAAJAAAAGxpY2Vuc2VzL2FuZHJvaWQtc2RrLXByZXZpZXctbGljZW5zZQ0KODQ4MzFiOTQwOTY0NmE5MThlMzA1NzNiYWI0YzljOTEzNDZkOGFiZFBLAwQKAAAAAACiStdSk6vQKCoAAAAqAAAAGwAAAGxpY2Vuc2VzL2dvb2dsZS1nZGstbGljZW5zZQ0KMzNiNmEyYjY0NjA3ZjExYjc1OWYzMjBlZjlkZmY0YWU1YzQ3ZDk3YVBLAwQKAAAAAACiStdSrE3jESoAAAAqAAAAJAAAAGxpY2Vuc2VzL2ludGVsLWFuZHJvaWQtZXh0cmEtbGljZW5zZQ0KZDk3NWY3NTE2OThhNzdiNjYyZjEyNTRkZGJlZWQzOTAxZTk3NmY1YVBLAwQKAAAAAACjStdSkb1vWioAAAAqAAAAJgAAAGxpY2Vuc2VzL21pcHMtYW5kcm9pZC1zeXNpbWFnZS1saWNlbnNlDQplOWFjYWI1YjVmYmI1NjBhNzJjZmFlY2NlODk0Njg5NmZmNmFhYjlkUEsBAj8AFAAAAAAAo0rXUgAAAAAAAAAAAAAAAAkAJAAAAAAAAAAQAAAAAAAAAGxpY2Vuc2VzLwoAIAAAAAAAAQAYACIHOBcRaNcBIgc4FxFo1wHBTVQTEWjXAVBLAQI/AAoAAAAAAJ1K11K7n0IrKgAAACoAAAAhACQAAAAAAAAAIAAAACcAAABsaWNlbnNlcy9hbmRyb2lkLWdvb2dsZXR2LWxpY2Vuc2UKACAAAAAAAAEAGACUEFUTEWjXAZQQVRMRaNcB6XRUExFo1wFQSwECPwAKAAAAAACgStdS80LpiSoAAAAqAAAAJAAkAAAAAAAAACAAAACQAAAAbGljZW5zZXMvYW5kcm9pZC1zZGstYXJtLWRidC1saWNlbnNlCgAgAAAAAAABABgAsEM0FBFo1wGwQzQUEWjXAXb1MxQRaNcBUEsBAj8ACgAAAAAAoUrXUgpI4kUqAAAAKgAAABwAJAAAAAAAAAAgAAAA/AAAAGxpY2Vuc2VzL2FuZHJvaWQtc2RrLWxpY2Vuc2UKACAAAAAAAAEAGAAsMGUVEWjXASwwZRURaNcB5whlFRFo1wFQSwECPwAKAAAAAACiStdSec1a4SoAAAAqAAAAJAAkAAAAAAAAACAAAABgAQAAbGljZW5zZXMvYW5kcm9pZC1zZGstcHJldmlldy1saWNlbnNlCgAgAAAAAAABABgA7s3WFRFo1wHuzdYVEWjXAfGm1hURaNcBUEsBAj8ACgAAAAAAokrXUpOr0CgqAAAAKgAAABsAJAAAAAAAAAAgAAAAzAEAAGxpY2Vuc2VzL2dvb2dsZS1nZGstbGljZW5zZQoAIAAAAAAAAQAYAGRDRxYRaNcBZENHFhFo1wFfHEcWEWjXAVBLAQI/AAoAAAAAAKJK11KsTeMRKgAAACoAAAAkACQAAAAAAAAAIAAAAC8CAABsaWNlbnNlcy9pbnRlbC1hbmRyb2lkLWV4dHJhLWxpY2Vuc2UKACAAAAAAAAEAGADGsq0WEWjXAcayrRYRaNcBxrKtFhFo1wFQSwECPwAKAAAAAACjStdSkb1vWioAAAAqAAAAJgAkAAAAAAAAACAAAACbAgAAbGljZW5zZXMvbWlwcy1hbmRyb2lkLXN5c2ltYWdlLWxpY2Vuc2UKACAAAAAAAAEAGAA4LjgXEWjXATguOBcRaNcBIgc4FxFo1wFQSwUGAAAAAAgACACDAwAACQMAAAAA" +$licenseContent = [System.Convert]::FromBase64String($licenseContentBase64) +Set-Content -Path "$sdkInstallRoot\android-sdk-licenses.zip" -Value $licenseContent -Encoding Byte +Expand-Archive "$sdkInstallRoot\android-sdk-licenses.zip" $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) +{ + Write-Host "Removing previous platform-tools installation from Visual Studio component" + Remove-Item $platformToolsPath -Recurse -Force +} + +Install-AndroidSDKPackages -AndroidSDKManagerPath $sdkManager ` + -AndroidSDKRootPath $sdkRoot ` + -AndroidPackages "platform-tools" + +# get packages to install from the toolset +$androidToolset = (Get-ToolsetContent).android + +# get packages info +$androidPackages = Get-AndroidPackages -AndroidSDKManagerPath $sdkManager + +# platforms +[int]$platformMinVersion = $androidToolset.platform_min_version +$platformListByVersion = Get-AndroidPackagesByVersion -AndroidPackages $androidPackages ` + -PrefixPackageName "platforms;" ` + -MinimumVersion $platformMinVersion ` + -Delimiter "-" ` + -Index 1 +$platformListByName = Get-AndroidPackagesByName -AndroidPackages $androidPackages ` + -PrefixPackageName "platforms;" | Where-Object {$_ -match "-\D+$"} +$platformList = $platformListByVersion + $platformListByName + +# build-tools +[version]$buildToolsMinVersion = $androidToolset.build_tools_min_version +$buildToolsList = Get-AndroidPackagesByVersion -AndroidPackages $androidPackages ` + -PrefixPackageName "build-tools;" ` + -MinimumVersion $buildToolsMinVersion ` + -Delimiter ";" ` + -Index 1 + +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 +$ndkLTSMajorVersion = $androidToolset.ndk.lts +$ndkLatestMajorVersion = $androidToolset.ndk.latest + +$ndkLTSPackageName = Get-AndroidPackagesByName -AndroidPackages $androidPackages ` + -PrefixPackageName "ndk;$ndkLTSMajorVersion" ` + | Sort-Object -Unique ` + | Select-Object -Last 1 + +$ndkLatestPackageName = Get-AndroidPackagesByName -AndroidPackages $androidPackages ` + -PrefixPackageName "ndk;$ndkLatestMajorVersion" ` + | Sort-Object -Unique ` + | Select-Object -Last 1 + +$androidNDKs = @($ndkLTSPackageName, $ndkLatestPackageName) + +Install-AndroidSDKPackages -AndroidSDKManagerPath $sdkManager ` + -AndroidSDKRootPath $sdkRoot ` + -AndroidPackages $androidNDKs + +$ndkLTSVersion = $ndkLTSPackageName.Split(';')[1] +$ndkLatestVersion = $ndkLatestPackageName.Split(';')[1] + +# Android NDK root path. +$ndkRoot = "$sdkRoot\ndk-bundle" +# This changes were added due to incompatibility with android ndk-bundle (ndk;22.0.7026061). +# Link issue virtual-environments: https://github.com/actions/virtual-environments/issues/2481 +# Link issue xamarin-android: https://github.com/xamarin/xamarin-android/issues/5526 +New-Item -Path $ndkRoot -ItemType SymbolicLink -Value "$sdkRoot\ndk\$ndkLTSVersion" + +if (Test-Path $ndkRoot) { + setx ANDROID_HOME $sdkRoot /M + setx ANDROID_SDK_ROOT $sdkRoot /M + setx ANDROID_NDK_HOME $ndkRoot /M + setx ANDROID_NDK_PATH $ndkRoot /M + setx ANDROID_NDK_ROOT $ndkRoot /M + (Get-Content -Encoding UTF8 "${ndkRoot}\ndk-build.cmd").replace('%~dp0\build\ndk-build.cmd','"%~dp0\build\ndk-build.cmd"')|Set-Content -Encoding UTF8 "${ndkRoot}\ndk-build.cmd" +} else { + Write-Host "LTS NDK $ndkLTSVersion is not installed at path $ndkRoot" + exit 1 +} + +$ndkLatestPath = "$sdkRoot\ndk\$ndkLatestVersion" +if (Test-Path $ndkLatestPath) { + setx ANDROID_NDK_LATEST_HOME $ndkLatestPath /M +} else { + Write-Host "Latest NDK $ndkLatestVersion is not installed at path $ndkLatestPath" + exit 1 +} + +Invoke-PesterTests -TestFile "Android" diff --git a/images/win/scripts/Installers/Update-AndroidSDK.ps1 b/images/win/scripts/Installers/Update-AndroidSDK.ps1 deleted file mode 100644 index f20c22cea..000000000 --- a/images/win/scripts/Installers/Update-AndroidSDK.ps1 +++ /dev/null @@ -1,132 +0,0 @@ -################################################################################ -## File: Update-AndroidSDK.ps1 -## Desc: Install and update Android SDK and tools -################################################################################ - -# Install the standard Android SDK licenses. In the past, there wasn't a better way to do this, -# so we are base64-encoding a zip of the licenses directory from another installation. -# To create this base64 string, create a zip file that contains nothing but a 'licenses' folder, -# which folder contains the accepted license files found in 'C:\Program Files (x86)\Android\android-sdk\licenses'. -# Then, run this in PowerShell: -# $LicensesZipFileName = 'C:\Program Files (x86)\Android\android-sdk\Licenses.zip' -# $base64Content = [Convert]::ToBase64String([IO.File]::ReadAllBytes($LicensesZipFileName)) -# echo $base64Content -# -# Future: see if the base64 technique can be avoided by running this PowerShell script to accept all licenses. -# This fails when run on a live agent, likely because non-interactive mode is set. -# It may work fine during image generation (this script). -# for($i=0; $i -lt 100; $i++) { $response += "y`n"}; $response | .\sdkmanager.bat --licenses -$base64Content = "UEsDBBQAAAAAAKJeN06amkPzKgAAACoAAAAhAAAAbGljZW5zZXMvYW5kcm9pZC1nb29nbGV0di1saWNlbnNlDQpmYzk0NmU4ZjIzMWYzZTMxNTliZjBiN2M2NTVjOTI0Y2IyZTM4MzMwUEsDBBQAAAAIAKBrN05E+YSqQwAAAFQAAAAcAAAAbGljZW5zZXMvYW5kcm9pZC1zZGstbGljZW5zZQXByREAIQgEwP9WmYsjhxgOKJN/CNs9vmdOQ2zdRw2dxQnWjqQ/3oIgXQM9vqUiwkiX8ljWea4ZlCF3xTo1pz6w+wdQSwMEFAAAAAAAxV43TpECY7AqAAAAKgAAACQAAABsaWNlbnNlcy9hbmRyb2lkLXNkay1wcmV2aWV3LWxpY2Vuc2UNCjUwNDY2N2Y0YzBkZTdhZjFhMDZkZTlmNGIxNzI3Yjg0MzUxZjI5MTBQSwMEFAAAAAAAzF43TpOr0CgqAAAAKgAAABsAAABsaWNlbnNlcy9nb29nbGUtZ2RrLWxpY2Vuc2UNCjMzYjZhMmI2NDYwN2YxMWI3NTlmMzIwZWY5ZGZmNGFlNWM0N2Q5N2FQSwMEFAAAAAAAz143TqxN4xEqAAAAKgAAACQAAABsaWNlbnNlcy9pbnRlbC1hbmRyb2lkLWV4dHJhLWxpY2Vuc2UNCmQ5NzVmNzUxNjk4YTc3YjY2MmYxMjU0ZGRiZWVkMzkwMWU5NzZmNWFQSwMEFAAAAAAA0l43Tu2ee/8qAAAAKgAAACYAAABsaWNlbnNlcy9taXBzLWFuZHJvaWQtc3lzaW1hZ2UtbGljZW5zZQ0KNjNkNzAzZjU2OTJmZDg5MWQ1YWNhY2ZiZDhlMDlmNDBmYzk3NjEwNVBLAQIUABQAAAAAAKJeN06amkPzKgAAACoAAAAhAAAAAAAAAAEAIAAAAAAAAABsaWNlbnNlcy9hbmRyb2lkLWdvb2dsZXR2LWxpY2Vuc2VQSwECFAAUAAAACACgazdORPmEqkMAAABUAAAAHAAAAAAAAAABACAAAABpAAAAbGljZW5zZXMvYW5kcm9pZC1zZGstbGljZW5zZVBLAQIUABQAAAAAAMVeN06RAmOwKgAAACoAAAAkAAAAAAAAAAEAIAAAAOYAAABsaWNlbnNlcy9hbmRyb2lkLXNkay1wcmV2aWV3LWxpY2Vuc2VQSwECFAAUAAAAAADMXjdOk6vQKCoAAAAqAAAAGwAAAAAAAAABACAAAABSAQAAbGljZW5zZXMvZ29vZ2xlLWdkay1saWNlbnNlUEsBAhQAFAAAAAAAz143TqxN4xEqAAAAKgAAACQAAAAAAAAAAQAgAAAAtQEAAGxpY2Vuc2VzL2ludGVsLWFuZHJvaWQtZXh0cmEtbGljZW5zZVBLAQIUABQAAAAAANJeN07tnnv/KgAAACoAAAAmAAAAAAAAAAEAIAAAACECAABsaWNlbnNlcy9taXBzLWFuZHJvaWQtc3lzaW1hZ2UtbGljZW5zZVBLBQYAAAAABgAGANoBAACPAgAAAAA=" -$content = [System.Convert]::FromBase64String($base64Content) -Set-Content -Path .\android-sdk-licenses.zip -Value $content -Encoding Byte -$sdkInstallRoot = "C:\Program Files (x86)\Android\android-sdk" -$sdkRoot = "C:\Android\android-sdk" -Expand-Archive -Path .\android-sdk-licenses.zip -DestinationPath $sdkInstallRoot -Force -New-Item -Path "C:\Android" -ItemType Directory -New-Item -Path "$sdkRoot" -ItemType SymbolicLink -Value "$sdkInstallRoot" - -# run the updates. -# keep newer versions in descending order - -# Get android content from toolset -$androidToolset = (Get-ToolsetContent).android -$sdkManager = "$sdkRoot\tools\bin\sdkmanager.bat" - -& $sdkManager --sdk_root=$sdkRoot "platform-tools" - -# get packages info -$androidPackages = Get-AndroidPackages -AndroidSDKManagerPath $sdkManager - -# platforms -[int]$platformMinVersion = $androidToolset.platform_min_version -$platformListByVersion = Get-AndroidPackagesByVersion -AndroidPackages $androidPackages ` - -PrefixPackageName "platforms;" ` - -MinimumVersion $platformMinVersion ` - -Delimiter "-" ` - -Index 1 -$platformListByName = Get-AndroidPackagesByName -AndroidPackages $androidPackages ` - -PrefixPackageName "platforms;" | Where-Object {$_ -match "-\D+$"} -$platformList = $platformListByVersion + $platformListByName - -# build-tools -[version]$buildToolsMinVersion = $androidToolset.build_tools_min_version -$buildToolsList = Get-AndroidPackagesByVersion -AndroidPackages $androidPackages ` - -PrefixPackageName "build-tools;" ` - -MinimumVersion $buildToolsMinVersion ` - -Delimiter ";" ` - -Index 1 - -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 -$ndkLTSMajorVersion = $androidToolset.ndk.lts -$ndkLatestMajorVersion = $androidToolset.ndk.latest - -$ndkLTSPackageName = Get-AndroidPackagesByName -AndroidPackages $androidPackages ` - -PrefixPackageName "ndk;$ndkLTSMajorVersion" ` - | Sort-Object -Unique ` - | Select-Object -Last 1 - -$ndkLatestPackageName = Get-AndroidPackagesByName -AndroidPackages $androidPackages ` - -PrefixPackageName "ndk;$ndkLatestMajorVersion" ` - | Sort-Object -Unique ` - | Select-Object -Last 1 - -$androidNDKs = @($ndkLTSPackageName, $ndkLatestPackageName) - - -Install-AndroidSDKPackages -AndroidSDKManagerPath $sdkManager ` - -AndroidSDKRootPath $sdkRoot ` - -AndroidPackages $androidNDKs - -$ndkLTSVersion = $ndkLTSPackageName.Split(';')[1] -$ndkLatestVersion = $ndkLatestPackageName.Split(';')[1] - -# Android NDK root path. -$ndkRoot = "$sdkRoot\ndk-bundle" -# This changes were added due to incompatibility with android ndk-bundle (ndk;22.0.7026061). -# Link issue virtual-environments: https://github.com/actions/virtual-environments/issues/2481 -# Link issue xamarin-android: https://github.com/xamarin/xamarin-android/issues/5526 -New-Item -Path $ndkRoot -ItemType SymbolicLink -Value "$sdkRoot\ndk\$ndkLTSVersion" - -if (Test-Path $ndkRoot) { - setx ANDROID_HOME $sdkRoot /M - setx ANDROID_SDK_ROOT $sdkRoot /M - setx ANDROID_NDK_HOME $ndkRoot /M - setx ANDROID_NDK_PATH $ndkRoot /M - setx ANDROID_NDK_ROOT $ndkRoot /M - (Get-Content -Encoding UTF8 "${ndkRoot}\ndk-build.cmd").replace('%~dp0\build\ndk-build.cmd','"%~dp0\build\ndk-build.cmd"')|Set-Content -Encoding UTF8 "${ndkRoot}\ndk-build.cmd" -} else { - Write-Host "LTS NDK $ndkLTSVersion is not installed at path $ndkRoot" - exit 1 -} - -$ndkLatestPath = "$sdkRoot\ndk\$ndkLatestVersion" -if (Test-Path $ndkLatestPath) { - setx ANDROID_NDK_LATEST_HOME $ndkLatestPath /M -} else { - Write-Host "Latest NDK $ndkLatestVersion is not installed at path $ndkLatestPath" - exit 1 -} - -Invoke-PesterTests -TestFile "Android" diff --git a/images/win/scripts/SoftwareReport/SoftwareReport.Android.psm1 b/images/win/scripts/SoftwareReport/SoftwareReport.Android.psm1 index bc1ad0be7..2183a1011 100644 --- a/images/win/scripts/SoftwareReport/SoftwareReport.Android.psm1 +++ b/images/win/scripts/SoftwareReport/SoftwareReport.Android.psm1 @@ -16,21 +16,13 @@ function Get-AndroidSDKRoot { } function Get-AndroidSDKManagerPath { - return Join-Path $env:ANDROID_HOME "tools\bin\sdkmanager.bat" + return Join-Path $env:ANDROID_HOME "cmdline-tools\latest\bin\sdkmanager.bat" } function Get-AndroidInstalledPackages { $androidSDKManagerPath = Get-AndroidSDKManagerPath - $androidSDKManagerList = & $androidSDKManagerPath --list --include_obsolete - $androidInstalledPackages = @() - foreach($packageInfo in $androidSDKManagerList) { - if($packageInfo -Match "Available Packages:") { - break - } - - $androidInstalledPackages += $packageInfo - } - return $androidInstalledPackages + $androidSDKManagerList = & $androidSDKManagerPath --list_installed + return $androidSDKManagerList } function Build-AndroidTable { @@ -38,7 +30,7 @@ function Build-AndroidTable { return @( @{ "Package" = "Android Command Line Tools" - "Version" = Get-AndroidPackageVersions -PackageInfo $packageInfo -MatchedString "Android SDK Command-line Tools" + "Version" = Get-AndroidCommandLineToolsVersion }, @{ "Package" = "Android Emulator" @@ -127,6 +119,13 @@ function Get-AndroidPlatformVersions { return ($versions -Join "
") } +function Get-AndroidCommandLineToolsVersion { + $commandLineTools = Get-AndroidSDKManagerPath + (& $commandLineTools --version | Out-String).Trim() -match "(?^(\d+\.){1,}\d+$)" | Out-Null + $commandLineToolsVersion = $Matches.Version + return $commandLineToolsVersion +} + function Get-AndroidBuildToolVersions { param ( [Parameter(Mandatory)] diff --git a/images/win/scripts/Tests/Android.Tests.ps1 b/images/win/scripts/Tests/Android.Tests.ps1 index 3a56c0396..40af8c455 100644 --- a/images/win/scripts/Tests/Android.Tests.ps1 +++ b/images/win/scripts/Tests/Android.Tests.ps1 @@ -51,33 +51,52 @@ Describe "Android SDK" { $additionalToolsTestCases += @{ additionalToolVersion = $_; installedPackages = $androidInstalledPackages } } - It "Platform version is installed" -TestCases $platformTestCases { - "$installedPackages" | Should -Match "$platformVersion" - } + Context "SDKManagers" { + $testCases = @( + @{ + PackageName = "SDK tools" + Sdkmanager = "$env:ANDROID_HOME\tools\bin\sdkmanager.bat" + }, + @{ + PackageName = "Command-line tools" + Sdkmanager = "$env:ANDROID_HOME\cmdline-tools\latest\bin\sdkmanager.bat" + } + ) - It "Platform build tools is installed" -TestCases $buildToolsTestCases { - "$installedPackages" | Should -Match "$buildToolsVersion" - } - - if (Test-IsWin19) { - It "Extra package is installed" -TestCases $extraPackagesTestCases { - "$installedPackages" | Should -Match "extras;$extraPackage" - } - - It "Addon package is installed" -TestCases $addonsTestCases { - "$installedPackages" | Should -Match "add-ons;$addonPackage" + It "Sdkmanager from is available" -TestCases $testCases { + "$Sdkmanager --list" | Should -ReturnZeroExitCode } } - It "Additional tool is installed" -TestCases $additionalToolsTestCases { - "$installedPackages" | Should -Match $additionalToolVersion - } + Context "Packages" { + It "Platform version is installed" -TestCases $platformTestCases { + "$installedPackages" | Should -Match "$platformVersion" + } - It "LTS NDK is installed" -TestCases @(@{ ndkLTSVersion = $ndkLTSMajorVersion; installedPackages = $androidInstalledPackages }) { - "$installedPackages" | Should -Match "ndk;$ndkLTSVersion" - } + It "Platform build tools is installed" -TestCases $buildToolsTestCases { + "$installedPackages" | Should -Match "$buildToolsVersion" + } - It "Latest NDK is installed" -TestCases @(@{ ndkLatestVersion = $ndkLatestMajorVersion; installedPackages = $androidInstalledPackages }) { - "$installedPackages" | Should -Match "ndk;$ndkLatestVersion" + if (Test-IsWin19) { + It "Extra package is installed" -TestCases $extraPackagesTestCases { + "$installedPackages" | Should -Match "extras;$extraPackage" + } + + It "Addon package is installed" -TestCases $addonsTestCases { + "$installedPackages" | Should -Match "add-ons;$addonPackage" + } + } + + It "Additional tool is installed" -TestCases $additionalToolsTestCases { + "$installedPackages" | Should -Match $additionalToolVersion + } + + It "LTS NDK is installed" -TestCases @(@{ ndkLTSVersion = $ndkLTSMajorVersion; installedPackages = $androidInstalledPackages }) { + "$installedPackages" | Should -Match "ndk;$ndkLTSVersion" + } + + It "Latest NDK is installed" -TestCases @(@{ ndkLatestVersion = $ndkLatestMajorVersion; installedPackages = $androidInstalledPackages }) { + "$installedPackages" | Should -Match "ndk;$ndkLatestVersion" + } } } diff --git a/images/win/toolsets/toolset-2016.json b/images/win/toolsets/toolset-2016.json index 4c36f261d..d09291525 100644 --- a/images/win/toolsets/toolset-2016.json +++ b/images/win/toolsets/toolset-2016.json @@ -165,8 +165,7 @@ "additional_tools": [ "cmake;3.10.2.4988404", "cmake;3.18.1", - "patcher;v4", - "cmdline-tools;latest" + "patcher;v4" ], "ndk": { "lts": "21", diff --git a/images/win/toolsets/toolset-2019.json b/images/win/toolsets/toolset-2019.json index 5a43d7259..a409a24ea 100644 --- a/images/win/toolsets/toolset-2019.json +++ b/images/win/toolsets/toolset-2019.json @@ -165,8 +165,7 @@ "additional_tools": [ "cmake;3.10.2.4988404", "cmake;3.18.1", - "patcher;v4", - "cmdline-tools;latest" + "patcher;v4" ], "ndk": { "lts": "21", diff --git a/images/win/windows2016.json b/images/win/windows2016.json index b492cd736..b61fefa84 100644 --- a/images/win/windows2016.json +++ b/images/win/windows2016.json @@ -230,7 +230,7 @@ "{{ template_dir }}/scripts/Installers/Install-PyPy.ps1", "{{ template_dir }}/scripts/Installers/Install-Toolset.ps1", "{{ template_dir }}/scripts/Installers/Configure-Toolset.ps1", - "{{ template_dir }}/scripts/Installers/Update-AndroidSDK.ps1", + "{{ template_dir }}/scripts/Installers/Install-AndroidSDK.ps1", "{{ template_dir }}/scripts/Installers/Install-Pipx.ps1", "{{ template_dir }}/scripts/Installers/Install-PipxPackages.ps1" ] diff --git a/images/win/windows2019.json b/images/win/windows2019.json index 6b1de8d11..5bec04255 100644 --- a/images/win/windows2019.json +++ b/images/win/windows2019.json @@ -233,7 +233,7 @@ "{{ template_dir }}/scripts/Installers/Install-PyPy.ps1", "{{ template_dir }}/scripts/Installers/Install-Toolset.ps1", "{{ template_dir }}/scripts/Installers/Configure-Toolset.ps1", - "{{ template_dir }}/scripts/Installers/Update-AndroidSDK.ps1", + "{{ template_dir }}/scripts/Installers/Install-AndroidSDK.ps1", "{{ template_dir }}/scripts/Installers/Install-AzureModules.ps1", "{{ template_dir }}/scripts/Installers/Install-Pipx.ps1", "{{ template_dir }}/scripts/Installers/Install-PipxPackages.ps1"