build.gradle.kts 9.4 KB

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