Skip to content

Commit

Permalink
[Xamarin.Android.Tools.AndroidSdk] Default SDK component versions (#93)
Browse files Browse the repository at this point in the history
Context: https://issuetracker.google.com/issues/150189789
Context: xamarin/androidtools@3f51412

We have discovered an issue when installing Visual Studio for Mac
on macOS: certain versions of the installer will install the *latest*
Android SDK Build-tools package, currently r30.0.0.

This is a problem because recent versions of Xamarin.Android will use
`apksigner` to sign `Mono.Android.Platform.ApiLevel_*.apk` files, so
that they can be installed on API-30 targets -- API-30 targets no
longer like `jarsigner`-signed `.apk` files -- but the `apksigner`
included in the Build-tools r30 package requires JDK 9.

Visual Studio for Mac is not ready to migrate to JDK >= 9.

Consequently, on such installation environments, the Xamarin.Android
shared runtime cannot be created, as `apksigner` won't run:

	Exception in thread "main" java.lang.UnsupportedClassVersionError: com/android/apksigner/ApkSignerTool
	has been compiled by a more recent version of the Java Runtime (class file version 53.0),
	this version of the Java Runtime only recognizes class file versions up to 52.0

What we need is a way for the macOS installer to share the same
[default Android SDK component versions as Xamarin.Android itself][0].

This *could* plausibly be done by adding a git submodule reference from
the xamarin/xamarin-android repo to the macOS installer, but this is
undesirable.

Instead, both the the xamarin-android repo and the installer repo's
have existing git submodules graphs which include the
xamarin/xamarin-android-tools repo.

Add a new `Xamarin.Android.Tools.Versions.props` file, which contains
the default Android SDK component versions, as an MSBuild project file:

	<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
	   <PropertyGroup>
	     <AndroidSdkBuildToolsVersion Condition="'$(AndroidSdkBuildToolsVersion)' == ''">29.0.2</AndroidSdkBuildToolsVersion>
	     …

With this file in place, we can update the macOS installer to use
`Xamarin.Android.Tools.Versions.props` as the "source of truth" for
which versions to install.  In particular, we'll set the default
Build-tools version to 29.0.2, *not* 30.0.0, thus avoiding the problem
with `apksigner` invocations.

In the future, when `Xamarin.Android.Tools.Versions.props` is changed
*all* repos referencing xamarin/xamarin-android-tools will need to be
updated, so that everything can be on the same "page".

[0]: https://github.com/xamarin/xamarin-android/blob/5f78740d74e19b235aad62c8ea8e314c9c78ddce/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.props.in#L18-L21
  • Loading branch information
dellis1972 authored and jonpryor committed Jul 1, 2020
1 parent 3974fc3 commit 2fb1cbc
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 0 deletions.
Expand Up @@ -37,4 +37,9 @@
</FilesToSign>
</ItemGroup>

<ItemGroup>
<None Update="Xamarin.Android.Tools.Versions.props">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>
</Project>
@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8" ?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<!--
This file contains the versions of the tooling which will be installed
by default on a users machine. They should be the latest stable versions
which xamarin.android works with.
If this file is changed the submodule for androidtools should be updated,
along with any other repo which references androidtools.
-->
<AndroidSdkBuildToolsVersion Condition="'$(AndroidSdkBuildToolsVersion)' == ''">29.0.2</AndroidSdkBuildToolsVersion>
<AndroidCommandLineToolsVersion Condition=" '$(AndroidCommandLineToolsVersion)' == '' ">1.0</AndroidCommandLineToolsVersion>
<AndroidSdkPlatformToolsVersion Condition="'$(AndroidSdkPlatformToolsVersion)' == ''">29.0.5</AndroidSdkPlatformToolsVersion>
<AndroidSdkToolsVersion Condition="'$(AndroidSdkToolsVersion)' == ''">26.1.1</AndroidSdkToolsVersion>
<AndroidSdkEmulatorVersion Condition="'$(AndroidSdkEmulatorVersion)' == ''"></AndroidSdkEmulatorVersion>
<AndroidSdkPlatformVersion Condition="'$(AndroidSdkPlatformVersion)' == ''">android-29</AndroidSdkPlatformVersion>
<AndroidNdkVersion Condition="'$(AndroidNdkVersion)' == ''">16.1</AndroidNdkVersion>
</PropertyGroup>
</Project>

0 comments on commit 2fb1cbc

Please sign in to comment.