Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
e293ce9
[build] Move cmdline-tools, platform-tools, build-tools download to M…
jonathanpeppers May 21, 2026
f08bf1e
[build] Move cmake download to MSBuild
jonathanpeppers May 21, 2026
154ffaf
[build] Move emulator, system-image, platforms, m2repo, docs, source …
jonathanpeppers May 21, 2026
47105b4
[xaprepare] Remove dead Android SDK code paths
jonathanpeppers May 21, 2026
bc7ba46
Migrate NDK download/extract from xaprepare to MSBuild
jonathanpeppers May 21, 2026
48d7717
[build] Use system unzip for NDK on Linux/macOS
jonathanpeppers May 21, 2026
4b7c075
[build] Standardize on `tar -xf` for Android SDK extraction
jonathanpeppers May 21, 2026
fe16edb
[build] Replace CopyNdkRedistributables task with <Copy/>
jonathanpeppers May 21, 2026
3c7b31d
[build] Replace GenerateAndroidPackageXml with template
jonathanpeppers May 21, 2026
5a4849d
Remove stray commit-msg.tmp file
jonathanpeppers May 21, 2026
c77523c
[build] Use Path.Combine for tar source path on Unix
jonathanpeppers May 21, 2026
d4fde57
[build] Use system unzip for NDK on Unix
jonathanpeppers May 22, 2026
e7c8446
Remove stray commit-msg.tmp file
jonathanpeppers May 22, 2026
76edd62
Merge remote-tracking branch 'origin/main' into jonathanpeppers/move-…
jonathanpeppers May 26, 2026
5191a34
[build] Fix invalid '--' in XML comment in androidsdk.targets
jonathanpeppers May 26, 2026
06d2ee4
[build] Resolve _SupportLicense lazily inside _CopyExtractedMultiDexJar
jonathanpeppers May 26, 2026
2b5c45c
Remove stray commit-msg.tmp
jonathanpeppers May 26, 2026
0eb7ad4
[build] Use unzip on Linux (GNU tar cannot read .zip archives)
jonathanpeppers May 27, 2026
8e00508
[build] Always use unzip for non-Windows hosts
jonathanpeppers May 27, 2026
3220f27
Remove stray commit-msg.tmp
jonathanpeppers May 27, 2026
82cc9b6
Use UnzipDirectoryChildren on Windows for SDK extraction
jonathanpeppers May 27, 2026
68a2d4e
Quote -p:AndroidSdkPlatforms arg so pwsh keeps it intact
jonathanpeppers May 27, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 30 additions & 1 deletion Configuration.props
Original file line number Diff line number Diff line change
Expand Up @@ -111,8 +111,37 @@
<XABuildToolsHashMacOS>04E7F3A72044DE4926FA038FA0E251A37BBA1E1C3FB8BEAB6F8401BFD9EB4BF3</XABuildToolsHashMacOS>
<XABuildToolsHashLinux>5D9AC77FB6FF43D9DA518A337B4FCF8F9097113DF531D99CCEFE80EF7CE8250B</XABuildToolsHashLinux>
<XABuildToolsHashWindows>AA1095CB14D83E483818A748A2C06FAAEB8E601561B06A356A119A1B2CA280D3</XABuildToolsHashWindows>
<XAPlatformToolsPackagePrefix Condition=" '$(HostOS)' == 'Darwin' "></XAPlatformToolsPackagePrefix>
<XAPlatformToolsVersion>36.0.0</XAPlatformToolsVersion>
<XAPlatformToolsHashMacOS>D3E9FA1DF3345CF728586908426615A60863D2632F73F1CE14F0F1349EF000FD</XAPlatformToolsHashMacOS>
<XAPlatformToolsHashLinux>0EAD642C943FFE79701FCCCA8F5F1C69C4CE4F43DF2EEFEE553F6CCB27CBFBE8</XAPlatformToolsHashLinux>
<XAPlatformToolsHashWindows>12C2841F354E92A0EB2FD7BF6F0F9BF8538ABCE7BD6B060AC8349D6F6A61107C</XAPlatformToolsHashWindows>
<XACmdlineToolsHashMacOS>5673201E6F3869F418EEED3B5CB6C4BE7401502BD0AAE1B12A29D164D647A54E</XACmdlineToolsHashMacOS>
<XACmdlineToolsHashLinux>7EC965280A073311C339E571CD5DE778B9975026CFCBE79F2B1CDCB1E15317EE</XACmdlineToolsHashLinux>
<XACmdlineToolsHashWindows>98B565CB657B012DAE6794CEFC0F66AE1EFB4690C699B78A614B4A6A3505B003</XACmdlineToolsHashWindows>
<XACmakeHashMacOS>57024D590691B9D66977D2F66786F10971549441B33B7830D3D2B659F80B93EA</XACmakeHashMacOS>
<XACmakeHashLinux>8CF0DC4F7CE0173D13ED71066FB6861A79C73545DF71D12CA3E933430F268D50</XACmakeHashLinux>
<XACmakeHashWindows>026982DBA2DBD2DE4A530CF1300FFAD05F6BC7D372D9DF83D46112FE017E0C6B</XACmakeHashWindows>
<!-- Android emulator: per-host zips (and per-arch on macOS). -->
<XAEmulatorHashMacOSx64>3029489D4B2F868DC5347AA27B1E52FB48D6D28ABD51278E3FBEC2EE73201EDF</XAEmulatorHashMacOSx64>
<XAEmulatorHashMacOSArm64>EDA85B9BFFD0926B7A01EA334A30AB41827F573CBDE8F7F97FCD8C5B38F039F6</XAEmulatorHashMacOSArm64>
<XAEmulatorHashLinux>58BFDF0572F06EC007A7287154CDC6B2EBFEA947D07A1E26A0F6B5E1A39E9191</XAEmulatorHashLinux>
<XAEmulatorHashWindows>9F2855BFE98E80728E61D45B0EA72BA22F64952C9330559FA4E2CD3698A32231</XAEmulatorHashWindows>
<!-- API 29 system image used by the emulator: per-host (x86_64) and macOS arm64 (arm64-v8a). -->
<XASystemImageHashMacOSx64>B5C3FDA1F4B4931C30518D342E4AD5F7464945E0CDCED3538D4FF2E12F7BF201</XASystemImageHashMacOSx64>
<XASystemImageHashMacOSArm64>7FD1610E16A69AC2E202278E82077DE134CE404FE099D872019F69F3A340ACDD</XASystemImageHashMacOSArm64>
<XASystemImageHashLinux>B5C3FDA1F4B4931C30518D342E4AD5F7464945E0CDCED3538D4FF2E12F7BF201</XASystemImageHashLinux>
<XASystemImageHashWindows>B5C3FDA1F4B4931C30518D342E4AD5F7464945E0CDCED3538D4FF2E12F7BF201</XASystemImageHashWindows>
<!-- SDK build dependencies (host-agnostic single zip each). -->
<XAAndroidM2RepositoryHash>A3F91808DCE50C1717737DE90C18479ED3A78B147E06985247D138E7AB5123D0</XAAndroidM2RepositoryHash>
<XAAndroidDocsHash>68DB2690CB92E4EE5373AC9B792642C90717D8F417D83ECCEA48781171B3182A</XAAndroidDocsHash>
<XAAndroidSourcesHash>BD97900346A70C784AC8B15C809539DDEF34ED3B5BE1DF8A9A89CF298BE93798</XAAndroidSourcesHash>
<!-- Android NDK: per-host zips. Use a private property name; the public
$(AndroidNdkVersion) is set to the pkg revision in Common.props.in. -->
<_XAAndroidNdkRelease>28c</_XAAndroidNdkRelease>
<_XAAndroidNdkPkgRevision>28.2.13676358</_XAAndroidNdkPkgRevision>
<XAAndroidNdkHashMacOS>0D4599E8BBF1A1668A0D51A541729B2246360F350018A2081D0B302DBB594F2A</XAAndroidNdkHashMacOS>
<XAAndroidNdkHashLinux>DFB20D396DF28CA02A8C708314B814A4D961DC9074F9A161932746F815AA552F</XAAndroidNdkHashLinux>
<XAAndroidNdkHashWindows>6BEC98AC2354D8A919760889A1A41D020132E5E8CFA1B1FE51610A72C36A466B</XAAndroidNdkHashWindows>
<XABundleToolVersion Condition="'$(XABundleToolVersion)' == ''">1.18.3</XABundleToolVersion>
<XABundleToolHash Condition="'$(XABundleToolHash)' == ''">A099CFA1543F55593BC2ED16A70A7C67FE54B1747BB7301F37FDFD6D91028E29</XABundleToolHash>
<XABinutilsVersion Condition="'$(XABinutilsVersion)' == ''">L_18.1.6-8.0.0-1</XABinutilsVersion>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,15 +52,15 @@ steps:

- template: /build-tools/automation/yaml-templates/run-xaprepare.yaml
parameters:
arguments: --s=${{ parameters.xaprepareScenario }} --android-sdk-platforms="${{ parameters.androidSdkPlatforms }}"
arguments: --s=${{ parameters.xaprepareScenario }}
xaSourcePath: ${{ parameters.xaSourcePath }}

- template: /build-tools/automation/yaml-templates/run-dotnet-preview.yaml
parameters:
displayName: install OpenJDK and accept Android SDK licenses
xaSourcePath: ${{ parameters.xaSourcePath }}
project: ${{ parameters.xaSourcePath }}/src/androidsdk/androidsdk.csproj
arguments: -c ${{ parameters.configuration }} -bl:${{ parameters.xaSourcePath }}/bin/Test${{ parameters.configuration }}/androidsdk.binlog
arguments: -c ${{ parameters.configuration }} '-p:AndroidSdkPlatforms=${{ parameters.androidSdkPlatforms }}' -bl:${{ parameters.xaSourcePath }}/bin/Test${{ parameters.configuration }}/androidsdk.binlog
continueOnError: false

- task: DotNetCoreCLI@2
Expand Down
7 changes: 4 additions & 3 deletions build-tools/manifest-attribute-codegen/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,12 @@ This generally only needs to be done each time we bind a new Android API level.

# How to use

Ensure all Android platform SDK levels are installed. This can be done with `xaprepare`;
run the following command from the checkout toplevel:
Ensure all Android platform SDK levels are installed. This is done via the
`androidsdk.csproj` project; run the following command from the checkout
toplevel:

```dotnetcli
dotnet run --project "build-tools/xaprepare/xaprepare/xaprepare.csproj" -- -s AndroidTestDependencies --android-sdk-platforms=all
dotnet build src/androidsdk/androidsdk.csproj -p:AndroidSdkPlatforms=all
```

Next, from this directory, run:
Expand Down

This file was deleted.

91 changes: 18 additions & 73 deletions build-tools/xaprepare/xaprepare/Application/BuildInfo.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,17 +9,26 @@ namespace Xamarin.Android.Prepare
{
partial class BuildInfo : AppObject
{
static readonly char[] NDKPropertySeparator = new [] { '=' };

public string CommitOfLastVersionChange { get; private set; } = String.Empty;

// Not available from the start, only after NDK is installed
public string NDKRevision { get; private set; } = String.Empty;
public string NDKVersionMajor { get; private set; } = String.Empty;
public string NDKVersionMinor { get; private set; } = String.Empty;
public string NDKVersionMicro { get; private set; } = String.Empty;
public string NDKVersionTag { get; private set; } = String.Empty;
public string NDKMinimumApiAvailable { get; private set; } = String.Empty;
// NDK version info is now derived directly from BuildAndroidPlatforms.AndroidNdkPkgRevision
// (single source of truth shared with src/androidsdk/androidsdk.targets via Configuration.props).
public string NDKRevision => BuildAndroidPlatforms.AndroidNdkPkgRevision;
public string NDKVersionMajor => NDKVersion.Major.ToString ();
public string NDKVersionMinor => NDKVersion.Minor.ToString ();
public string NDKVersionMicro => NDKVersion.Build.ToString ();

Version? cachedNdkVersion;
Version NDKVersion {
get {
if (cachedNdkVersion != null)
return cachedNdkVersion;
if (!Utilities.ParseAndroidPkgRevision (BuildAndroidPlatforms.AndroidNdkPkgRevision, out Version? ver, out _) || ver == null)
throw new InvalidOperationException ($"Unable to parse NDK revision '{BuildAndroidPlatforms.AndroidNdkPkgRevision}' as a valid version string");
cachedNdkVersion = ver;
return ver;
}
}

public string VersionHash { get; private set; } = String.Empty;
public string XACommitHash { get; private set; } = String.Empty;
Expand All @@ -44,70 +53,6 @@ void DetermineXACommitInfo (Context context)
XABranch = git.GetBranchName ();
}

public bool GatherNDKInfo (Context context)
{
string ndkDir = Configurables.Paths.AndroidNdkDirectory;
string props = Path.Combine (ndkDir, "source.properties");
if (!File.Exists (props)) {
Log.ErrorLine ("NDK properties file does not exist: ", props, tailColor: Log.DestinationColor);
return false;
}

string[] lines = File.ReadAllLines (props);
foreach (string l in lines) {
string line = l.Trim ();
string[] parts = line.Split (NDKPropertySeparator, 2);
if (parts.Length != 2)
continue;

if (String.Compare ("Pkg.Revision", parts [0].Trim (), StringComparison.Ordinal) != 0)
continue;

string rev = parts [1].Trim ();
NDKRevision = rev;

if (!Utilities.ParseAndroidPkgRevision (rev, out Version? ver, out string? tag) || ver == null) {
Log.ErrorLine ($"Unable to parse NDK revision '{rev}' as a valid version string");
return false;
}

NDKVersionMajor = ver.Major.ToString ();
NDKVersionMinor = ver.Minor.ToString ();
NDKVersionMicro = ver.Build.ToString ();
NDKVersionTag = tag ?? String.Empty;
break;
}

Log.DebugLine ($"Looking for minimum API available in {ndkDir}");
int minimumApi = Int32.MaxValue;
foreach (var kvp in Configurables.Defaults.AndroidToolchainPrefixes) {
string dirName = kvp.Value;
string platforms = Path.Combine (Configurables.Paths.AndroidToolchainSysrootLibDirectory, dirName);
Log.DebugLine ($" searching in {platforms}");
foreach (string p in Directory.EnumerateDirectories (platforms, "*", SearchOption.TopDirectoryOnly)) {
string plibc = Path.Combine (p, "libc.so");
if (!Utilities.FileExists (plibc)) {
continue;
}

Log.DebugLine ($" found {p}");
string pdir = Path.GetFileName (p);
int api;
if (!Int32.TryParse (pdir, out api))
continue;

if (api >= minimumApi)
continue;

minimumApi = api;
}
}

Log.DebugLine ($"Detected minimum NDK API level: {minimumApi}");
NDKMinimumApiAvailable = minimumApi.ToString ();
return true;
}

async Task DetermineLastVersionChangeCommit (Context context)
{
Log.StatusLine ($" {context.Characters.Bullet} Commit of last version change", ConsoleColor.Gray);
Expand Down
10 changes: 0 additions & 10 deletions build-tools/xaprepare/xaprepare/Application/Context.cs
Original file line number Diff line number Diff line change
Expand Up @@ -277,16 +277,6 @@ public string DebugFileExtension {
}
}

/// <summary>
/// Collection of programs or dependencies which should be reinstalled.
/// </summary>
public RefreshableComponent ComponentsToRefresh { get; set; }

/// <summary>
/// Collection of Android SDK platform levels to be installed.
/// </summary>
public IEnumerable<string> AndroidSdkPlatforms { get; set; } = Enumerable.Empty<string> ();

/// <summary>
/// Path to a local .NET SDK archive to use instead of downloading.
/// </summary>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,6 @@ namespace Xamarin.Android.Prepare
{
static class KnownProperties
{
public const string AndroidCmakeUrlPrefix = "AndroidCmakeUrlPrefix";
public const string AndroidCmakeVersion = "AndroidCmakeVersion";
public const string AndroidCmakeVersionPath = "AndroidCmakeVersionPath";
public const string AndroidMinimumDotNetApiLevel = "AndroidMinimumDotNetApiLevel";
public const string AndroidDefaultTargetDotnetApiLevel = "AndroidDefaultTargetDotnetApiLevel";
public const string AndroidLatestStableApiLevel = "AndroidLatestStableApiLevel";
Expand Down Expand Up @@ -56,6 +53,5 @@ static class KnownProperties
public const string XAInstallPrefix = "XAInstallPrefix";
public const string XAPackagesDir = "XAPackagesDir";
public const string XAPlatformToolsVersion = "XAPlatformToolsVersion";
public const string XAPlatformToolsPackagePrefix = "XAPlatformToolsPackagePrefix";
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,6 @@ namespace Xamarin.Android.Prepare
{
void InitDefaults ()
{
properties.Add (KnownProperties.AndroidCmakeUrlPrefix, StripQuotes ("@AndroidCmakeUrlPrefix@"));
properties.Add (KnownProperties.AndroidCmakeVersion, StripQuotes ("@AndroidCmakeVersion@"));
properties.Add (KnownProperties.AndroidCmakeVersionPath, StripQuotes (@"@AndroidCmakeVersionPath@"));
properties.Add (KnownProperties.AndroidMinimumDotNetApiLevel, StripQuotes ("@AndroidMinimumDotNetApiLevel@"));
properties.Add (KnownProperties.AndroidDefaultTargetDotnetApiLevel, StripQuotes ("@AndroidDefaultTargetDotnetApiLevel@"));
properties.Add (KnownProperties.AndroidLatestStableApiLevel, StripQuotes ("@AndroidLatestStableApiLevel@"));
Expand Down Expand Up @@ -60,7 +57,6 @@ namespace Xamarin.Android.Prepare
properties.Add (KnownProperties.XAInstallPrefix, StripQuotes (@"@XAInstallPrefix@"));
properties.Add (KnownProperties.XAPackagesDir, StripQuotes (@"@XAPackagesDir@"));
properties.Add (KnownProperties.XAPlatformToolsVersion, StripQuotes ("@XAPlatformToolsVersion@"));
properties.Add (KnownProperties.XAPlatformToolsPackagePrefix, StripQuotes ("@XAPlatformToolsPackagePrefix@"));
}

string StripQuotes (string input)
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ partial class Defaults

partial class Paths
{
public const string NdkToolchainOSTag = "linux-x86_64";
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ partial class Defaults
partial class Paths
{
public const string MonoCrossRuntimeInstallPath = "Darwin";
public const string NdkToolchainOSTag = "darwin-x86_64";
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ partial class Defaults

partial class Paths
{
public const string NdkToolchainOSTag = "windows-x86_64";
}

partial class Urls
Expand Down
Loading