build.gradle.kts 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326
  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")
  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 = 81
  25. versionName = "0.13.5"
  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. // Source models and interfaces from Tachiyomi 1.x
  151. implementation(libs.tachiyomi.api)
  152. // AndroidX libraries
  153. implementation(androidx.annotation)
  154. implementation(androidx.appcompat)
  155. implementation(androidx.biometricktx)
  156. implementation(androidx.constraintlayout)
  157. implementation(androidx.coordinatorlayout)
  158. implementation(androidx.corektx)
  159. implementation(androidx.splashscreen)
  160. implementation(androidx.recyclerview)
  161. implementation(androidx.viewpager)
  162. implementation(androidx.glance)
  163. implementation(androidx.bundles.lifecycle)
  164. // Job scheduling
  165. implementation(androidx.bundles.workmanager)
  166. // RX
  167. implementation(libs.bundles.reactivex)
  168. implementation(libs.flowreactivenetwork)
  169. // Network client
  170. implementation(libs.bundles.okhttp)
  171. implementation(libs.okio)
  172. // TLS 1.3 support for Android < 10
  173. implementation(libs.conscrypt.android)
  174. // Data serialization (JSON, protobuf)
  175. implementation(kotlinx.bundles.serialization)
  176. // JavaScript engine
  177. implementation(libs.bundles.js.engine)
  178. // HTML parser
  179. implementation(libs.jsoup)
  180. // Disk
  181. implementation(libs.disklrucache)
  182. implementation(libs.unifile)
  183. implementation(libs.junrar)
  184. // Preferences
  185. implementation(libs.preferencektx)
  186. implementation(libs.flowpreferences)
  187. // Model View Presenter
  188. implementation(libs.bundles.nucleus)
  189. // Dependency injection
  190. implementation(libs.injekt.core)
  191. // Image loading
  192. implementation(libs.bundles.coil)
  193. implementation(libs.subsamplingscaleimageview) {
  194. exclude(module = "image-decoder")
  195. }
  196. implementation(libs.image.decoder)
  197. // Sort
  198. implementation(libs.natural.comparator)
  199. // UI libraries
  200. implementation(libs.material)
  201. implementation(libs.androidprocessbutton)
  202. implementation(libs.flexible.adapter.core)
  203. implementation(libs.flexible.adapter.ui)
  204. implementation(libs.photoview)
  205. implementation(libs.directionalviewpager) {
  206. exclude(group = "androidx.viewpager", module = "viewpager")
  207. }
  208. implementation(libs.insetter)
  209. implementation(libs.markwon)
  210. implementation(libs.aboutLibraries.compose)
  211. // Conductor
  212. implementation(libs.bundles.conductor)
  213. // FlowBinding
  214. implementation(libs.bundles.flowbinding)
  215. // Logging
  216. implementation(libs.logcat)
  217. // Crash reports/analytics
  218. implementation(libs.acra.http)
  219. "standardImplementation"(libs.firebase.analytics)
  220. // Shizuku
  221. implementation(libs.bundles.shizuku)
  222. // Tests
  223. testImplementation(libs.junit)
  224. // For detecting memory leaks; see https://square.github.io/leakcanary/
  225. // debugImplementation(libs.leakcanary.android)
  226. implementation(libs.leakcanary.plumber)
  227. }
  228. tasks {
  229. val localesConfigTask = registerLocalesConfigTask(project)
  230. withType<Test> {
  231. useJUnitPlatform()
  232. testLogging {
  233. events(TestLogEvent.PASSED, TestLogEvent.SKIPPED, TestLogEvent.FAILED)
  234. }
  235. }
  236. // See https://kotlinlang.org/docs/reference/experimental.html#experimental-status-of-experimental-api(-markers)
  237. withType<KotlinCompile> {
  238. kotlinOptions.freeCompilerArgs += listOf(
  239. "-opt-in=coil.annotation.ExperimentalCoilApi",
  240. "-opt-in=com.google.accompanist.pager.ExperimentalPagerApi",
  241. "-opt-in=androidx.compose.material3.ExperimentalMaterial3Api",
  242. "-opt-in=androidx.compose.ui.ExperimentalComposeUiApi",
  243. "-opt-in=androidx.compose.foundation.ExperimentalFoundationApi",
  244. "-opt-in=androidx.compose.animation.graphics.ExperimentalAnimationGraphicsApi",
  245. "-opt-in=androidx.compose.material3.windowsizeclass.ExperimentalMaterial3WindowSizeClassApi",
  246. "-opt-in=kotlinx.coroutines.ExperimentalCoroutinesApi",
  247. "-opt-in=kotlinx.coroutines.FlowPreview",
  248. "-opt-in=kotlinx.coroutines.InternalCoroutinesApi",
  249. "-opt-in=kotlinx.serialization.ExperimentalSerializationApi",
  250. )
  251. }
  252. // Duplicating Hebrew string assets due to some locale code issues on different devices
  253. val copyHebrewStrings by registering(Copy::class) {
  254. from("./src/main/res/values-he")
  255. into("./src/main/res/values-iw")
  256. include("**/*")
  257. }
  258. preBuild {
  259. dependsOn(formatKotlin, copyHebrewStrings, localesConfigTask)
  260. }
  261. }
  262. buildscript {
  263. dependencies {
  264. classpath(kotlinx.gradle)
  265. }
  266. }