build.gradle.kts 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328
  1. import org.gradle.api.tasks.testing.logging.TestLogEvent
  2. import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
  3. plugins {
  4. id("com.android.application")
  5. id("com.mikepenz.aboutlibraries.plugin")
  6. kotlin("android")
  7. kotlin("plugin.serialization")
  8. id("com.github.zellius.shortcut-helper")
  9. id("com.squareup.sqldelight")
  10. }
  11. if (gradle.startParameter.taskRequests.toString().contains("Standard")) {
  12. apply<com.google.gms.googleservices.GoogleServicesPlugin>()
  13. }
  14. shortcutHelper.setFilePath("./shortcuts.xml")
  15. val SUPPORTED_ABIS = setOf("armeabi-v7a", "arm64-v8a", "x86", "x86_64")
  16. android {
  17. namespace = "eu.kanade.tachiyomi"
  18. compileSdk = AndroidConfig.compileSdk
  19. ndkVersion = AndroidConfig.ndk
  20. defaultConfig {
  21. applicationId = "eu.kanade.tachiyomi"
  22. minSdk = AndroidConfig.minSdk
  23. targetSdk = AndroidConfig.targetSdk
  24. versionCode = 82
  25. versionName = "0.13.6"
  26. buildConfigField("String", "COMMIT_COUNT", "\"${getCommitCount()}\"")
  27. buildConfigField("String", "COMMIT_SHA", "\"${getGitSha()}\"")
  28. buildConfigField("String", "BUILD_TIME", "\"${getBuildTime()}\"")
  29. buildConfigField("boolean", "INCLUDE_UPDATER", "false")
  30. buildConfigField("boolean", "PREVIEW", "false")
  31. // Please disable ACRA or use your own instance in forked versions of the project
  32. buildConfigField("String", "ACRA_URI", "\"https://tachiyomi.kanade.eu/crash_report\"")
  33. ndk {
  34. abiFilters += SUPPORTED_ABIS
  35. }
  36. testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
  37. }
  38. splits {
  39. abi {
  40. isEnable = true
  41. reset()
  42. include(*SUPPORTED_ABIS.toTypedArray())
  43. isUniversalApk = true
  44. }
  45. }
  46. buildTypes {
  47. named("debug") {
  48. versionNameSuffix = "-${getCommitCount()}"
  49. applicationIdSuffix = ".debug"
  50. }
  51. named("release") {
  52. isShrinkResources = true
  53. isMinifyEnabled = true
  54. proguardFiles("proguard-android-optimize.txt", "proguard-rules.pro")
  55. }
  56. create("preview") {
  57. initWith(getByName("release"))
  58. buildConfigField("boolean", "PREVIEW", "true")
  59. val debugType = getByName("debug")
  60. signingConfig = debugType.signingConfig
  61. versionNameSuffix = debugType.versionNameSuffix
  62. applicationIdSuffix = debugType.applicationIdSuffix
  63. }
  64. }
  65. sourceSets {
  66. getByName("preview").res.srcDirs("src/debug/res")
  67. }
  68. flavorDimensions.add("default")
  69. productFlavors {
  70. create("standard") {
  71. buildConfigField("boolean", "INCLUDE_UPDATER", "true")
  72. dimension = "default"
  73. }
  74. create("dev") {
  75. resourceConfigurations.addAll(listOf("en", "xxhdpi"))
  76. dimension = "default"
  77. }
  78. }
  79. packagingOptions {
  80. resources.excludes.addAll(listOf(
  81. "META-INF/DEPENDENCIES",
  82. "LICENSE.txt",
  83. "META-INF/LICENSE",
  84. "META-INF/LICENSE.txt",
  85. "META-INF/README.md",
  86. "META-INF/NOTICE",
  87. "META-INF/*.kotlin_module",
  88. "META-INF/*.version",
  89. ))
  90. }
  91. dependenciesInfo {
  92. includeInApk = false
  93. }
  94. buildFeatures {
  95. viewBinding = true
  96. compose = true
  97. // Disable some unused things
  98. aidl = false
  99. renderScript = false
  100. shaders = false
  101. }
  102. lint {
  103. disable.addAll(listOf("MissingTranslation", "ExtraTranslation"))
  104. abortOnError = false
  105. checkReleaseBuilds = false
  106. }
  107. composeOptions {
  108. kotlinCompilerExtensionVersion = compose.versions.compiler.get()
  109. }
  110. compileOptions {
  111. sourceCompatibility = JavaVersion.VERSION_1_8
  112. targetCompatibility = JavaVersion.VERSION_1_8
  113. }
  114. kotlinOptions {
  115. jvmTarget = JavaVersion.VERSION_1_8.toString()
  116. }
  117. sqldelight {
  118. database("Database") {
  119. packageName = "eu.kanade.tachiyomi"
  120. dialect = "sqlite:3.24"
  121. }
  122. }
  123. }
  124. dependencies {
  125. // Compose
  126. implementation(compose.activity)
  127. implementation(compose.foundation)
  128. implementation(compose.material3.core)
  129. implementation(compose.material3.windowsizeclass)
  130. implementation(compose.material3.adapter)
  131. implementation(compose.material.icons)
  132. implementation(compose.animation)
  133. implementation(compose.animation.graphics)
  134. implementation(compose.ui.tooling)
  135. implementation(compose.ui.util)
  136. implementation(compose.accompanist.webview)
  137. implementation(compose.accompanist.swiperefresh)
  138. implementation(compose.accompanist.flowlayout)
  139. implementation(compose.accompanist.pager.core)
  140. implementation(compose.accompanist.pager.indicators)
  141. implementation(androidx.paging.runtime)
  142. implementation(androidx.paging.compose)
  143. implementation(libs.bundles.sqlite)
  144. implementation(androidx.sqlite)
  145. implementation(libs.sqldelight.android.driver)
  146. implementation(libs.sqldelight.coroutines)
  147. implementation(libs.sqldelight.android.paging)
  148. implementation(kotlinx.reflect)
  149. implementation(kotlinx.bundles.coroutines)
  150. // AndroidX libraries
  151. implementation(androidx.annotation)
  152. implementation(androidx.appcompat)
  153. implementation(androidx.biometricktx)
  154. implementation(androidx.constraintlayout)
  155. implementation(androidx.coordinatorlayout)
  156. implementation(androidx.corektx)
  157. implementation(androidx.splashscreen)
  158. implementation(androidx.recyclerview)
  159. implementation(androidx.viewpager)
  160. implementation(androidx.glance)
  161. implementation(androidx.bundles.lifecycle)
  162. // Job scheduling
  163. implementation(androidx.bundles.workmanager)
  164. // RX
  165. implementation(libs.bundles.reactivex)
  166. implementation(libs.flowreactivenetwork)
  167. // Network client
  168. implementation(libs.bundles.okhttp)
  169. implementation(libs.okio)
  170. // TLS 1.3 support for Android < 10
  171. implementation(libs.conscrypt.android)
  172. // Data serialization (JSON, protobuf)
  173. implementation(kotlinx.bundles.serialization)
  174. // JavaScript engine
  175. implementation(libs.bundles.js.engine)
  176. // HTML parser
  177. implementation(libs.jsoup)
  178. // Disk
  179. implementation(libs.disklrucache)
  180. implementation(libs.unifile)
  181. implementation(libs.junrar)
  182. // Preferences
  183. implementation(libs.preferencektx)
  184. implementation(libs.flowpreferences)
  185. // Model View Presenter
  186. implementation(libs.bundles.nucleus)
  187. // Dependency injection
  188. implementation(libs.injekt.core)
  189. // Image loading
  190. implementation(libs.bundles.coil)
  191. implementation(libs.subsamplingscaleimageview) {
  192. exclude(module = "image-decoder")
  193. }
  194. implementation(libs.image.decoder)
  195. // Sort
  196. implementation(libs.natural.comparator)
  197. // UI libraries
  198. implementation(libs.material)
  199. implementation(libs.androidprocessbutton)
  200. implementation(libs.flexible.adapter.core)
  201. implementation(libs.flexible.adapter.ui)
  202. implementation(libs.photoview)
  203. implementation(libs.directionalviewpager) {
  204. exclude(group = "androidx.viewpager", module = "viewpager")
  205. }
  206. implementation(libs.insetter)
  207. implementation(libs.markwon)
  208. implementation(libs.aboutLibraries.compose)
  209. // Conductor
  210. implementation(libs.bundles.conductor)
  211. // FlowBinding
  212. implementation(libs.bundles.flowbinding)
  213. // Logging
  214. implementation(libs.logcat)
  215. // Crash reports/analytics
  216. implementation(libs.acra.http)
  217. "standardImplementation"(libs.firebase.analytics)
  218. // Shizuku
  219. implementation(libs.bundles.shizuku)
  220. // Tests
  221. testImplementation(libs.junit)
  222. // For detecting memory leaks; see https://square.github.io/leakcanary/
  223. // debugImplementation(libs.leakcanary.android)
  224. implementation(libs.leakcanary.plumber)
  225. }
  226. tasks {
  227. val localesConfigTask = registerLocalesConfigTask(project)
  228. withType<Test> {
  229. useJUnitPlatform()
  230. testLogging {
  231. events(TestLogEvent.PASSED, TestLogEvent.SKIPPED, TestLogEvent.FAILED)
  232. }
  233. }
  234. withType<org.jmailen.gradle.kotlinter.tasks.LintTask>().configureEach {
  235. exclude { it.file.path.contains("generated[\\\\/]".toRegex())}
  236. }
  237. // See https://kotlinlang.org/docs/reference/experimental.html#experimental-status-of-experimental-api(-markers)
  238. withType<KotlinCompile> {
  239. kotlinOptions.freeCompilerArgs += listOf(
  240. "-opt-in=coil.annotation.ExperimentalCoilApi",
  241. "-opt-in=com.google.accompanist.pager.ExperimentalPagerApi",
  242. "-opt-in=androidx.compose.material3.ExperimentalMaterial3Api",
  243. "-opt-in=androidx.compose.ui.ExperimentalComposeUiApi",
  244. "-opt-in=androidx.compose.foundation.ExperimentalFoundationApi",
  245. "-opt-in=androidx.compose.animation.graphics.ExperimentalAnimationGraphicsApi",
  246. "-opt-in=androidx.compose.material3.windowsizeclass.ExperimentalMaterial3WindowSizeClassApi",
  247. "-opt-in=kotlinx.coroutines.ExperimentalCoroutinesApi",
  248. "-opt-in=kotlinx.coroutines.FlowPreview",
  249. "-opt-in=kotlinx.coroutines.InternalCoroutinesApi",
  250. "-opt-in=kotlinx.serialization.ExperimentalSerializationApi",
  251. )
  252. }
  253. // Duplicating Hebrew string assets due to some locale code issues on different devices
  254. val copyHebrewStrings by registering(Copy::class) {
  255. from("./src/main/res/values-he")
  256. into("./src/main/res/values-iw")
  257. include("**/*")
  258. }
  259. preBuild {
  260. val ktlintTask = if (System.getenv("GITHUB_BASE_REF") == null) formatKotlin else lintKotlin
  261. dependsOn(ktlintTask, copyHebrewStrings, localesConfigTask)
  262. }
  263. }
  264. buildscript {
  265. dependencies {
  266. classpath(kotlinx.gradle)
  267. }
  268. }