build.gradle.kts 9.5 KB

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