Files
Kordant/android/app/build.gradle.kts

187 lines
6.5 KiB
Kotlin

import java.io.FileInputStream
import java.util.Properties
plugins {
alias(libs.plugins.android.application)
alias(libs.plugins.kotlin.compose)
alias(libs.plugins.kotlin.serialization)
alias(libs.plugins.firebase.crashlytics.gradle)
// alias(libs.plugins.paparazzi) — temporarily disabled until compatible version is available
}
android {
namespace = "com.kordant.android"
compileSdk {
version = release(36) {
minorApiLevel = 1
}
}
defaultConfig {
applicationId = "com.kordant.android"
minSdk = 26
targetSdk = 36
versionCode = 1
versionName = "1.0"
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
buildConfigField("String", "API_BASE_URL", "\"http://10.0.2.2:3000\"")
buildConfigField("String", "API_STAGING_URL", "\"https://staging.api.kordant.com\"")
buildConfigField("String", "API_PRODUCTION_URL", "\"https://api.kordant.com\"")
// Resource config for supported languages (reduces APK size)
// resourceConfigurations.addAll(listOf("en"))
}
// Load signing configuration from key.properties
// This file is NOT committed — see key.properties.template
val keystorePropertiesFile = rootProject.file("key.properties")
val keystoreProperties = Properties()
if (keystorePropertiesFile.exists()) {
keystoreProperties.load(FileInputStream(keystorePropertiesFile))
}
signingConfigs {
create("release") {
if (keystoreProperties.isNotEmpty()) {
storeFile = file(keystoreProperties["storeFile"] as String)
storePassword = keystoreProperties["storePassword"] as String
keyAlias = keystoreProperties["keyAlias"] as String
keyPassword = keystoreProperties["keyPassword"] as String
}
}
}
buildTypes {
debug {
isMinifyEnabled = false
buildConfigField("String", "API_BASE_URL", "\"http://10.0.2.2:3000\"")
applicationIdSuffix = ".debug"
versionNameSuffix = "-debug"
}
release {
// Enable R8 code shrinking, resource shrinking, and obfuscation
isMinifyEnabled = true
isShrinkResources = true
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
buildConfigField("String", "API_BASE_URL", "\"https://api.kordant.com\"")
// Signing config for release builds
// Requires key.properties (see key.properties.template)
signingConfig = signingConfigs.getByName("release")
}
}
flavorDimensions += "environment"
productFlavors {
create("dev") {
dimension = "environment"
applicationIdSuffix = ".dev"
versionNameSuffix = "-dev"
buildConfigField("String", "API_BASE_URL", "\"http://10.0.2.2:3000\"")
}
create("prod") {
dimension = "environment"
buildConfigField("String", "API_BASE_URL", "\"https://api.kordant.com\"")
}
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_11
targetCompatibility = JavaVersion.VERSION_11
}
buildFeatures {
compose = true
buildConfig = true
}
lint {
baseline = file("lint-baseline.xml")
abortOnError = false
}
packaging {
resources {
excludes += "/META-INF/{AL2.0,LGPL2.1}"
excludes += "META-INF/versions/9/previous-compilation-data.bin"
}
}
// Resource config for supported languages (reduces APK size)
androidResources {
localeFilters += "en"
}
testOptions {
unitTests {
isIncludeAndroidResources = true
}
}
// Resources directory for screenshot golden images
sourceSets {
getByName("test") {
resources {
setSrcDirs(listOf("src/test/screenshots"))
}
}
}
}
// Paparazzi screenshot testing configuration
// FIXME: Paparazzi plugin not available in all environments
// paparazzi {
// theme = "android:style/Theme.Material.Light.NoActionBar"
// renderMode = "SHRINK"
// }
dependencies {
implementation(libs.androidx.core.ktx)
implementation(libs.androidx.lifecycle.runtime.ktx)
implementation(libs.androidx.activity.compose)
implementation(libs.androidx.navigation.compose)
implementation(platform(libs.androidx.compose.bom))
implementation(libs.androidx.compose.ui)
implementation(libs.androidx.compose.ui.graphics)
implementation(libs.androidx.compose.ui.tooling.preview)
implementation(libs.androidx.compose.material3)
implementation(libs.androidx.compose.material3.adaptive.navigation.suite)
implementation(libs.androidx.compose.material.icons.core)
implementation(libs.androidx.paging.runtime)
implementation(libs.androidx.paging.compose)
implementation(libs.coil.compose)
implementation(libs.lottie.compose)
implementation(libs.androidx.security.crypto)
implementation(libs.androidx.biometric)
implementation(libs.androidx.datastore.preferences)
implementation(libs.okhttp)
implementation(libs.okhttp.logging.interceptor)
implementation(libs.gson)
implementation(libs.play.services.auth)
implementation(libs.play.integrity)
implementation(libs.retrofit)
implementation(libs.retrofit.kotlinx.serialization.converter)
implementation(libs.kotlinx.serialization.json)
implementation(libs.work.runtime.ktx)
implementation(platform(libs.firebase.bom))
implementation(libs.firebase.messaging)
implementation(libs.firebase.crashlytics)
debugImplementation("androidx.profileinstaller:profileinstaller:1.4.1")
implementation("androidx.profileinstaller:profileinstaller:1.4.1")
testImplementation(libs.junit)
testImplementation(libs.kotlinx.coroutines.test)
testImplementation(libs.truth)
testImplementation(libs.okhttp.mockwebserver)
testImplementation(libs.work.testing)
androidTestImplementation(libs.androidx.junit)
androidTestImplementation(libs.androidx.espresso.core)
androidTestImplementation(platform(libs.androidx.compose.bom))
androidTestImplementation(libs.androidx.compose.ui.test.junit4)
androidTestImplementation(libs.benchmark.macro.junit4)
debugImplementation(libs.androidx.compose.ui.tooling)
debugImplementation(libs.androidx.compose.ui.test.manifest)
}