Build System & Flavors

Version catalog

All dependencies are managed via gradle/libs.versions.toml (Gradle version catalog):

[versions]
agp = "9.2.1"
kotlin = "2.2.10"
composeBom = "2026.02.01"
hilt = "2.59.2"
room = "2.7.1"
# ... 35+ entries

[libraries]
androidx-compose-bom = { group = "androidx.compose", name = "compose-bom", version.ref = "composeBom" }
# ... 50+ entries

[plugins]
android-application = { id = "com.android.application", version.ref = "agp" }
kotlin-compose = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" }
ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" }
hilt = { id = "com.google.dagger.hilt.android", version.ref = "hilt" }

Flavor dimensions

Single dimension distribution across ALL modules:

flavorDimensions += "distribution"
productFlavors {
    create("github") { dimension = "distribution" }
    create("playstore") { dimension = "distribution" }
}
FlavorCharacteristics
githubEmpty GOOGLE_CLIENT_ID, IS_GITHUB_BUILD=true, disabled push (no FCM), no-op GoogleAuthHelperImpl
playstoreActual client ID from secrets.properties, FCM push enabled, real GoogleAuthHelperImpl

Dev build toggle

Release builds can be disabled locally:

# local.properties
devBuild=true

This skips release variants via androidComponents.beforeVariants.

ProGuard / R8

Release builds use minifyEnabled = true, shrinkResources = true. Key ProGuard rules:

# Keep MSAL OAuth
-keep class com.microsoft.identity.common.** { *; }

# Keep SQLCipher
-keep class net.zetetic.database.sqlcipher.** { *; }

# Keep Jakarta Mail
-keep class org.eclipse.angus.mail.** { *; }
-keep class jakarta.mail.** { *; }
-keep class jakarta.activation.** { *; }

# Keep PGPainless / Bouncy Castle
-keep class org.pgpainless.** { *; }
-keep class org.bouncycastle.** { *; }

# Keep data classes (Gson serialization)
-keep class com.shrivatsav.monomail.core.data.auth.UserProfile { *; }
-keep class com.shrivatsav.monomail.core.network.provider.imap.ImapAccountConfig { *; }
-keep class com.shrivatsav.monomail.core.database.local.ScheduledMessageEntity { *; }
-keep class com.shrivatsav.monomail.data.model.EmailAttachment { *; }
-keep class com.shrivatsav.monomail.data.model.EmailAttachmentInfo { *; }
-keep class com.shrivatsav.monomail.core.database.local.PendingActionEntity { *; }
← Dependency Injection Adding a Feature →