build.gradle.kts 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.archivesName
  2. import java.util.Properties
  3. plugins {
  4. id("com.android.application")
  5. kotlin("android")
  6. kotlin("plugin.serialization")
  7. id("kotlin-parcelize")
  8. id("app.cash.sqldelight")
  9. id("org.sirekanyan.version-checker")
  10. }
  11. android {
  12. namespace = "org.sirekanyan.outline"
  13. compileSdk = 34
  14. defaultConfig {
  15. applicationId = "org.sirekanyan.outline"
  16. minSdk = 21
  17. targetSdk = 34
  18. versionCode = (property("appVersionCode") as String).toInt()
  19. versionName = property("appVersionName") as String
  20. archivesName.set("$applicationId-$versionName-$versionCode")
  21. vectorDrawables {
  22. useSupportLibrary = true
  23. }
  24. }
  25. buildTypes {
  26. debug {
  27. val props = Properties().also {
  28. it.load(File("debug.properties").also(File::createNewFile).inputStream())
  29. }
  30. isDebuggable = props.getProperty("DEBUGGABLE").toBoolean()
  31. applicationIdSuffix = ".debug"
  32. buildConfigField("boolean", "DEBUG", "true")
  33. listOf("DEBUG_SERVER1", "DEBUG_SERVER2").forEach { key ->
  34. buildConfigField("String", key, props.getProperty(key)?.let { "\"$it\"" } ?: "null")
  35. }
  36. }
  37. release {
  38. isMinifyEnabled = true
  39. isShrinkResources = true
  40. proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard.pro")
  41. signingConfig = signingConfigs.create("release") {
  42. storeFile = System.getenv("SIGNING_KEYSTORE_FILE")?.let(::file)
  43. storePassword = System.getenv("SIGNING_KEYSTORE_PASSWORD")
  44. keyAlias = System.getenv("SIGNING_KEY_ALIAS")
  45. keyPassword = System.getenv("SIGNING_KEY_PASSWORD")
  46. }
  47. }
  48. }
  49. flavorDimensions += "store"
  50. productFlavors {
  51. create("fdroid") {
  52. dimension = "store"
  53. }
  54. create("play") {
  55. dimension = "store"
  56. resValue("string", "project_id", System.getenv("GOOGLE_PROJECT_ID") ?: "")
  57. resValue("string", "google_app_id", System.getenv("GOOGLE_APP_ID") ?: "")
  58. resValue("string", "google_api_key", System.getenv("GOOGLE_API_KEY") ?: "")
  59. resValue("string", "com.crashlytics.android.build_id", "1")
  60. }
  61. }
  62. compileOptions {
  63. sourceCompatibility = JavaVersion.VERSION_1_8
  64. targetCompatibility = JavaVersion.VERSION_1_8
  65. }
  66. kotlinOptions {
  67. jvmTarget = "1.8"
  68. allWarningsAsErrors = true
  69. }
  70. lint {
  71. warningsAsErrors = true
  72. }
  73. buildFeatures {
  74. buildConfig = true
  75. compose = true
  76. }
  77. composeOptions {
  78. kotlinCompilerExtensionVersion = "1.5.8"
  79. }
  80. packaging {
  81. resources {
  82. excludes += "/META-INF/{AL2.0,LGPL2.1}"
  83. }
  84. }
  85. }
  86. dependencies {
  87. // compose
  88. implementation("androidx.activity:activity-compose:1.8.2")
  89. implementation("androidx.compose.material3:material3:1.1.2")
  90. // ktor
  91. implementation("io.ktor:ktor-client-okhttp:2.3.8")
  92. implementation("io.ktor:ktor-client-content-negotiation:2.3.8")
  93. implementation("io.ktor:ktor-serialization-kotlinx-json:2.3.8")
  94. implementation("org.slf4j:slf4j-simple:2.0.11")
  95. // sqldelight
  96. implementation("app.cash.sqldelight:android-driver:2.0.1")
  97. implementation("app.cash.sqldelight:coroutines-extensions:2.0.1")
  98. // crash reporting
  99. add("playImplementation", "com.google.firebase:firebase-crashlytics:18.6.1")
  100. }
  101. sqldelight {
  102. databases {
  103. create("OutlineDatabase") {
  104. packageName.set("org.sirekanyan.outline.db")
  105. schemaOutputDirectory.set(file("src/main/sqldelight/databases"))
  106. }
  107. }
  108. }
  109. androidComponents {
  110. onVariants { variant ->
  111. val variantName = variant.name.replaceFirstChar(Char::titlecase)
  112. val verifyTask = task("verify${variantName}Environment") {
  113. doLast {
  114. buildSet {
  115. if (variant.buildType == "release") {
  116. add("SIGNING_KEYSTORE_FILE")
  117. add("SIGNING_KEYSTORE_PASSWORD")
  118. add("SIGNING_KEY_ALIAS")
  119. add("SIGNING_KEY_PASSWORD")
  120. }
  121. if (variant.flavorName == "play") {
  122. add("GOOGLE_PROJECT_ID")
  123. add("GOOGLE_APP_ID")
  124. add("GOOGLE_API_KEY")
  125. }
  126. }.forEach { key ->
  127. if (System.getenv(key).isNullOrEmpty()) {
  128. error("Please specify $key environment variable")
  129. }
  130. }
  131. }
  132. }
  133. afterEvaluate {
  134. tasks.getByName("assemble$variantName").dependsOn(verifyTask)
  135. }
  136. }
  137. }