Android Kotlin Compose

Use this stack when the product is Android-first and native platform behavior matters more than cross-platform reach.

Good fits:

  • Offline or local-first Android apps where Room is the source of truth.
  • Apps that need Android permissions, SMS workflows, background work, widgets, device APIs, or Play Store distribution.
  • Kenya-first or budget-device-first apps where 2-4GB RAM phones, intermittent connectivity, low storage, and Play policy matter.
  • Privacy-first finance apps where local data, exports, and restricted SMS permission evidence must be designed from day one.

Weak fits:

  • Marketing sites, content apps, or admin tools that can ship faster as web apps.
  • Products that must launch on iOS and Android at the same time with one UI codebase.
  • Teams that cannot test on physical Android devices.
  • Apps whose core value depends on restricted permissions but cannot satisfy Play policy review.

Stack Shape

LayerDefaultWhy
LanguageKotlinFirst-class Android language with null safety, data classes, coroutines, Flow, and strong IDE support
UIJetpack ComposeAndroid’s recommended modern native UI toolkit
Design systemMaterial 3Native-feeling components, theming, dark mode, dynamic color where appropriate
ArchitectureSingle activity, UI layer, data layer, optional domain layerMatches Android architecture guidance without overbuilding v1
StateViewModel plus immutable UI stateSurvives configuration changes and keeps Compose screens testable
DataRoom over SQLiteCompile-time SQL checks, entities, DAOs, migrations, Flow queries
Background workWorkManagerReliable persistent work across app restarts and device reboots
ReleaseAAB through Play App SigningSmaller delivery, upload key separation, Play-native release flow
QualityUnit tests, Compose tests, Room migration tests, worker tests, physical device smokeAndroid bugs hide in lifecycle, storage, permissions, and devices

Minimum Done Criteria

Do not call an Android feature done until these are true:

AreaProof
BuildDebug build and release build both complete
Unit logicViewModel, repository, parser, and policy logic have local tests
UICompose screen has at least one meaningful UI test or documented manual smoke path
DataRoom schema is exported and migrations are tested before any version bump
Background workWorkManager job has worker tests and one real-device run note
PermissionsDenied, granted, and permanently-denied paths are exercised
Play policyRestricted permissions have a declaration plan or a no-permission fallback
DeviceBudget Android phone or constrained emulator smoke test is recorded
ReleaseAAB or release APK is built, inspected, and installed where possible

First Pages To Read

Start with one app module, one activity, Compose screens, manual dependency wiring, one Room database, repositories, screen ViewModels, and WorkManager only for work that must survive process death.

Add Hilt, modularization, remote sync, encryption, and analytics only when the app has enough complexity to justify them.

Gotcha: Android Studio’s Run button is not release evidence. It builds and installs a debug path. Always produce a release APK or AAB before claiming release readiness.