Kotlin and Jetpack Compose: Modern Android Development Explained
Android development today means Kotlin and Jetpack Compose — a genuinely different experience from the Java and XML-layout Android development of a decade ago.
Kotlin: Google’s preferred Android language
Kotlin, developed by JetBrains, became Google’s officially preferred language for Android in 2017 and has been the default for new projects since. It’s interoperable with Java (existing Java Android code still works alongside it), but eliminates entire categories of bugs Java allowed — null pointer exceptions are caught at compile time by Kotlin’s null-safety system, and its more concise syntax reduces boilerplate substantially. Kotlin Multiplatform, still maturing, additionally lets teams share business logic (not UI) between Android and iOS from the same Kotlin codebase — a different value proposition than a full cross-platform framework, aimed at sharing non-UI code specifically.
Jetpack Compose: declarative UI, stable since 2021
Jetpack Compose is Google’s modern, declarative UI toolkit — conceptually parallel to SwiftUI on iOS. Instead of defining layouts in separate XML files and manipulating Views imperatively in code, you describe your UI as composable functions that automatically re-render (“recompose”) when the state they depend on changes. This eliminates an entire class of bugs where the UI silently drifts out of sync with the underlying data, which was a persistent source of subtle issues in the old View-based system.
Compose interops with existing View-based code, which matters in practice — most real Android codebases predate Compose and migrate incrementally rather than rewriting everything at once.
The architecture stack around Compose
- ViewModel + StateFlow — the standard pattern for holding UI state that survives configuration changes (like a screen rotation) and exposing it reactively to Compose.
- Room — Google’s SQLite abstraction layer for local persistence, with compile-time-checked queries.
- Hilt — dependency injection built on top of Dagger, reducing the boilerplate of wiring dependencies by hand.
- Coroutines and Flow — Kotlin’s native approach to asynchronous programming and reactive data streams, replacing older callback-based or RxJava-based approaches.
- Retrofit + OkHttp — the standard networking stack for calling REST APIs, handling serialization, retries, and interceptors.
- Navigation Compose — type-safe, Compose-native navigation between screens.
- Material 3 — Google’s current design system, with built-in dynamic theming (adapting to a user’s system wallpaper colors on supported devices) that Compose implements natively.
Why this matters if you’re evaluating an Android team
Ask whether a prospective team is building new screens in Compose or still defaulting to the older View/XML system for everything — Compose has been stable long enough that a modern Android codebase should be Compose-first for new development, with legacy View code present only where it predates the migration. A team unfamiliar with Compose is working from an outdated Android development model.
Elmeris builds new Android work Compose-first, with the architecture stack above as a standard starting point. See our Android app development services, or get in touch to talk through your project.
