| uid | Uno.Contributing.Android |
|---|
This article explores Android-specific details of Uno's internals, with a focus on information that's useful for contributors to Uno. For an overview of how Uno works on all platforms, see this article.
Some particulars of Android:
Several base classes and helper classes are written in native Java code. These are located in Uno.UI.BindingHelper.Android.
The Xamarin.Android framework gives complete access to the Android API from managed C#, so why write anything in Java? The reason is performance. The interop between Java and C# can be costly, and instrumented profiling identified that certain virtual methods when overridden in C# and called in heavily-used paths (eg measure and arrange) imposed a measurable performance penalty. Over time, these 'hot' methods have been lowered to Java classes, particularly the UnoViewGroup class.
The Uno.UI.BindingHelper.Android project builds these Java types, and wraps them in a Xamarin binding library, making them available via C#.
UIElement in Uno is a native view on Android, inheriting from the general ViewGroup type. To elaborate, UIElement's base classes are the following:
Android.Views.View → Android.Views.ViewGroup → Uno.UI.UnoViewGroup → Uno.UI.Controls.BindableView → Windows.UI.Xaml.UIElement
Recall that UIElement implements DependencyObect as an interface in Uno.
Uno's measure and arrange logic is triggered from the native Android layout cycle. For a schematic of the control flow, see Layouting in Android.