2
0

androidApp.gradle.kts 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. plugins {
  2. alias(libs.plugins.android.application)
  3. alias(libs.plugins.compose)
  4. alias(libs.plugins.compose.compiler)
  5. }
  6. android {
  7. namespace = "org.mjdev.desktop"
  8. compileSdk =
  9. libs.versions.android.compile.sdk
  10. .get()
  11. .toInt()
  12. // shared resources packaged into the APK (lost when composeApp was split):
  13. // - assets <- commonMain/resources (icon fonts, translations, widgets, …)
  14. // - resources <- commonMain/composeResources
  15. sourceSets["main"].assets.directories.add(rootDir.resolve("shared/src/commonMain/resources").path)
  16. sourceSets["main"].resources.directories.add(rootDir.resolve("shared/src/commonMain/composeResources").path)
  17. defaultConfig {
  18. applicationId = "org.mjdev.desktop"
  19. minSdk =
  20. libs.versions.android.min.sdk
  21. .get()
  22. .toInt()
  23. targetSdk =
  24. libs.versions.android.target.sdk
  25. .get()
  26. .toInt()
  27. versionCode =
  28. libs.versions.app.pkg.version
  29. .get()
  30. .replace(".", "")
  31. .toInt()
  32. versionName =
  33. libs.versions.app.pkg.version
  34. .get()
  35. resValue(
  36. "string",
  37. "app_name",
  38. libs.versions.app.name
  39. .get(),
  40. )
  41. }
  42. packaging {
  43. resources {
  44. excludes += "META-INF/{AL2.0,LGPL2.1}"
  45. excludes += "META-INF/INDEX.LIST"
  46. excludes += "META-INF/DEPENDENCIES"
  47. excludes += "META-INF/io.netty.versions.properties"
  48. pickFirsts += "META-INF/native-image/**"
  49. }
  50. }
  51. // Release signing. Keystore + credentials come from env vars (CI secrets) or Gradle
  52. // properties (local ~/.gradle/gradle.properties) — never hardcoded. When no release
  53. // keystore is configured we fall back to the debug key so the release APK is still
  54. // *signed* and installable (an unsigned APK is rejected by Android on install).
  55. val releaseStoreFile =
  56. (
  57. providers.environmentVariable("ANDROID_KEYSTORE_FILE").orNull
  58. ?: providers.gradleProperty("android.keystore.file").orNull
  59. )?.let(::file)
  60. val releaseStorePassword =
  61. providers.environmentVariable("ANDROID_KEYSTORE_PASSWORD").orNull
  62. ?: providers.gradleProperty("android.keystore.password").orNull
  63. val releaseKeyAlias =
  64. providers.environmentVariable("ANDROID_KEY_ALIAS").orNull
  65. ?: providers.gradleProperty("android.key.alias").orNull
  66. val releaseKeyPassword =
  67. providers.environmentVariable("ANDROID_KEY_PASSWORD").orNull
  68. ?: providers.gradleProperty("android.key.password").orNull
  69. val hasReleaseKeystore =
  70. releaseStoreFile?.exists() == true &&
  71. !releaseStorePassword.isNullOrBlank() &&
  72. !releaseKeyAlias.isNullOrBlank() &&
  73. !releaseKeyPassword.isNullOrBlank()
  74. signingConfigs {
  75. if (hasReleaseKeystore) {
  76. create("release") {
  77. storeFile = releaseStoreFile
  78. storePassword = releaseStorePassword
  79. keyAlias = releaseKeyAlias
  80. keyPassword = releaseKeyPassword
  81. }
  82. }
  83. }
  84. buildTypes {
  85. getByName("release") {
  86. isDebuggable = true
  87. isJniDebuggable = true
  88. isMinifyEnabled = false
  89. isShrinkResources = false
  90. isPseudoLocalesEnabled = true
  91. // real keystore when provided, otherwise debug key (still a signed, installable APK)
  92. signingConfig = signingConfigs.getByName(if (hasReleaseKeystore) "release" else "debug")
  93. }
  94. }
  95. compileOptions {
  96. sourceCompatibility = JavaVersion.VERSION_17
  97. targetCompatibility = JavaVersion.VERSION_17
  98. }
  99. buildFeatures {
  100. compose = true
  101. buildConfig = true
  102. // app_name resValue above — declared per-module so the deprecated global
  103. // android.defaults.buildfeatures.resvalues property could be dropped
  104. resValues = true
  105. }
  106. }
  107. dependencies {
  108. implementation(projects.shared)
  109. implementation(libs.compose.runtime)
  110. implementation(libs.compose.foundation)
  111. implementation(libs.compose.material3)
  112. implementation(libs.compose.material.icons.extended)
  113. implementation(libs.compose.ui)
  114. implementation(libs.compose.components.resources)
  115. implementation(libs.compose.components.ui.tooling.preview)
  116. implementation(libs.androidx.activity.compose)
  117. implementation(libs.androidx.core.ktx)
  118. implementation(libs.androidx.lifecycle.viewmodel)
  119. implementation(libs.androidx.lifecycle.runtime.compose)
  120. implementation(libs.androidx.core.splashscreen)
  121. implementation(libs.accompanist.permissions)
  122. implementation(libs.coil.compose)
  123. implementation(libs.napier)
  124. debugImplementation(libs.androidx.ui.tooling)
  125. }