Lesedauer 5 Minuten

Wenn du mit Avalonia 11 schon mal versucht hast, eine App aufs Handy zu bringen, kennst du das vielleicht: Auf dem Desktop läuft alles flüssig. Auf dem Android-Testgerät ruckelt dagegen die Liste beim Scrollen, und ein Kaltstart dauert ewig.

Für Avalonia 12 hatte sich das Team 2 Ziele gesetzt und erfüllt: Performance und Stabilität. Am meisten merkst du das auf Android und iOS. In diesem Beitrag geht es darum, was sich auf beiden Plattformen geändert hat, wie die neue Seitennavigation funktioniert und worauf du beim Umstieg achten musst.

Avalonia 12: Ein einziges Projekt & XAML für Desktop und Smartphone

Avalonia zeichnet jedes Control selbst, auf iOS und Android genauso wie unter Windows, macOS oder Linux. Deshalb laufen deine Views, ViewModels, Styles und eigenen Controls aus dem Desktop-Build ohne Änderungen auch auf dem Smartphone. Mobile ist für Avalonia einfach ein weiteres Target im selben Projekt.

Du brauchst dafür die Werkzeuge, die Microsoft für .NET-Mobile sowieso vorschreibt: die Workloads für Android und iOS, ein JDK für Android und Xcode, sobald du auf ein echtes iPhone deployen willst. Wenn dein Team schon .NET-Mobile-Apps ausliefert, ist das alles vermutlich schon installiert.

Eine harte Grenze gibt es allerdings: Für Android und iOS unterstützt Avalonia 12 nur noch .NET 10. Desktop-Projekte laufen weiterhin ab .NET 8, .NET Framework und .NET Standard werden aber nicht mehr unterstützt. In den Plattformprojekten deiner Solution sieht das dann ungefähr so aus:

Außerdem musst du alle Avalonia-Pakete auf dieselbe 12er-Version heben. Mischversionen aus 11 und 12 führen schnell zu seltsamen Build-Fehlern.

Avalonia auf Android: Das Backend wurde neu gebaut

Auf Android hat sich am meisten getan. Ein neuer Dispatcher, der auf Androids Looper und MessageQueue aufsetzt, plant die Arbeit jetzt zuverlässiger. Bei hohen Bildwiederholraten hat Avalonia 11 GPU und CPU nicht voll ausgelastet, das ist behoben. Außerdem kannst du jetzt mehrere Activities mit Avalonia-Inhalt starten, und einige Probleme mit Surface-Verwaltung und Safe-Area-Padding sind gelöst.

Avalonia veröffentlicht auf der eigenen Website diese Vergleichswerte zwischen Version 11 und 12:

Messwert (Android) Avalonia 11 Avalonia 12
Startzeit mit NativeAOT 1960 ms 460 ms
Bildrate beim Scrollen 42 fps 120 fps
Bildrate bei Animationen (Ziel: 60 fps) 49 fps 60 fps

Diese Zahlen stammen vom Hersteller selbst. Miss also ruhig auf deinen eigenen Zielgeräten nach. Die Richtung ist trotzdem eindeutig: Ein Start in unter einer halben Sekunde statt in fast zwei Sekunden fällt deinen Nutzern sofort auf.

Avalonia Android

Avalonia auf iOS: Szenen statt Einzelfenster

Auf iOS nutzt Avalonia 12 jetzt den szenenbasierten Lebenszyklus. Auf diesem Modell bauen Multitasking auf dem iPad und die Wiederherstellung des App-Zustands auf, und Apple wird es in naher Zukunft verpflichtend machen. Die meisten Apps laufen ohne Codeänderung weiter. Eine Ausnahme solltest du kennen: AvaloniaAppDelegate.Window bleibt nach dem Start null, weil der Scene Delegate das Fenster jetzt intern verwaltet. Falls dein Code dort bisher etwas eingehängt hat, musst du ihn anpassen.

Außerdem unterstützt Avalonia.iOS jetzt Mac Catalyst. Und für die Barrierefreiheit gibt es Unterstützung für VoiceOver.

Avalonia iOS

Seitennavigation, wie Nutzer sie vom Handy kennen

Am meisten Arbeit spart dir im Alltag vermutlich das neue seitenbasierte Navigationssystem. Bisher musstest du Tab-Leisten, Navigations-Stacks und Schubladenmenüs selbst bauen oder eine Bibliothek dafür suchen. Jetzt bringt Avalonia ContentPage, NavigationPage, TabbedPage, DrawerPage und CommandBar selbst mit. Wenn du Xamarin.Forms oder MAUI kennst, kommen dir die Namen bekannt vor.

So sieht eine App mit Tab-Leiste am unteren Rand aus, in der ein Tab einen eigenen Navigations-Stack hat:

Im Code-Behind legst du neue Seiten auf den Stack oder nimmst sie wieder herunter:

Außerdem gibt es ReplaceAsync zum Austauschen der aktuellen Seite, PopToPageAsync und InsertPage, mit dem du eine Seite gezielt in den Stack einfügst. Modale Dialoge öffnest du über eigene Modal-Methoden. Navigationen lassen sich auch abbrechen, zum Beispiel wenn du vor dem Zurückgehen fragen willst, ob ungespeicherte Änderungen verworfen werden sollen. Drawer, Tab-Leisten, Bottom Sheets und Gesten verhalten sich auf Android und iOS gleich.

Avalonia WebView ist jetzt Open Source

Das WebView-Control war bisher ein kostenpflichtiges Add-on. In Version 12 ist es Open Source und gehört zum Lieferumfang. Es nutzt die Web-Engine der jeweiligen Plattform, du musst also kein Chromium mitschleppen und deine App bleibt klein. JavaScript-Interop in beide Richtungen und Unterstützung für OAuth-Flows sind eingebaut, auf iOS und Android genauso wie auf dem Desktop. Damit lässt sich etwa ein Login über einen externen Identity Provider deutlich bequemer umsetzen.

Was dir beim Avalonia 12 Upgrade begegnet

Das Team hat Breaking Changes bewusst knapp gehalten, ganz ohne geht es aber nicht. Diese Punkte betreffen mobile Projekte am ehesten:

  • Compiled Bindings sind jetzt standardmäßig aktiv. Bindings, die bisher nur zur Laufzeit aufgelöst wurden, melden Fehler also schon beim Build. Das ist lästig beim Umstieg und hilft dir danach.
  • Bei Touch und Stift wechselt der Fokus erst beim Loslassen. Container wie ListBoxItem verarbeiten Auswahl-Eingaben jetzt selbst, statt sie an das ItemsControl weiterzureichen. Wenn du Auswahl-Events auf ItemsControl-Ebene abgefangen hast, musst du diese Logik verschieben.
  • Das Paket Avalonia.Diagnostics wurde entfernt, und einige Namen haben sich geändert, zum Beispiel heißt SystemDecorations jetzt WindowDecorations.
  • Tizen wird nicht mehr unterstützt.

Die offizielle Seite “Breaking changes in Avalonia 12” listet alle Änderungen mit Hinweisen zur Migration auf. Die solltest du vor dem Upgrade einmal komplett durchlesen.

Lohnt sich Avalonia 12 für mobile Apps?

Wenn du schon eine Avalonia-Desktop-App hast und eine mobile Version willst, ist Version 12 der erste Release, bei dem das ohne größere Einschränkungen klappt. Navigation, WebView und die Android-Performance waren bisher die größten Lücken, und alle drei sind jetzt geschlossen. Startest du ein reines Mobile-Projekt, lohnt sich ein Vergleich mit MAUI. Der entscheidende Unterschied ist, dass Avalonia selbst zeichnet und MAUI native Controls verwendet. Bei Avalonia sieht deine App deshalb auf jedem Gerät pixelgenau gleich aus. Dafür sieht sie auch auf jedem Gerät gleich aus, und das muss dein Designteam wollen.

Welche .NET-Version brauche ich für mobile Apps mit Avalonia 12?

Für Android und iOS unterstützt Avalonia 12 ausschließlich .NET 10. Für Desktop-Projekte reicht .NET 8 oder neuer, empfohlen wird aber auch dort .NET 10.

Muss ich meine iOS-App für den neuen Szenen-Lebenszyklus umbauen?

In den meisten Fällen nicht. Anpassen musst du nur Code, der sich auf AvaloniaAppDelegate.Window verlässt, denn diese Eigenschaft bleibt jetzt null.

Kann ich meine Desktop-Views auf dem Smartphone wiederverwenden?

Ja. Avalonia zeichnet alle Controls selbst, deshalb laufen Views, ViewModels und Styles auf allen Plattformen. Auf dem kleinen Bildschirm solltest du das Layout aber trotzdem anpassen.

Kostet das WebView-Control in Avalonia 12 noch Geld?

Nein. Das WebView ist seit Version 12 Open Source und Teil des Frameworks.

 

Mehr über Avalonia lesen