Xamarin.Android 10.1 release notes
| GitHub | Developer Community | System requirements | Blogs |
Important
The default names for generated Java types are different in this release. Any project that explicitly uses one of the old default names that starts with md5 will need to be updated by hand to account for this change. See Breaking change for generated Java type names below for more details.
Installing
- Visual Studio 2019 version 16.4 — Visual Studio Installer
- Visual Studio 2019 for Mac version 8.4 — Visual Studio for Mac Installer with the Stable updater channel
What's new in Xamarin.Android 10.1
Xamarin.Android 10.1 releases
- February 11, 2020 — Xamarin.Android 10.1.4.0 in Visual Studio 2019 verion 16.4.5
- January 14, 2020 — Xamarin.Android 10.1.3.7 in Visual Studio 2019 verion 16.4.3 and Visual Studio 2019 for Mac version 8.4.1
- January 8, 2020 — Xamarin.Android 10.1.1.0 in Visual Studio 2019 for Mac version 8.4
- December 10, 2019 — Xamarin.Android 10.1.1.0 in Visual Studio 2019 version 16.4.1
- December 3, 2019 — Xamarin.Android 10.1.0.30 in Visual Studio 2019 version 16.4
Corresponding Visual Studio 2019 release notes
February 11, 2020 — Xamarin.Android 10.1.4.0
This version is included in the Visual Studio 2019 version 16.4.5 release. A corresponding version is not yet available in Visual Studio 2019 for Mac version 8.4. These notes will be updated when the corresponding version is available.
Issues fixed in Xamarin.Android 10.1.4.0
Application and library build and deployment
- Developer Community 790804, Developer Community 854497: Starting in Xamarin.Android 10.1, Mono.AndroidTools.RequiresUninstallException: The installed package is incompatible. Please manually uninstall and try again. interrupted deployment if the keystore used to sign the app had changed compared to the previous deployment. Xamarin.Android 10.1.4.0 now automatically takes care of uninstalling the app in this case, like Xamarin.Android 10.0 did.
January 14, 2020 — Xamarin.Android 10.1.3.7
This version is included in the Visual Studio 2019 version 16.4.3 release and in the Stable updater channel of Visual Studio 2019 for Mac version 8.4.1.
Issues fixed in Xamarin.Android 10.1.3.7
Application and library build and deployment
- Developer Community 845978, GitHub 3993: Starting in Xamarin.Android 10.1, You uploaded an APK or Android App Bundle with invalid or missing signing information for some of its files. prevented uploading successfully to Google Play for apps built using the Android App Bundle publishing format.
Application Mono Framework behavior on device and emulator
This version of Xamarin.Android updates the Mono 6.6 runtime and class libraries from Commit bef1e633 to Commit fd9f379d, adding 3 new commits.
Fixes included for issues reported with Xamarin.Android applications:
- Developer Community 756697:
Starting in Xamarin.Android 10.0, NTLM authentication in Xamarin.Android
apps no longer worked, resulting in server-side
System.ComponentModel.Win32Exception
exceptions.
December 10, 2019 and January 8, 2020 — Xamarin.Android 10.1.1.0
This version is included in the Visual Studio 2019 version 16.4.1 release and in the Stable updater channel of Visual Studio 2019 for Mac version 8.4.
This version of Xamarin.Android updates the Mono 6.6 runtime and class libraries from Commit e1ef7743 to Commit bef1e633, adding 9 new commits.
This update does not contain any changes that affect Xamarin.Android. The update just keeps the Mono commit aligned with Xamarin.iOS, Xamarin.Mac, and Visual Studio for Mac.
December 3, 2019 — Xamarin.Android 10.1.0.30
This version is included in the Visual Studio 2019 version 16.4 release.
Summary of what's new in Xamarin.Android 10.1.0.30
- Breaking change for generated Java type names
- SHA-256 by default for APK signing and digest algorithms
- IDE support for Android App Bundle publishing format
- Mono Framework version update to 6.6
- Build and deployment performance
- App startup performance
- Environment variables and files for package signing passwords
- C# 8.0 default interface members for bindings projects
- New build warnings XA0119, XA0121, XA5302
- aprofutil analysis tool
- External tool version updates
- Issues fixed
- Known issues
Breaking change for generated Java type names
Important
Any project that explicitly uses one of the old default Java type names that starts with md5 will break in Xamarin.Android 10.1.
To restore the previous behavior temporarily, you can set the
$(AndroidPackageNamingPolicy)
MSBuild property to LowercaseMD5
in your
.csproj file:
<PropertyGroup>
<AndroidPackageNamingPolicy>LowercaseMD5</AndroidPackageNamingPolicy>
</PropertyGroup>
This backward compatibility option will be removed in the upcoming
Xamarin.Android 10.2 version, so authors of projects that currently include
literal uses of these default names are encouraged to transition to
alternatives like the [Register]
attribute and the [Activity]
attribute as
soon as possible.
Example breakage for a custom view
For a custom view like:
namespace AndroidApp1
{
public class View1 : View
{
/* ... */
}
}
One scenario that will break is if the literal Java type name
md559d7fc296fc238aa7bec92ba27f2cb33.View1
is used in a layout file:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<md559d7fc296fc238aa7bec92ba27f2cb33.View1
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
This will result in an error when the app tries to inflate the layout:
Android.Views.InflateException: Binary XML file line #1 in com.contoso.androidapp1:layout/layout1: Binary XML file line #1 in com.contoso.androidapp1:layout/layout1: Error inflating class md559d7fc296fc238aa7bec92ba27f2cb33.View1 ---> Android.Views.InflateException: Binary XML file line #1 in com.contoso.androidapp1:layout/layout1: Error inflating class md559d7fc296fc238aa7bec92ba27f2cb33.View1 ---> Java.Lang.ClassNotFoundException: md559d7fc296fc238aa7bec92ba27f2cb33.View1 ---> Java.Lang.ClassNotFoundException: Didn't find class "md559d7fc296fc238aa7bec92ba27f2cb33.View1" on path: DexPathList
The typical fix is to use the type name of C# class in the layout file instead:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
- <md559d7fc296fc238aa7bec92ba27f2cb33.View1
+ <AndroidApp1.View1
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
Another option is to use a [Register]
attribute to customize the generated
Java type name:
namespace AndroidApp1
{
+ [Register("com.contoso.androidapp1.view1")]
public class View1 : View
{
And then use that customized name in the layout file:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
- <md559d7fc296fc238aa7bec92ba27f2cb33.View1
+ <com.contoso.androidapp1.view1
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
Example breakage for an activity
For an activity like:
namespace AndroidApp1
{
public class MainActivity : Activity
{
/* ... */
}
}
One scenario that will break is if the literal Java type name
md559d7fc296fc238aa7bec92ba27f2cb33.MainActivity
is used in the
AndroidManifest.xml file:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
android:versionCode="1"
android:versionName="1.0"
package="com.contoso.androidapp1">
<uses-sdk android:minSdkVersion="21" android:targetSdkVersion="28" />
<application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme">
<activity android:label="@string/app_name" android:name="md559d7fc296fc238aa7bec92ba27f2cb33.MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
This will result in an error when the app tries to start the activity:
java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.contoso.androidapp1/md559d7fc296fc238aa7bec92ba27f2cb33.MainActivity}: java.lang.ClassNotFoundException: Didn't find class "md559d7fc296fc238aa7bec92ba27f2cb33.MainActivity" on path: DexPathList
The typical fix is to add an [Activity]
attribute on the C# class to generate
the <activity>
manifest element automatically:
namespace AndroidApp1
{
+ [Activity(Label = "@string/app_name", MainLauncher = true)]
public class MainActivity : Activity
{
And then remove the handwritten <activity>
element from AndroidManifest.xml:
<application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme">
- <activity android:label="@string/app_name" android:name="md559d7fc296fc238aa7bec92ba27f2cb33.MainActivity">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
- </activity>
</application>
Background information
This change comes from GitHub PR 3649, which switched the checksum algorithm used to create names for generated Java types from MD5 to CRC-64 to improve compatibility with build environments that have FIPS compliance enforced.
The use of MD5 checksums for these names was originally introduced in Xamarin.Android 5 to reduce the chance of conflicts among the names. See the release notes from that version and the related documentation for additional examples of how to resolve issues related to this change.
SHA-256 by default for APK signing and digest algorithms
Xamarin.Android 10.1 switches the default value of the
$(AndroidApkSigningAlgorithm)
MSBuild property from md5withRSA
to
SHA256withRSA
and the default value of the $(AndroidApkDigestAlgorithm)
MSBuild property from SHA1
to SHA-256
. The $(AndroidApkSigningAlgorithm)
property corresponds to the -sigalg
option of the jarsigner
command, and the $(AndroidApkDigestAlgorithm)
corresponds to the -digestalg
option.
This change is not expected to cause complications for existing apps, but if needed, existing projects can restore the previous behavior by setting the MSBuild properties back to the previous values in the .csproj file:
<PropertyGroup>
<AndroidApkSigningAlgorithm>md5withRSA</AndroidApkSigningAlgorithm>
<AndroidApkDigestAlgorithm>SHA1</AndroidApkDigestAlgorithm>
</PropertyGroup>
Note that for projects configured to use the Android App Bundle publishing
format, the older options are not relevant because the Android App Bundle
publishing format already required the SHA256withRSA
and SHA-256
algorithms
in Xamarin.Android 10.0 and earlier.
Background information
This change comes from GitHub PR 3649. The reason for the change is to improve compatibility with build environments that have FIPS compliance enforced.
IDE support for Android App Bundle publishing format
Visual Studio 2019 version 16.4 and Visual Studio 2019 for Mac version 8.4 add IDE compatibility for the Android App Bundle publishing format. On Windows, this publishing format can now be enabled by setting Android Package Format to bundle in the Android Options section of the project property pages:
On macOS, this publishing format can be enabled by setting Android Package Format to aab in the Android Build section of the project property pages:
The Build > Archive and Build > Archive for Publishing commands are now also compatible with the new publishing format. This resolves the following issue:
- Developer Community 669333: Failed to create App archive, Invalid Android Archive (no .APK files) when attempting to use new Android App Bundle publishing format with the Build > Archive command.
Background information
Xamarin.Android 9.4 introduced initial command line support for the Android App Bundle publishing format. Xamarin.Android 10.0 in Visual Studio 2019 version 16.3 expanded on that support by addressing a limitation related to the on-device Install location. But the option for the Android App Bundle publishing format was not yet available in the Visual Studio project property pages, and the Build > Archive command in the IDE did not yet support the new publishing format.
Mono Framework version update to 6.6
This version of Xamarin.Android updates the Mono runtime and class libraries from Mono 6.4 to Mono 6.6 Commit e1ef7743, adding about 800 new commits.
Build and deployment performance
- GitHub PR 3296:
Remove an unneeded LINQ
Distinct()
call from theResolveLibraryProjectImports
task. This saved about 25 milliseconds for each run of the task in a test environment. - GitHub PR 3354:
Improve the behavior of the
_GenerateJavaStubs
task so that it is skipped as expected during an incremental build of a Xamarin.Android bindings library project when no files have changed. - GitHub PR 3359:
Allow the managed linker to read the input assemblies from their original
locations instead of copying them to an intermediate obj\Debug\*\linksrc
directory beforehand. This removes the
_CopyMdbFiles
,_CopyPdbFiles
, and_CopyIntermediateAssemblies
targets. Those targets previously took approximately 150 milliseconds for a test Xamarin.Forms app when only one XAML file was changed between builds. Depending on system speed and antivirus settings, the total savings can be greater. For example, for one tested example project and environment, the overall build time decreased from about 33 seconds to about 30 seconds. - GitHub PR 3528:
Correct the
Inputs
andOutputs
for theSetupDependenciesForDesigner
and_ResolveLibraryProjectImports
targets, and add an option for theJavac
task to skip creating a classes.zip file when running for the designer. In addition to improving the designer responsiveness, this also allows projects to skip the_CompileToDalvikWithDx
or_CompileToDalvikWithD8
target in incremental builds when only an Android XML layout file has changed. For example, in one test of an example project, the_CompileToDalvikWithD8
target previously took roughly 4.6 seconds for this scenario, and now it is skipped completely. - GitHub PR 3535,
GitHub PR 3600:
Add and switch to a new specialized
LinkAssembliesNoShrink
MSBuild task for Debug builds. In the Debug scenario, where the managed linker is not set to remove any types, the managed linker only needs to run a quick step to adjust abstract methods in Xamarin.Android assemblies. The new specialized task reduced the time for the_LinkAssembliesNoShrink
target from about 340 milliseconds to about 10 milliseconds for a test Xamarin.Forms app when one line of a XAML file was changed between builds. - GitHub PR 3555:
Improve the behavior around the
_BuildApkFastDev
target so it is skipped correctly when a Xamarin.Android app project has changes that do not require building a new APK. For example, changes to user-defined classes do not require a new APK unless they inherit fromJava.Lang.Object
, but the target was running if any class in the app project changed. Correcting this behavior saved roughly 2.5 seconds for the deployment time of a small test Xamarin.Android app on a fast build machine. - GitHub PR 3640:
Use System.Reflection.Metadata rather than Cecil for
ResolveLibraryProjectImports
. This reduced the time for theResolveLibraryProjectImports
task from about 4.8 seconds to about 4.5 seconds for a small test Xamarin.Forms app on an initial clean build. - Java.Interop GitHub PR 440, Java.Interop GitHub PR 441, Java.Interop GitHub PR 442, Java.Interop GitHub PR 448, Java.Interop GitHub PR 449, Java.Interop GitHub PR 452: Optimize several of the build steps for bindings projects. For a large binding like Mono.Android.dll itself, this reduced the total build time in a test environment by about 50 seconds.
- GitHub PR 3592:
When Use Fast Deployment is enabled, cache some of the information
that is retrieved from the device during the first deployment so that it can
be reused on subsequent deployments of the same app until Visual Studio is
restarted. This reduced the time for the
InstallPackageAssemblies
task during the second deployment of a Xamarin.Forms app where one line of a XAML file was changed from about 500 milliseconds to about 375 milliseconds in a test environment.
App startup performance
GitHub PR 3660:
Switch from unzip
to a custom minimal .zip file format reader to load
managed assemblies from the APK during startup. This reduced the
Runtime.init()
phase of application startup for a small Xamarin.Forms test app
targeting the arm64-v8a ABI from about 230 milliseconds to about 170
milliseconds on a Google Pixel 3 device running Android 10.
Environment variables and files for package signing passwords
Until now, the Keystore Password and Alias Password settings in the Android Package Signing section of the Visual Studio project property pages only supported literal password values. Starting in Xamarin.Android 10.1, these settings now support a new syntax that allows entering environment variable names or file names instead. These options provide a way to prevent the passwords from appearing in build logs.
To use an environment variable name, prefix the name with env:. To use a local file path, prefix the path with file:.
For example, to use an environment variable named AndroidSigningPassword for
both settings, enter env:AndroidSigningPassword under both the Keystore
Password and Alias Password settings. This sets the corresponding
$(AndroidSigningStorePass)
and $(AndroidSigningKeyPass)
MSBuild properties
in your .csproj file:
<PropertyGroup>
<AndroidSigningStorePass>env:AndroidSigningPassword</AndroidSigningStorePass>
<AndroidSigningKeyPass>env:AndroidSigningPassword</AndroidSigningKeyPass>
</PropertyGroup>
To use a file located at C:\Users\Windows User\AndroidSigningPassword.txt for
both settings, enter file:C:\Users\Windows User\AndroidSigningPassword.txt.
This again sets the corresponding $(AndroidSigningStorePass)
and
$(AndroidSigningKeyPass)
MSBuild properties in your .csproj file:
<PropertyGroup>
<AndroidSigningStorePass>file:C:\Users\Windows User\AndroidSigningPassword.txt</AndroidSigningStorePass>
<AndroidSigningKeyPass>file:C:\Users\Windows User\AndroidSigningPassword.txt</AndroidSigningKeyPass>
</PropertyGroup>
Note that if the same file is specified for both settings, the file must contain two lines. The first line must be the keystore password, and the second line must be the alias password.
This resolves the following issue:
- GitHub 3513:
The only way to provide package signing passwords to the
SignAndroidPackage
target was to place the literal passwords directly in the$(AndroidSigningStorePass)
and$(AndroidSigningKeyPass)
properties, meaning that the passwords would be logged to the build output.
C# 8.0 default interface members for bindings projects
In Android 7.0 Nougat (API level 24) and higher, some Android libraries started using new Java 8 language features, including:
- Default interface methods
- Static interface methods
- Interface constants
C# 8.0 introduces a similar default interface members language feature. Starting in Xamarin.Android 10.1, Xamarin.Android bindings projects can now take advantage of this new capability to surface C# APIs that more closely match the original APIs in the Java libraries.
To try this functionality with your bindings project, set the $(LangVersion)
MSBuild property to preview
and the $(_EnableInterfaceMembers)
MSBuild
property to true
in your .csproj file:
<PropertyGroup>
<LangVersion>preview</LangVersion>
<_EnableInterfaceMembers>true</_EnableInterfaceMembers>
</PropertyGroup>
Note that enabling this new option only adds members. It does not remove the previous style of C# bindings for these kinds of Java APIs.
New build warnings XA0119, XA0121, XA5302
XA0119 warning for non-ideal Debug build configurations
Xamarin.Android 10.1 adds a new XA0119 build warning to identify cases where
projects might have unintentionally enabled settings that slow down deployments
in the Debug configuration. For the best Debug configuration deployment
performance, first ensure that Use Shared Runtime is enabled in the Visual
Studio project property pages. This sets the $(AndroidUseSharedRuntime)
MSBuild property to true
in your .csproj file:
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<AndroidUseSharedRuntime>true</AndroidUseSharedRuntime>
</PropertyGroup>
When Use Shared Runtime is enabled, an XA0119 warning will appear if any of the following settings are enabled:
- Android Package Format set to bundle
- Code shrinker
- AOT Compilation
- Enable Startup Tracing
- Linking
Be sure to disable these settings for the best Debug configuration deployment performance.
XA0121 deprecation warning for old Xamarin.Android.Support library versions
Xamarin.Android 10.1 adds a new XA0121 build warning to identify cases where
projects are still using certain Xamarin.Android.Support libraries version 26 or
earlier that depend on the old GetAdditionalResourcesFromAssemblies
MSBuild
task to download dependencies from Google during the build process:
warning XA0121: Assembly 'Xamarin.Android.Support.Animated.Vector.Drawable.dll' is using a deprecated attribute '[assembly: Android.IncludeAndroidResourcesFromAttribute]'. Use a newer version of this NuGet package or notify the library author.
Current versions of the Xamarin.Android.Support libraries instead use the
Xamarin.Build.Download library to handle the downloads. That new mechanism
improves the behavior in the IDE. Depending on user feedback about the XA0121
warning, the plan is that a future version of Xamarin.Android will remove the
old GetAdditionalResourcesFromAssemblies
MSBuild task completely to improve
build performance
This warning will also identify other libraries from the Xamarin community that might be using the old download mechanism. Library authors are encouraged to transition to Xamarin.Build.Download at their earliest convenience to resolve this warning.
XA5302 warning when multiple MSBuild targets are invoked in parallel
Xamarin.Android did not yet produce a warning if Visual Studio invoked one of the Xamarin.Android MSBuild targets while another target was already running in parallel. Xamarin.Android 10.1 now emits a XA5302 warning in this case so that the Xamarin.Android team can monitor how often this happens and how often it is associated with other build issues. Example:
If you need to suppress this warning, you can add it to the
$(MSBuildWarningsAsMessages)
MSBuild property in your .csproj file:
<PropertyGroup>
<MSBuildWarningsAsMessages>XA5302</MSBuildWarningsAsMessages>
</PropertyGroup>
Known issues
GitHub PR 3945:
warning XA5302: Two processes may be building this project at once. Lock file
exists at path: ... obj\Debug\100\.__lock often appears unnecessarily when
deploying to an emulator or device from within Visual Studio. For now, it can
be suppressed via the $(MSBuildWarningsAsMessages)
MSBuild property or
ignored. GitHub PR 3945 will improve the behavior in a future release.
aprofutil analysis tool
Xamarin.Android 10.1 includes a new aprofutil
command-line tool to help
analyze AOT performance. See the README for additional
information.
External tool version updates
R8 version update to 1.5.68
The version of the R8 code shrinker included in Xamarin.Android has been updated from 1.4.93 to 1.5.68.
bundletool version update to 0.10.2
The version of the bundletool
executable included in
Xamarin.Android has been updated from 0.10.0 to 0.10.2,
bringing in several improvements and bug fixes.
Mono.Data.Sqlite SQLite version update
The version of SQLite used by Mono.Data.Sqlite in Xamarin.Android has been updated from 3.27.1 to 3.28.0, bringing in several improvements and bug fixes.
Issues fixed in Xamarin.Android 10.1.0.30
Application and library build and deployment
- Developer Community 237753, Developer Community 554407, GitHub 3407: Errors similar to [aot-compiler stderr] Cannot open assembly 'Files': No such file or directory. or Illegal characters in path ... at Xamarin.Android.Tasks.Aot could prevent projects using Enable Startup Tracing or AOT Compilation from building successfully on volumes where Windows 8.3 file name creation was disabled. Xamarin.Android 10.1 now uses a response file to pass command line parameters to the tooling for these steps, so having 8.3 file name creation enabled is no longer required.
- Developer Community 446584, GitHub 2711: In some scenarios, the deployment process could get stuck during the the Detecting installed packages... step.
- Developer Community 576975, GitHub 3091: The Removing old runtime and Installing shared runtime deployment steps were repeated during every incremental deployment on certain devices.
- Developer Community 618007, GitHub 3294: Could not find android.jar for API Level 28. ... Either install it in the Android SDK Manager (Tools > Open Android SDK Manager...) error message did not indicate the correct menu location for the Android SDK Manager on Windows.
- Developer Community 679868:
Errors like error APT0000: resource layout/headerLayout (aka
com.contoso.androidapp:layout/headerLayout) not found. or error APT0000:
No resource found that matches the given name (at 'headerLayout' with value
'@layout/headerLayout'). prevented projects from building successfully if
an Android layout used the capitalized suffix Layout in a reference to
another layout, unless the name was rectLayout, roundLayout, or
actionLayout. Xamarin.Android 10.1 now automatically lowercases any value
that ends with Layout when used with attributes from the
http://schemas.android.com/apk/res-auto
XML namespace. - GitHub 1240:
error XA3001: System.IO.IOException: Cannot create a file when that file
already exists prevented projects from building successfully if they had a
value explicitly set for the undocumented, experimental
$(AndroidAotMode)
MSBuild property. - GitHub 2023: Imprecise error XA0000: Unhandled exception: System.FormatException: Input string was not in a correct format. was shown if the Version number in the Android Manifest (or Android Application on macOS) section of the Visual Studio project property pages was set to a value that could not be parsed as an integer. Xamarin.Android 10.1 now shows a more specific error message for this scenario.
- GitHub 2848:
Unclear messages similar to Unable to remove directory
"obj\Debug\90\android\bin\classes". Could not find a part of the path
'AccessibilityManagerCompat_AccessibilityStateChangeListenerImplementor.class'
and Failed to create JavaTypeInfo for class:
Android.Support.V4.View.AsyncLayoutInflater/IOnInflateFinishedListenerImplementor
due to System.IO.DirectoryNotFoundException: Could not find a part of the
path '... AsyncLayoutInflater_OnInflateFinishedListenerImplementor.java'.
were shown when attempting clean or build projects where one of the build
steps used a path length close to the Windows API maximum path length
limitation of 260 characters. Xamarin.Android 10.1 will now
retry certain failing steps using the
\\?\
prefix and provide a more specific error message about the path length limitation if that also fails. - GitHub 2957:
Setting the
$(Deterministic)
MSBuild property totrue
in Xamarin.Android projects did not yet result in a constant MVID for the resulting output assemblies. Xamarin.Android projects will now produce a constant MVID and byte-identical outputs as expected when$(Deterministic)
is set totrue
. One caution is that this setting is not compatible with having a wildcard like[assembly: AssemblyVersion("1.0.*")]
in theAssemblyVersion
attribute. - GitHub PR 3368:
Messages from the lint tool when the
$(AndroidLintEnabled)
MSBuild was set totrue
would include paths to intermediate build versions of Android resource files rather than paths to the original resource files. - GitHub 3370:
Starting in Xamarin.Android 10.0, warning XA4306: R8 does not support
`MultiDexMainDexList` files was shown when building projects that had the
Code shrinker set to r8, Enable Multi-Dex enabled, and Minimum
Android version set to at least Android 5.0 Lollipop (API level 21), even
if no
@(MultiDexMainDexList)
items were set. - GitHub 3477:
error MSB4018: The "ConvertCustomView" task failed unexpectedly. ...
System.NullReferenceException incorrectly prevented building in some
scenarios where the
ConvertCustomView
task could in fact just skip over thenull
object. - GitHub PR 3523: Libraries that used the MSBuild.Sdk.Extras NuGet package for the project SDK and that targeted a Xamarin.Android target framework like MonoAndroid90 would by default add an unexpected extra subdirectory for the version number in the output path: bin\Debug\monoandroid90\90\Library.dll.
- GitHub 3547:
error ANDKT0000: keytool error: java.lang.Exception: Key pair not
generated, alias <androiddebugkey> already exists could prevent projects
from building successfully under system accounts, such as when building in
certain continuous build environments. Xamarin.Android 10.1 now skips the
attempt to create a debug keystore in Release configurations if the Sign
the .APK file using the following keystore details. setting is enabled in
the Android Package Signing section of the Visual Studio project
properties pages. This setting corresponds to the
$(AndroidKeyStore)
MSBuild property in the .csproj file. - GitHub PR 3561:
Starting in Xamarin.Android 10.0, the
_GenerateJavaStubs
target could run during builds where it wasn't needed if any of the previous builds had involved a change to a class that inherited fromJava.Lang.Object
. - GitHub 3562: Starting in Xamarin.Android 10.0, building a Xamarin.Android app that included an embedded Android Wear app would rerun a number of expensive MSBuild tasks even when the outputs were already up-to-date.
- GitHub 3571: Errors returned by the ProGuard tool were all surfaced under an unspecific and misleading error MSB6006: "java.exe" exited with code 1. build error. Xamarin.Android 10.1 now includes the more specific error text from ProGuard in the build error.
- GitHub PR 3577, GitHub PR 3599: Xamarin.Android used one generic APT0000 code for the majority of the errors and warnings that could occur when running the Android AAPT and AAPT2 command line tools. Xamarin.Android 10.1 now checks for a large list of warning and error message fragments from AAPT and AAPT2 and assigns them to unique APT message codes so that the Xamarin.Android team can monitor how often users encounter each of the messages when building Xamarin.Android projects.
- GitHub PR 3584: error XA5300: Error finding Xamarin.Android SDK could sometimes intermittently prevent building Xamarin.Android projects successfully in certain environments.
- GitHub PR 3609, GitHub PR 3704, GitHub PR 3766: The Xamarin.Android MSBuild tasks allowed unhandled exceptions to propagate to MSBuild by default, meaning that any build failure caused by an unhandled exception in a task was assigned to the generic MSB4018 error code. Xamarin.Android 10.1 now uses unique error code prefixes for each of its MSBuild tasks and several unique error code numbers for different exception types so that the Xamarin.Android team can monitor which exception types and tasks most often cause build failures in user projects.
- GitHub PR 3609: Xamarin.Android used one generic ADB0000 code for the majority of the errors and warnings that could occur when running the Android ADB command line tool. Xamarin.Android 10.1 now checks for a large list of error message fragments from ADB and assigns them to unique ADB message codes so that the Xamarin.Android team can monitor how often users encounter each of the messages when building Xamarin.Android projects.
- GitHub 3635:
The output .aab file was not removed from the bin directory by the
Clean
MSBuild target for projects configured to use the Android App Bundle publishing format, with the$(AndroidPackageFormat)
MSBuild property set toaab
in the Release configuration. - GitHub 3675:
Android resources and assets were all stored compressed in projects
configured to use AAPT2, regardless of any file extensions set in the
$(AndroidStoreUncompressedFileExtensions)
MSBuild property or in the corresponding Leave the following resource extensions uncompressed setting in the Visual Studio project property pages. - GitHub PR 3685:
warning ANDJS0000 was always shown for the
jarsigner
warnings The signer's certificate is self-signed. and No -tsa or -tsacert is provided and this jar is not timestamped. Those messages were not relevant for Xamarin.Android users, so Xamarin.Android 10.1 now reports them as informational messages rather than warnings. - GitHub 3779: In projects configured to use AAPT2, the second build could incorrectly succeed without errors if the first build failed due to an error in an Android resource file.
- GitHub 3807:
Xamarin.Android projects did not yet enable C# 8 features by default for
projects that left the
$(MaxSupportedLangVersion)
MSBuild property at the default empty value. - Java.Interop GitHub PR 458: Bindings projects did not yet automatically generate event handlers for Java listener interfaces where the add or set method of the interface took two arguments instead of just one.
- Java.Interop GitHub PR 471: error CS0234: The type or namespace name ... does not exist in the namespace appeared in bindings projects if a public Java interface or class from the input library inherited from a package-private interface. Xamarin.Android 10.1 now handles this pattern automatically so that no additional rules are needed for it in the Transforms/Metadata.xml file.
- Java.Interop GitHub 466: NullReferenceException ... at JavaApiXmlGeneratorExtensions.Save prevented bindings projects for Kotlin libraries from completing the code generation build step. Xamarin.Android 10.1 now allows these projects to complete the code generation step. Note that at the moment, additional manual fixes via the Transforms\Metadata.xml file will usually be required. Further improvements for binding Kotlin libraries will be added in future releases.
- Java.Interop GitHub 496: Bindings projects for Kotlin libraries could fail to build due to hyphen characters in method names generated by Kotlin.
- Java.Interop GitHub PR 498: Bindings projects for Kotlin libraries did not always transform Kotlin method names to valid C# method names when generating the C# bindings types.
- xamarin-android-tools PR 74:
error XA5300: The Java SDK Directory could not be found could appear in
some command line build environments on Windows even though the
JAVA_HOME
environment variable contained a valid Java JDK path.
Application behavior on device and emulator
- Developer Community 743965,
GitHub 3626:
Starting in Xamarin.Android 10.0, Newtonsoft.Json.JsonReaderException:
Unexpected character encountered caused
JsonConvert.DeserializeObject()
to fail in apps built in the Release configuration. - GitHub 3348: FATAL EXCEPTION: main ... java.lang.IllegalStateException: Module with the Main dispatcher is missing. could prevent apps from running if they referenced Kotlin libraries.
- GitHub 3373:
Errors similar to 'dlopen failed:
"/data/app/com.contoso.androidapp-AAAAAAAAAAAAAAAAAAAAAA==/lib/x86/libe_sqlite3.so"
has unexpected e_machine: 40 (EM_ARM)' ... System.DllNotFoundException:
e_sqlite3 could prevent using unmanaged libraries successfully in apps
that had an Android ABI name like x86 in one of the intermediate build
paths such as
$(IntermediateOutputPath)
. - GitHub PR 3458:
Java.Lang.AbstractMethodError
was thrown if an app attempted to invoke a C# 8.0 default interface member on a subclass ofJava.Lang.Object
. - GitHub 3498:
Writing to the
System.IO.Stream
returned byApplication.Context.ContentResolver.OpenOutputStream()
completed without error but did not write any bytes to the output location. - GitHub 3596:
Strings from .resx files were not localized in apps built with
$(AndroidPackageFormat)
set toaab
. - GitHub 3598:
Errors similar to Java.IO.IOException: This file can not be opened as a
file descriptor; it is probably compressed could occur when attempting to
use binary assets in apps built with
$(AndroidPackageFormat)
set toaab
. - GitHub PR 3664: Debugging into the Mono or Xamarin.Android base class libraries did not work as expected for projects with Use Shared Runtime enabled because the shared runtime did not include the debug symbols for those libraries.
- GitHub 3751: More Java bytecode than expected was being optimized and stripped out in apps built with the D8 Dex compiler in combination with Enable Multi-Dex. This could cause unexpected behaviors where callback methods would not be called as expected.
Android API bindings
- GitHub PR 3102:
Android.Views.Accessibility.Action
did not include the[Flags]
attribute, so using bitwise operators on it would produce warnings in static analysis tools. - GitHub 3180:
Android.Views.MetaKeyStates
did not yet include an enum member for 0. - GitHub 3508:
Android.Bluetooth.ProfileType
did not yet include an enum member for the newHearingAid
value introduced in Android 10 (API level 29).
Design-time build process
- Developer Community 325734:
IntelliSense errors similar to 'Resource' does not contain a definition for
'CustomId' appeared in projects that used non-standard namespaces for
resource IDs defined in resource files, like
android:id="@+idCustom/textView1"
. AAPT2 does not currently support non-standard namespaces for resource IDs, so this issue only applies to projects configured to use the older AAPT.
Application Mono Framework behavior on device and emulator
- Developer Community 668413,
GitHub 3426,
Mono GitHub 17133:
Starting in Xamarin.Android 9.4, System.UnauthorizedAccessException: Access
to the path is denied. ---> System.IO.IOException: Operation not permitted
prevented using
File.Copy()
to copy files to the Android external storage directory. - GitHub 3726:
System.NotSupportedException: 'TypeConverter cannot convert from
System.String. prevented apps from using
TypeConverter.ConvertFromString()
to create an instance ofSystem.Drawing.Color
. - Mono GitHub 14772: Fatal signal 11 (SIGSEGV), code 1, fault addr ... in tid ... (Debugger agent) caused Android applications to abort if the managed debugger agent tried to perform a Step Over command while paused on an unhandled exception.
- Mono GitHub 16918:
Starting in Xamarin.Android 9.4,
XmlSerializer.Deserialize()
did not successfully deserialize properties where the name of the property matched the name of the type of the property.
Known issues in Xamarin.Android 10.1.0.30
- GitHub PR 3945:
warning XA5302: Two processes may be building this project at once. Lock
file exists at path: ... obj\Debug\100\.__lock often appears unnecessarily
when deploying to an emulator or device from within Visual Studio. For now,
it can be suppressed via the
$(MSBuildWarningsAsMessages)
MSBuild property or ignored. GitHub PR 3945 will improve the behavior in a future release.
Thank you
A big Thank You! to community members who contributed improvements in this release:
- Alexander Gayko (@AdmiralSnyder),
GitHub PR 3102:
Add the
[Flags]
attribute toAndroid.Views.Accessibility.Action
, so that using bitwise operators on it does not produce warnings in static analysis tools. -
GitHub PR 3518:
Fix the
mingw-w64
Homebrew dependency version constraint for the xamarin-androidmake prepare
source build step on macOS so thatmake prepare
can be run more than once on the same development environment.
Feedback welcome
Your feedback is important to us. If there are any problems with this release, check our GitHub Issues, Xamarin.Android Community Forums and Visual Studio Developer Community for existing issues. For new issues within the Xamarin.Android SDK, please report a GitHub Issue. For general Xamarin.Android experience issues, let us know via the Report a Problem option found in your favorite IDE under Help > Report a Problem.
Open source
Xamarin.Android 10.1 is based on the open-source Xamarin.Android repositories:
- Core JNI interaction logic is in the Java.Interop repo.
- Android bindings and MSBuild tooling are in the xamarin-android repo.
- Chat is in the
xamarin/xamarin-android
Gitter channel.