Slide 1

Slide 1 text

Moderne Android- Architekturen Thomas Künneth, MATHEMA GmbH

Slide 2

Slide 2 text

Inhalt Ein bisschen Geschichte Zusammenspiel Plattform und Jetpack Tipps für moderne App-Architekturen Fazit

Slide 3

Slide 3 text

[email protected] @tkuenneth @tkuenneth https://thomaskuenneth.eu/ @tkuenneth

Slide 4

Slide 4 text

Ein bisschen Geschichte https://unsplash.com/photos/9T346Ij4kGk

Slide 5

Slide 5 text

• Schnelle Entwicklung der Plattform • Anfangs mehrere Versionen pro Jahr • Viele neue Funktionen in kurzer Zeit • Geräte wurden nicht konsequent aktualisiert • Entwickler hatten Schwierigkeiten, Schritt zu halten • Weichen im Code • Macht Code unübersichtlich

Slide 6

Slide 6 text

• Erste Version Support Libraries März 2011 • Ursprünglich Bibliothek, um neue APIs unter alten Geräten nutzen zu können • Wurden Stück für Stück ergänzt und erweitert • Komponenten / Views • Layouts • Hilfsklassen • Debugging-Hilfen

Slide 7

Slide 7 text

• Im Laufe der Jahre Bibliotheks-Zoo entstanden • Schwer nachvollziehbar, welche Funktion in welcher Lib steckt • Versionswirrwarr • Unterschiedliche Jars je nach API-Level • Version in Paketnamen kodiert (...v4...) • Erst mit Android P (API-Level 28) einheitliches Versionierungs- und Packetierungsschema für Support-Bibliotheken

Slide 8

Slide 8 text

• Keine Architekturrichtlinien • Entwickler haben UI-, Fach- und Lifecycle-Logik miteinander verwoben • Je größer die App, desto... • unübersichtlicher der Code • schlechter wartbar • fehleranfälliger

Slide 9

Slide 9 text

• Apps kein monolithischer Block • Sammlung von lose gekoppelten Komponenten • Entscheidung, wann Komponenten aktiviert / deaktiviert werden, trifft… • Benutzer (Navigation) • andere App oder Komponente • System (Speichermangel, Drehung des Geräts)

Slide 10

Slide 10 text

No content

Slide 11

Slide 11 text

• Android Architecture Components: Komponenten und Best Practices • Wurden auf der I/O 2017 vorgestellt • Mehrere Bestandteile, u. a. • Lifecycle • LifeData • ViewModel

Slide 12

Slide 12 text

Zusammenspiel Plattform und Jetpack https://unsplash.com/photos/CCjgYjUudxE

Slide 13

Slide 13 text

• I/O 2018: Jetpack/AndroidX wird vorgestellt • Sammlung von Bibliotheken und Best Practices • Damals vier Bereiche • UI • Foundation • Behavior • Architecture https://android-developers.googleblog.com/2018/05/use-android-jetpack-to-accelerate-your.html

Slide 14

Slide 14 text

• September 2021 > 80 Jetpack-Komponenten • Google bietet Filterung nach Typen an https://developer.android.com/jetpack/androidx/explorer (derzeit Beyond phones, Data, Graphics, Lifecycle, Media, Navigation, Security, Performance/Test, UI) • Beispiel Lifecycle • lifecycle: „Build lifecycle-aware components that can adjust behavior based on the current lifecycle state of an activity or fragment.“ • loader: „Load data for your UI that survives configuration changes.“

Slide 15

Slide 15 text

• Welche Jetpack-Komponente kann, welche muss ich verwenden? • Wie eng sind Plattform und Jetpack verzahnt? https://unsplash.com/photos/UQ2Fw_9oApU

Slide 16

Slide 16 text

• Einige Bibliotheken gelten als veraltet legacy, localbroadcastmanager, percentlayout • Andere wurden durch neue Implementierungen abgelöst media (media2), emoji (emoji2), viewpager (viewpager2) • preferences nicht veraltet; dennoch „Nachfolger“ • security: „Safely manage keys and encrypt files and sharedpreferences.“ • datastore: „Store data asynchronously, consistently, and transactionally, overcoming some of the drawbacks of SharedPreferences“

Slide 17

Slide 17 text

• android.app.Activity • ...Dialog(): API-Level 15 • ...ManagingCursor(): API-Level 15 • startActivityFrom...(): API-Level 28 und 30 • android.app.Fragment (API-Level 28) • android.preference.Preference (API-Level 29) • android.app.IntentService (API-Level 30) • androidx.activity.ComponentActivity • startActivityForResult() • android.app.LoaderManager (API-Level 28) @Deprecated

Slide 18

Slide 18 text

• fragment: „Segment your app into multiple, independent screens that are hosted within an Activity.“ • loader: „Load data for your UI that survives configuration changes.“ • preference: „Build interactive settings screens without needing to interact with device storage or manage the UI.“ • work: „The WorkManager API makes it easy to schedule deferrable, asynchronous tasks that must be run reliably. These APIs let you create a task and hand it off to WorkManager to run when the work constraints are met.“ • activity: „Access composable APIs built on top of Activity.“

Slide 19

Slide 19 text

• Sind Plattform-Klassen/Pakete veraltet, nach Möglichkeit auf geeignete Jetpack-Komponente migrieren • Fun fact: manchmal verweist Framework-Doku auf veraltete Support-Bibliotheken https://unsplash.com/photos/7esRPTt38nI

Slide 20

Slide 20 text

• Ratsam, sich Liste der Bibliotheken gut anzusehen • Einstiege in die Doku • Komponentenname bekannt: https://developer.android.com/jetpack/androidx/versions • Paketname bekannt: https://developer.android.com/reference/androidx/packages

Slide 21

Slide 21 text

• Häufig verwendet • CameraX (androidx.camera.*) mächtige Alternative zur Plattform-API • Room (androidx.room.*) Persistenzschicht oberhalb von SQLite mit Entities und DAOs • Exoten • Exifinterface (androidx.exifinterface.media) liest und schreibt EXIF-Tags • Palette (androidx.palette.graphics) extrahiert repräsentative Farben aus Grafiken

Slide 22

Slide 22 text

• Bitmap erzeugen/laden, z.B. ImageDecoder.decodeBitmap().asShared() • Instanz einer Palette: Palette.Builder().generate() • Auf relevante Farben zugreifen, z. B. getDominantColor(), getVibrantColor() • Auswahl der Farben kann über Target beeinflusst werden • Swatch liefert passende Vorder- und Hintergrundfarben

Slide 23

Slide 23 text

Tipps für moderne App-Architekturen

Slide 24

Slide 24 text

• Von Kotlin-Features profitieren • Null-Sicherheit • Echte Getter/Setter • Schlanke Syntax • Aktuelle Build Tools verwenden • Unterstützung von Java 11 • Auch Vorteile unter Kotlin • Legacy-Code modernisieren • Falls sinnvoll, nach Kotlin portieren • Code mit modernen Java-Features stabiler machen

Slide 25

Slide 25 text

• Compose neues deklaratives UI Framework • Soll das alte View-System ablösen • Kann mehrere Bibliotheken überflüssig machen cardview, coordinatorlayout, customview, gridlayout, recyclerview, slidingpanelayout, swiperefreshlayout, viewpager2 • Beginn der Arbeiten 2017 • Ende Juli 2021 erste stabile Version

Slide 26

Slide 26 text

• Funktioniert nur mit Kotlin • Grundbausteine „composable functions“ • Keine klassischen Komponenten • Keine Layoutdateien • Aus Sicht des Entwicklers keine Objektgraphen (kein findViewById())

Slide 27

Slide 27 text

No content

Slide 28

Slide 28 text

• Setzt weiterhin auf Activities • Integration mit setContent • „Mischbetrieb“ möglich (ComposeView, CustomView) • Activty-nahe Konzepte werden obsolet • Action Bar / Toolbar • Burger • Bestehende Architektur-Best Practices bleiben (mit Anpassungen) bestehen

Slide 29

Slide 29 text

• Schon immer viele Formfaktoren und Bildschirmgrößen • Neue Geräteklasse „Foldable“ • Faltbare Anzeigen • Bildschirm besteht aus zwei „Teilen“ • Für optimale Darstellung Abfragen/Anpassungen nötig • Neue Bibliothek Jetpack WindowManager

Slide 30

Slide 30 text

• Einstieg über windowInfoRepository() (androidx.window.layout.WindowInfoRepository) • Abfrage der Fenstergröße mit currentWindowMetrics • Abfrage von DisplayFeatures • Derzeit gibt es „nur“ FoldingFeature • API basiert auf Kotlin Flows

Slide 31

Slide 31 text

No content

Slide 32

Slide 32 text

• Mit Android 12 systemweit einheitliche Splash Screens • Erste Ansätze seit Oreo • Viele Apps hatten eigene Implementierungen

Slide 33

Slide 33 text

No content

Slide 34

Slide 34 text

No content

Slide 35

Slide 35 text

• Mit Android 12 kommt systemweite Volltextsuche • Mehrsprachig • Lokale Speicherung • Ideal für die Indizierung von Daten in der Cloud • Mit Jetpack AppSearch Nutzung unter älteren Plattform-Versionen

Slide 36

Slide 36 text

Walkthrough

Slide 37

Slide 37 text

Fazit https://unsplash.com/photos/uqeaZXZkquw

Slide 38

Slide 38 text

• Durch @Deprecated von Plattform-Paketen Nutzung von Jetpack ein Muss • Kein offizieller „roter Faden“ • Viele Jetpack-Komponenten erhalten kaum Updates • Versionierung und Namensgebung einheitlich • Konzepte innerhalb der Bibliotheken nicht

Slide 39

Slide 39 text

• In Community hitzige Diskussionen bzgl. Nutzung „alter“ Jetpack-Komponenten • Unterstützung von Tablets und Foldables wichtiger als „a oder b“ • Nicht nur neue Bibliotheken nutzen, sondern vorhandenen Code konsequent refactoren

Slide 40

Slide 40 text

• Jede Bibliothek macht die App größer • Noch häufiger Updates als Plattform • Jetpack bereichert Android-Entwicklung • „auf dem Laufenden bleiben“ zeitaufwendig

Slide 41

Slide 41 text

@tkuenneth @tkuenneth @tkuenneth Vielen Dank https://github.com/PacktPublishing/Android-UI-Development-with-Jetpack-Compose/tree/main/chapter_03/ColorPickerDemo https://github.com/tkuenneth/android-demos/tree/master/misc/WindowManagerDemo2 https://github.com/tkuenneth/android-demos/tree/master/misc/JetpackSplashScreenDemo https://github.com/tkuenneth/android-demos/tree/master/misc/PaletteDemo