AppPlugin.kt 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248
  1. /*
  2. * Copyright (c) Milan Jurkulák 2024.
  3. * Contact:
  4. * e: mimoccc@gmail.com
  5. * e: mj@mjdev.org
  6. * w: https://mjdev.org
  7. */
  8. package org.mjdev.gradle.plugin
  9. import com.android.build.api.dsl.ApplicationExtension
  10. import io.gitlab.arturbosch.detekt.DetektPlugin
  11. import io.gitlab.arturbosch.detekt.extensions.DetektExtension
  12. import org.gradle.api.JavaVersion
  13. import org.gradle.api.Project
  14. import org.gradle.kotlin.dsl.apply
  15. import org.gradle.kotlin.dsl.configure
  16. import org.mjdev.gradle.extensions.addSyncProviderAuthString
  17. import org.mjdev.gradle.extensions.buildConfigString
  18. import org.mjdev.gradle.extensions.manifestPlaceholders
  19. import org.mjdev.gradle.extensions.setSigningConfigs
  20. import org.mjdev.gradle.extensions.stringRes
  21. import org.mjdev.gradle.extensions.versionCode
  22. import org.mjdev.gradle.extensions.versionName
  23. import org.gradle.kotlin.dsl.dependencies
  24. import org.jetbrains.dokka.Platform
  25. import org.jmailen.gradle.kotlinter.KotlinterExtension
  26. import org.jmailen.gradle.kotlinter.KotlinterPlugin
  27. import org.mjdev.gradle.base.BasePlugin
  28. import org.mjdev.gradle.plugin.config.AppConfig
  29. import org.mjdev.gradle.extensions.asInt
  30. @Suppress("UnstableApiUsage")
  31. class AppPlugin : BasePlugin() {
  32. private val projectNamespace = "org.mjdev.tvapp"
  33. private val projectCompileSdk = 34
  34. private val projectMinSdk = 21
  35. private val projectJavaVersion = JavaVersion.VERSION_17
  36. private val projectKotlinCompilerVersion = "1.5.8"
  37. private val projectExcludes = listOf(
  38. "META-INF/",
  39. "/META-INF/{AL2.0,LGPL2.1}",
  40. "/META-INF/DEPENDENCIES",
  41. "/mozilla/public-suffix-list.txt",
  42. "okhttp3/",
  43. "kotlin/",
  44. "org/",
  45. ".properties",
  46. ".bin",
  47. )
  48. private val projectProguardFile = "proguard-android-optimize.txt"
  49. private val projectProguardRulesFile = "proguard-rules.pro"
  50. private val projectJacocoVersion = "0.8.8"
  51. private val projectLibVersionsFile = "gradle/libs.versions.toml"
  52. private val configFieldName = "appConfig"
  53. override fun Project.work() {
  54. loadVersionCatalog(projectLibVersionsFile)
  55. extension<AppConfig>(configFieldName)
  56. apply(plugin = "version-catalog")
  57. apply(plugin = "kotlin-android")
  58. apply(plugin = "com.android.application")
  59. apply(plugin = "kotlin-kapt")
  60. apply(plugin = "kotlin-parcelize")
  61. apply(plugin = "com.google.devtools.ksp")
  62. apply(plugin = "com.google.dagger.hilt.android")
  63. apply(plugin = "dagger.hilt.android.plugin")
  64. apply(plugin = "io.objectbox")
  65. apply(DetektPlugin::class)
  66. apply(KotlinterPlugin::class)
  67. apply("org.jetbrains.dokka")
  68. configure<ApplicationExtension> {
  69. namespace = projectNamespace
  70. compileSdk = projectCompileSdk
  71. setSigningConfigs(project) {
  72. debugKeyFile = "config/signing.prop"
  73. releaseKeyFile = "config/signing.prop"
  74. }
  75. buildFeatures {
  76. compose = true
  77. buildConfig = true
  78. }
  79. compileOptions {
  80. sourceCompatibility = projectJavaVersion
  81. targetCompatibility = projectJavaVersion
  82. }
  83. composeOptions {
  84. kotlinCompilerExtensionVersion = projectKotlinCompilerVersion
  85. }
  86. defaultConfig {
  87. applicationId = projectNamespace
  88. minSdk = projectMinSdk
  89. targetSdk = projectCompileSdk
  90. versionCode = project.versionCode
  91. versionName = project.versionName
  92. multiDexEnabled = true
  93. buildConfigString(
  94. "IPTV_API_URL" to "https://iptv-org.github.io/api/",
  95. "GITHUB_USER" to "mimoccc",
  96. "GITHUB_REPOSITORY" to "tvapp"
  97. )
  98. manifestPlaceholders(
  99. "auth0Domain" to "@string/com_auth0_domain",
  100. "auth0Scheme" to "demo"
  101. )
  102. testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
  103. }
  104. packaging {
  105. resources {
  106. excludes.addAll(projectExcludes)
  107. }
  108. }
  109. buildTypes {
  110. debug {
  111. applicationIdSuffix = ".$name"
  112. isDebuggable = true
  113. isJniDebuggable = true
  114. isMinifyEnabled = false
  115. isShrinkResources = false
  116. isCrunchPngs = false
  117. // isEmbedMicroApp = true
  118. // isPseudoLocalesEnabled = true
  119. // enableUnitTestCoverage = true
  120. // enableAndroidTestCoverage = true
  121. // isRenderscriptDebuggable = true
  122. // isZipAlignEnabled = false
  123. signingConfig = signingConfigs.getAt(name)
  124. stringRes("app_name", "TVApp-Debug")
  125. addSyncProviderAuthString("sync_auth", ".sync")
  126. proguardFiles(
  127. getDefaultProguardFile(projectProguardFile),
  128. projectProguardRulesFile
  129. )
  130. }
  131. release {
  132. applicationIdSuffix = ".$name"
  133. isDebuggable = false
  134. isJniDebuggable = false
  135. isMinifyEnabled = true
  136. isShrinkResources = true
  137. isCrunchPngs = true
  138. // isEmbedMicroApp = true
  139. // isPseudoLocalesEnabled = false
  140. // enableUnitTestCoverage = false
  141. // enableAndroidTestCoverage = false
  142. // isRenderscriptDebuggable = false
  143. // isZipAlignEnabled = true
  144. signingConfig = signingConfigs.getAt(name)
  145. stringRes("app_name", "TVApp")
  146. addSyncProviderAuthString("sync_auth", ".sync")
  147. proguardFiles(
  148. getDefaultProguardFile(projectProguardFile),
  149. projectProguardRulesFile
  150. )
  151. }
  152. }
  153. // kotlinOptions {
  154. // jvmTarget = JavaVersion.VERSION_17.toString()
  155. // }
  156. sourceSets {
  157. getByName("main") { jniLibs.srcDirs() }
  158. }
  159. lint {
  160. checkReleaseBuilds = false
  161. checkAllWarnings = true
  162. showAll = true
  163. explainIssues = true
  164. abortOnError = true
  165. warningsAsErrors = true
  166. disable += "UnusedIds"
  167. }
  168. // kapt {
  169. // correctErrorTypes = true
  170. // }
  171. // hilt {
  172. // enableAggregatingTask = true
  173. // }
  174. testOptions {
  175. unitTests.isReturnDefaultValues = true
  176. }
  177. testCoverage {
  178. jacocoVersion = projectJacocoVersion
  179. }
  180. }
  181. // app
  182. afterEvaluate {
  183. val appConfig = project.extension<AppConfig>()
  184. kotlinCompileOptions {
  185. kotlinOptions {
  186. freeCompilerArgs += "-Xjsr305=strict"
  187. jvmTarget = projectJavaVersion.toString()
  188. }
  189. }
  190. detektTask {
  191. if (appConfig.autoCorrectCode) runAfterAssembleTask()
  192. }
  193. dokkaTask {
  194. outputDirectory.set(project.rootDir.resolve(appConfig.documentationDir))
  195. moduleName.set(project.name)
  196. suppressObviousFunctions.set(false)
  197. dokkaSourceSets.configureEach {
  198. offlineMode.set(false)
  199. includeNonPublic.set(true)
  200. skipDeprecated.set(false)
  201. reportUndocumented.set(true)
  202. skipEmptyPackages.set(false)
  203. platform.set(Platform.jvm)
  204. jdkVersion.set(projectJavaVersion.asInt())
  205. noStdlibLink.set(false)
  206. noJdkLink.set(false)
  207. noAndroidSdkLink.set(false)
  208. }
  209. if (appConfig.createDocumentation) runAfterAssembleTask()
  210. }
  211. configure<DetektExtension> {
  212. @Suppress("DEPRECATION")
  213. config = files(project.rootDir.resolve(appConfig.detectConfigFile))
  214. }
  215. configure<KotlinterExtension> {
  216. ignoreFailures = false
  217. reporters = arrayOf("checkstyle", "plain")
  218. }
  219. // configurations.getByName("releaseRuntimeClasspath") {
  220. // resolutionStrategy.activateDependencyLocking()
  221. // }
  222. // configurations.getByName("debugRuntimeClasspath") {
  223. // resolutionStrategy.activateDependencyLocking()
  224. // }
  225. // applicationVariants.all {
  226. // outputs.map {
  227. // it as BaseVariantOutputImpl
  228. // }.forEach { output ->
  229. // val outputFileName = "$applicationId-$versionName.apk"
  230. // output.outputFileName = outputFileName
  231. // }
  232. // }
  233. }
  234. dependencyLocking {
  235. // lockMode.set(LockMode.STRICT)
  236. }
  237. dependencies {
  238. // add(IMPLEMENTATION, libs.androidx.compose.ui.tooling)
  239. // add(IMPLEMENTATION, Dependencies.AndroidX.ANNOTATION)
  240. // add(IMPLEMENTATION, Dependencies.AndroidX.APPCOMPAT)
  241. // add(IMPLEMENTATION, Dependencies.Kotlin.STD_LIB)
  242. }
  243. }
  244. }