Xamarin.Android 7.1: Yay, fixes!
Xamarin.Android 7.0 is the first release to use the open-source 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.Android 7.1 requires JDK 1.8 to use the Android Nougat (API 24) APIs. Using the Android build-tools r24+ package may also require using JDK 1.8. You can continue to use earlier versions of the JDK when using earlier build-tools packages and when targeting earlier Android API levels:
Additionally, a 64-bit version of the JDK is required to use custom controls in the Android designer.
The simplest option is to install the 64-bit version of JDK 1.8 since it is backwards compatible with all of the previous API levels and supports the new Android designer features.
(One unfortunate complication with JDK 1.8 is that is not compatible with the outdated version of Proguard that is included in the Android SDK. Currently this will cause an error "Unsupported class version number [52.0]" when attempting to use the Proguard or Multidex features in Xamarin.Android. See 44187.)
Android v7.0 Nougat adds support for the Vulkan API. Vulkan support will not be distributed as part of the core Xamarin.Android binding. Instead, please use the VulkanSharp NuGet package, and the XLogo sample app.
Native Library Use
Due to a change by Google,
Android N will now only permit linking to NDK-provided native libraries.
libsqlite.so is not an NDK-provided native library. Consequently,
existing apps using e.g.
Mono.Data.Sqlite.dll will crash when
running on Android N. This may include other SQLite-using assemblies,
not distributed with Xamarin.Android.
Xamarin.Android 7.0, which is part of Cycle 8,
Mono.Data.Sqlite.dll to include
a custom built version of
All Developers need to audit their code for P/Invoke and ensure that referenced
native libraries are either included in the Android NDK, or are included within
app.apk itself. The only Xamarin.Android-provided assembly impacted by
this change is
Xamarin.Android changed the default GC Bridge from
Unfortunately, a few bugs have been reported which suggest a bug within the Tarjan GC bridge.
If this happens, create an
and add the following line:
This will cause the app to use the previous GC bridge.
The Xamarin.Android 7.1 release primarily includes bug fixes.
- Bindings for API-25, Android v7.1.
- Support for providing Android circular icons, e.g. through
- Linker improvements
- Visual Studio 2017 Support for side-by-side installations.
Previously, if all type references to a given assembly were removed, the assembly reference would remain. Starting in Xamarin.Android 7.1, the assembly reference will be removed.
contains a reference to
XmlIgnoreAttribute isn't used by the
application, the type reference within
System.dll will be removed.
However, in Xamarin.Android 7.0 and prior releases, even though there
there may be no remaining references to
System.Xml.dll would still be packaged and distributed within the
application package (
Starting in Xamarin.Android 7.1, in this scenario
System.dll will be
modified to no longer contain an assembly reference to
System.Xml.dll to be removed from the package.
This change should result in smaller application packages without breaking compatibility.
However, if an assembly was being loaded dynamically, for example
Assembly.Load("System.Xml"), then an exception may
now be thrown. If this is the case, you can use the
MSBuild property to explicitly preserve the referenced assembly.
Xamarin.Android 7.0 introduces several experimental features, which are still experimental:
TLS 1.2 support in
Xamarin.Android 7.1 added
which uses the native Java APIs to provide TLS 1.2 support. However, there are
two problems with
- It can only be used with
- It requires Android 5.0 and later to operate. (Prior Android versions might
not support TLS 1.2, and since
AndroidClientHandleruses the native Java TLS stack...)
To solve these problems, Boring SSL can be used as the
lowest-level TLS implementation. Originally announced
last September, Boring SSL can be embedded within
a Xamarin.Android application, allowing
to communicate with TLS 1.2 endpoints. When enabled, the normal
HttpClient stack also uses Boring SSL.
To enable use of BoringSSL, add the
$(AndroidTlsProvider) MSBuild property
to the application project, with a value of
<PropertyGroup> <AndroidTlsProvider>btls</AndroidTlsProvider> </PropertyGroup>
When enabled, a new
libmono-btls-shared.so shared library will be present
The default value of the
$(AndroidTlsProvider) MSBuild property is the empty
string, i.e. not set, which will use the managed TLS implementation, which
does not support TLS 1.2.
The default value may change in a future release.
Improved Fast Deployment
is a way to avoid rebuilding and redeploying Android Packages (
when assemblies have changed in a way that doesn’t require changing the generated
Android Callable Wrappers
or altered any included Android Assets and Resources.
Xamarin.Android 7.0 will optionally allow Android Assets, Resources, and
compiled Java libraries to particpate in fast deployment as well, further
reducing the number of situations in which a possibly slow
and redeploy will be required.
This new behavior is disabled by default. It will be enabled by default in the Xamarin.Android 7.1 series.
To enable this new functionality, set the
MSBuild property to
Adding Resources to the Default Project
For example, assume a new (default) Application project which has already been deployed to a target device.
Resources\layout\Another.axml, and add
Resources\layout\Another.axmlto the project.
- Run the project.
(2) will require that the
.apk be rebuilt and re-deployed to the target.
In previous versions, (2) could take 16 seconds.
With the new system
Add some small benchmarks about what happens during dev when code changes, or a resource changes, numbers before/after
- 37263: Preserve application data no longer works
App crashes in Release config on device with
Latest update breaks
- 42366: Exception doesn't include Java native stacktrace anymore
- 43287: System modal windows during release build
- 44447: Android symbolication uses wrong property
- 44531: [Generator] new error CS0533: $(CHILD) hides inherited abstract member from $(PARENT)
- 44961: AndroidClientHandler throws NetworkOnMainThreadException
- 45137: Seeing new AAPT0000 errors when building certain projects against master
- 45311: Bug in constructor of AndroidHttpResponseMessage
Unhandled Exception in
class-parsewhen processing nested generic types.
- 48508: Archiving Android application is archiving old builds
- 51356: Unable to run Multi-Dex
Removal of interface default methods in API-24
API-24 introduced support for Java 1.8 and a number of new Java language features such as interface default methods.
Interface default methods were originally bound as "normal" interface methods, which resulted in many interface bindings containing methods that, in retrospect, we feel shouldn't be there.
We feel that this breakage is acceptable because:
It only impacts API-24, which at present is used on 0.3% of Android devices.
Only impacts 3 interfaces:
The above interfaces are extremely unlikely to be implemented by anyone.
Integrated Mono Features/Fixes
- 5644: Mono allows to access not accessible method
- 7467: DefaultNonPersistentConnectionLimit is to low
- 12571: Usage of XElement with XmlAnyElementAttribute is not supported by XmlSerializer
- 19594: WebException.Response is null when https request needs proxy authentication
Compiling class referencing corefx facade/contract assemblies raises error "Reference to type
System.SByte' claims it is defined assemblymscorlib,..` but couldn't be found"
- 30146: stack imbalance in DllImport with CallingConvention.StdCall
- 30686: ZipArchive ctor throws InvalidDataException for WebConnectionStream
- 30821: Compilation generates CS1701 warning
- 32374: WebRequest::BeginGetRequestStream incorrectly sets IAsyncResult::CompletedSynchronously to always true
- 33571: Mono crashes when marshalling fixed arrays
- 34715: HttpClient incorrectly works with multiple headers
- 34802: Debugger crash on break-all, step into sequence.
- 35536: Dns.GetHostEntry no longer supports IPv6
- 35662: Type System.ServiceModel.Security.Tokens.BinarySecretSecurityToken is missing in assembly System.IdentityModel
- 38025: "Step Out" gets confused by nested code
- 39282: [System.IO.Compression] issues with ZipArchiveEntry streams
- 39832: SIGSEGV when running roslyn
- 39859: Xamarin.Android apps on the Samsung Galaxy S7 fails to start with the error System.ExecutionEngineException SIGILL
- 40603: Mono can't parse Date in DB wich is in format: "2016-02-04 10:39:11Z"
- 40916: [System.IO.Compression] ZipArchive can create an ZipArchiveEntry that has a modified time of DateTime.MinValue
System.Net.WebHeaderCollection:AddValue (string,string)is inaccessible from method
- 41035: DataViewTest2.DataView_ListChangedEventTest occasionally fails with llvm+sgen
- 41349: System.TimeZoneInfo.IsDaylightSavingTime (DateTimeOffset dateTimeOffset) Not Implemented Exception
- 41393: [WatchOS 2] Incorrect calling convention for P/Invokes taking structures
- 41431: [aot] Build fails due to 'Sgen STW requires a working mono-context' error
- 41466: monoclassissubclassof return incorrect value by assuming monoclassinit has been called on parameters
- 41477: SafeSocketHandle ObjectDisposedException 'handle' exception with linked CancellationTokenSource
- 41492: DateTimeOffset.ToLocalTime() throwing erroneous error
- 41509: DLR crashes when trying to convert a object to null.
- 41530: [iOS]TimerTest failing randomly on devices,
- 41552: HttpResponseMessage does not support multiple Links header entries
- 41575: A Method That Accepts a FormattableString Object Is Not Called
- 41602: Compiler fails to recognize Indexer
- 41616: Mono 4.4.0 crashes when using Socket.ConnectAsync to a unix domain socket if the path doesn't exist
- 41623: "Step Over" on an Android App deployed to a physical/virtual device crashes the app
- 41667: new DateTime().ToLocalTime() results in an exception
- 41705: MonoTests.System.Threading.MonitorTest.Enter_Null crashes test runtime with assertion
- 41775: Zip version needed to extract not correct in System.IO.Compression
- 41782: [Cycle 7] "System.Net.WebException: Error: NameResolutionFailure" when attempting web requests with certain raw IP addresses
- 41786: Mono is broken when building with the macOS 10.12 SDK
- 41833: [SGEN?] XS crashed. error: * Assertion at gc.c:867, condition `finalizerthreadexited' not met
- 41874: Reflection throws AmbiguousMatchException when calling GetProperty on a class that inherits from a generic base class.
- 41897: NotSupportedException thrown from IPInterfaceProperties.UnicastAddresses
- 41937: invoke.exe test asserts on bitcode
- 41955: Bitcode "missing image did not probe corlib" exception thrown
- 41979: CodeDom cannot call mcs because of invalid encoding configuration
- 42057: error CS0121: The call is ambiguous
- 42169: (managed_alloc) Fatal: Managed allocator missing for (mkbundle) in Mono 4.4.X
- 42191: sdb deadlocks all the time while XS debugs XS
- 42198: error CS0529: Inherited interface causes a cycle in the interface hierarchy.
- 42219: [System.IO.Compression] Cannot create ZipArchive with duplicate entries with same name
- 42224: Compiler crashed with code: 1, "Await yields with non-empty stack" from AssertEmptyStack ()
- 42226: WCF client Expecting FaultException<TDetail> raising NotImplemented Exception instead When <FaultActor> element is provided.
- 42271: COOP: gc unsafe mode when printing native backtrace causes crash if GC is triggered
- 42274: System.IO.Compression.ZipArchive vs System.Xml.XmlReader
- 42395: Build runs indefinitely and never finishes
- 42408: WebClient.DownloadString returns 401 Unauthorized when using Basic authentication
- 42410: String Interpolation available even when langversion < 6
- 42413: Volatile fields don't enforce acquire - release semantics like Volatile.Read() and Volatile.Write()
- 42584: InternalError / Crash when using System.Net.Http and PCL library
- 42585: Switch fall-through not rejected
- 42611: wrong compiler error when using IEnumerable.Sum
- 42625: coop: crash with watchos system tests
- 42688: Can't wait for more than 429496 ms (429s)
- 42702: Unnecessary dependency checks
- 42750: Deploying an iOS app to iPhone 6S crashes when a breakpoint is set
- 42843: XmlSerializer does not deserialize UTC Time values on Xamarin.Android but works well on windows.
- 42864: [Cycle 7] "System.Net.WebException: Error: NameResolutionFailure" on second web request to certain raw IP addresses with HttpClient
- 42887: Encoding iso-8859-1 throws IndexOutOfRangeException for Unicode surrogate pairs
- 43022: ZipArchive.Entries is not updated when ZipArchiveEntry is deleted
- 43032: System.Uri cannot parse url with underscore at start
- 43099: [watchOS] Cannot enter GC safe region if the thread is not attached
- 43193: Keep CurrentCulture in async/await
- 43265: Inconsistency in Compilation of Async Code Compared to MSFT Compilers
- 43291: Runtime crash at reflection.c:monocustomattrsconstructby_type while calling GetCustomAttributes for a proxy class
- 43320: Thread aborts in the middle of .cctor and hell break loose
- 43357: WCSessionReplyHandler crashes WatchKit app
- 43400: "using static" dependent on compile order
- 43410: Nested exception trying to figure out what went wrong
- 43471: pragma warning disable still shows warnings in "Errors" pad
- 43512: TimeZoneInfo.ConvertTimeBySystemTimeZoneId ArgumentException
[Cycle 8] "Index was out of range. Must be non-negative and less than the size of the collection" in
System.Collections.Generic.List1[T].set_Item()` when attempting to compile certain C# code involving tasks, async/await, and try/catch/finally
- 43645: Items and properties not emitted for up to date targets
- 43695: Nuget resolves .netstandard <= 1.3 when Xamarin.IOS does not support it
- 43696: Delegate caching can invoke unrelated implementation leading to strange results
- 43718: mcs crashes when unable to resolve type inside lambda using the 'as' operator
- 43786: peverify is broken again
- 43921: System.Threading.ThreadHelper.ThreadStart_Context tries to allocate, crashes
- 44025: FTP download issue with IPv6
- 44109: NetworkCredential does not convert SecureString
- 44132: Thread.Sleep () overhead too big
- 44164: gosharp-regexp benchmark triggers unwinding crash when profiling
- 44168: Can use non-accessible member with nameof
- 44296: Multicast not working on Android 7.0 devices
- 44341: No way of updating async method local variables
- 44381: Debugger crash with domain unloading and VSTU
- 44402: Array doesn't implement non-generic IEnumerable
- 44406: Xamarin.Mac.Socket exception:An address incompatible with the requested protocol was used
- 44413: HttpHeaders.TryAddWithoutValidation behaves differently from .NET
- 44440: Attempting to JIT error in function with pointer arithmetic
- 44549: Ide Shuts down: System.ArgumentException: Item has already been added. Key in dictionary: 'XamlG' Key being added: 'XamlG'
- 44552: Domain end unload event arrives before start unload event
- 44624: Connecting to SQL Server using IPv4 exception.
- 44707: RemotingConfiguration.Configure() Throws RemotingException Because it Cannot Load 'machine.config'
- 44714: xbuild fails to find VB.NET compiler
- 44729: Type.GetType("blah",true,false) throws TypeLoadException without message
- 44751: Incorrect code flow analysis with goto and out parameter causes CS0177
- 44843: SqlCommand.ExecuteReaderAsync throws NotImplementedException
- 44918: "Assertion mini-arm.c:434, condition `lmfaddrtls_offset != -1' not met" prevent mono to run on ARM
- 44937: System.Diagnostics.StartProcess does not detect dotnetcore compiled assemblies as managed
- 44978: HttpClientHandler.SendAsync should throw HttpRequestException for proxy auth failure
- 44994: DeflateStream decompression is incomplete if reading byte-by-byte
- 45108: Proxy credentials not used for https url
- 45137: Seeing new AAPT0000 errors when building certain projects against master
- 45129: Uri.IsWellFormedUriString returns incorrect result for relative uris beginning with slash
- 45131: Array of double* being treated as non-blittable when marshaled
- 45286: C# string interpolation line does not compile on OSX but does on MSBuild
- 45371: SIGSEGV occurs when making call from native to managed code
- 45761: After network reconnected, web request fails for a couple of minutes with a NameResolutionFailure
- 45774: Wrong scopes in .mdb in case of foreach loop
- 45788: Marshaling a native NULL pointer to a managed array creates a new zero sized array
- 45994: TLS connections on non-standard ports result in incorrect Server Name Indication value
- 46175: If the RSA will be used by multiple threads, it has a variety of exceptions.
- 46190: Overload resolution fails in a case where methods use a named parameter in different positions
- 46250: Type.GetType with throwOnError true doesn't throw for a generic instance type with too few generic arguments
- 46602: MobileAuthenticatedStream.AuthenticateAsServer() via EndPointListener
- 46712: btls fails to build with gcc is v4.4.7 or earlier as they lack alignof/alignas
- 47205: Uri.TryCreate throws exception
- 47353: Mono.CSharp.MetadataImporter.set_IgnoreCompilerGeneratedField not found when running Cake on Mono 4.8
- 48016: System.Net.NetworkInformation.DnsAddresses is always empty. Fix included.
- 48516: ZipArchive.Save attempts to set position and seek non-seekable streams
- 49056: Assertion at /Users/builder/data/lanes/3969/44931ae8/source/xamarin-macios/external/mono/mono/mini/mini-generic-sharing.c:2351, condition `info' not met
- 49686: System.NotImplementedException at System.Reflection.Emit.DynamicMethod.GetCustomAttributes (System.Type attributeType, Boolean inherit)
- 50242: Cannot use MSXSL format-date/format-time XPath extension functions on non-Windows platforms
- 51562: NullReferenceException in BTLS X509CertificateImplBtls.Import()
- 51805: [iOS]error MT6002: Could not strip assembly System.Net.Http.Primitives.dll while building ToDoAzure with Release|iPhone
- API Level 10: Mono.Android.dll, OpenTK.dll, OpenTK-1.0.dll
- API Level 15: Mono.Android.dll
- API Level 16: Mono.Android.dll
- API Level 17: Mono.Android.dll
- API Level 18: Mono.Android.dll
- API Level 19: Mono.Android.dll
- API Level 20: Mono.Android.dll
- API Level 21: Mono.Android.dll
- API Level 22: Mono.Android.dll
- API Level 23: Mono.Android.dll
- API Level 24: Mono.Android.dll
- API Level 25 (vs. API Level 24): Mono.Android.dll