App module (:app)
Application lifecycle startup, dependency injection root, global navigation graph, and activity shell.
Engineering guide
Learn how to structure, modularize, configure, test, optimize, and build production applications using Material Design 3.
Modular architecture
:app)Application lifecycle startup, dependency injection root, global navigation graph, and activity shell.
:core:designsystem)Centralized MaterialTheme, dynamic color schemes, typography scale, shape tokens, and expressive springs.
:core:data)Data repositories, local persistence (DataStore, Room), network clients, and domain models.
:feature:*)Independent feature screens, ViewModels, and UI state models isolated from other features.
Build setup
Centralize build logic in a build-logic composite build to maintain consistent compile SDK, Java targets, and Compose compiler versions across all submodules.
Define all dependencies in gradle/libs.versions.toml to ensure uniform version alignment.
Applies Android application conventions, packaging rules, and release build type settings.
Applies shared library SDK configurations, Java 11 compatibility, and namespace standards.
Enables Compose compiler plugins and binds UI / Material 3 dependencies.
State and runtime
Represent screen states as strongly typed Kotlin data classes.
ViewModels process user intents and emit new state snapshots via StateFlow.
Composables observe state using collectAsStateWithLifecycle() to avoid background resource leaks.
Leaf UI composables remain stateless, receiving plain values and emitting event callbacks.
Optimization & Release
Enable Android Gradle Plugin optimization and R8 shrinking for release builds:
android {
buildTypes {
release {
isMinifyEnabled = true
isShrinkResources = true
proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
}
}
}
Keep keystore and signing credentials in local, git-ignored signing.properties.
Verification
# Run build logic tests
.\gradlew.bat -p build-logic :convention:test
# Run unit tests across all modules
.\gradlew.bat testDebugUnitTest
# Run Android Lint
.\gradlew.bat lintDebug
# Assemble debug and release builds
.\gradlew.bat :app:assembleDebug
.\gradlew.bat :app:assembleRelease