build.gradle.kts 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330
  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 = 83
  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. matchingFallbacks.add("release")
  64. }
  65. }
  66. sourceSets {
  67. getByName("preview").res.srcDirs("src/debug/res")
  68. }
  69. flavorDimensions.add("default")
  70. productFlavors {
  71. create("standard") {
  72. buildConfigField("boolean", "INCLUDE_UPDATER", "true")
  73. dimension = "default"
  74. }
  75. create("dev") {
  76. resourceConfigurations.addAll(listOf("en", "xxhdpi"))
  77. dimension = "default"
  78. }
  79. }
  80. packagingOptions {
  81. resources.excludes.addAll(listOf(
  82. "META-INF/DEPENDENCIES",
  83. "LICENSE.txt",
  84. "META-INF/LICENSE",
  85. "META-INF/LICENSE.txt",
  86. "META-INF/README.md",
  87. "META-INF/NOTICE",
  88. "META-INF/*.kotlin_module",
  89. "META-INF/*.version",
  90. ))
  91. }
  92. dependenciesInfo {
  93. includeInApk = false
  94. }
  95. buildFeatures {
  96. viewBinding = true
  97. compose = true
  98. // Disable some unused things
  99. aidl = false
  100. renderScript = false
  101. shaders = false
  102. }
  103. lint {
  104. disable.addAll(listOf("MissingTranslation", "ExtraTranslation"))
  105. abortOnError = false
  106. checkReleaseBuilds = false
  107. }
  108. composeOptions {
  109. kotlinCompilerExtensionVersion = compose.versions.compiler.get()
  110. }
  111. compileOptions {
  112. sourceCompatibility = JavaVersion.VERSION_1_8
  113. targetCompatibility = JavaVersion.VERSION_1_8
  114. }
  115. kotlinOptions {
  116. jvmTarget = JavaVersion.VERSION_1_8.toString()
  117. }
  118. sqldelight {
  119. database("Database") {
  120. packageName = "eu.kanade.tachiyomi"
  121. dialect = "sqlite:3.24"
  122. }
  123. }
  124. }
  125. dependencies {
  126. // Compose
  127. implementation(compose.activity)
  128. implementation(compose.foundation)
  129. implementation(compose.material3.core)
  130. implementation(compose.material3.windowsizeclass)
  131. implementation(compose.material3.adapter)
  132. implementation(compose.material.icons)
  133. implementation(compose.animation)
  134. implementation(compose.animation.graphics)
  135. implementation(compose.ui.tooling)
  136. implementation(compose.ui.util)
  137. implementation(compose.accompanist.webview)
  138. implementation(compose.accompanist.swiperefresh)
  139. implementation(compose.accompanist.flowlayout)
  140. implementation(compose.accompanist.pager.core)
  141. implementation(compose.accompanist.pager.indicators)
  142. implementation(androidx.paging.runtime)
  143. implementation(androidx.paging.compose)
  144. implementation(libs.bundles.sqlite)
  145. implementation(androidx.sqlite)
  146. implementation(libs.sqldelight.android.driver)
  147. implementation(libs.sqldelight.coroutines)
  148. implementation(libs.sqldelight.android.paging)
  149. implementation(kotlinx.reflect)
  150. implementation(kotlinx.bundles.coroutines)
  151. // AndroidX libraries
  152. implementation(androidx.annotation)
  153. implementation(androidx.appcompat)
  154. implementation(androidx.biometricktx)
  155. implementation(androidx.constraintlayout)
  156. implementation(androidx.coordinatorlayout)
  157. implementation(androidx.corektx)
  158. implementation(androidx.splashscreen)
  159. implementation(androidx.recyclerview)
  160. implementation(androidx.viewpager)
  161. implementation(androidx.glance)
  162. implementation(androidx.bundles.lifecycle)
  163. // Job scheduling
  164. implementation(androidx.bundles.workmanager)
  165. // RX
  166. implementation(libs.bundles.reactivex)
  167. implementation(libs.flowreactivenetwork)
  168. // Network client
  169. implementation(libs.bundles.okhttp)
  170. implementation(libs.okio)
  171. // TLS 1.3 support for Android < 10
  172. implementation(libs.conscrypt.android)
  173. // Data serialization (JSON, protobuf)
  174. implementation(kotlinx.bundles.serialization)
  175. // JavaScript engine
  176. implementation(libs.bundles.js.engine)
  177. // HTML parser
  178. implementation(libs.jsoup)
  179. // Disk
  180. implementation(libs.disklrucache)
  181. implementation(libs.unifile)
  182. implementation(libs.junrar)
  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.photoview)
  204. implementation(libs.directionalviewpager) {
  205. exclude(group = "androidx.viewpager", module = "viewpager")
  206. }
  207. implementation(libs.insetter)
  208. implementation(libs.markwon)
  209. implementation(libs.aboutLibraries.compose)
  210. implementation(libs.cascade)
  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. withType<org.jmailen.gradle.kotlinter.tasks.LintTask>().configureEach {
  237. exclude { it.file.path.contains("generated[\\\\/]".toRegex()) }
  238. }
  239. // See https://kotlinlang.org/docs/reference/experimental.html#experimental-status-of-experimental-api(-markers)
  240. withType<KotlinCompile> {
  241. kotlinOptions.freeCompilerArgs += listOf(
  242. "-opt-in=coil.annotation.ExperimentalCoilApi",
  243. "-opt-in=com.google.accompanist.pager.ExperimentalPagerApi",
  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. "-opt-in=kotlinx.coroutines.ExperimentalCoroutinesApi",
  250. "-opt-in=kotlinx.coroutines.FlowPreview",
  251. "-opt-in=kotlinx.coroutines.InternalCoroutinesApi",
  252. "-opt-in=kotlinx.serialization.ExperimentalSerializationApi",
  253. )
  254. }
  255. // Duplicating Hebrew string assets due to some locale code issues on different devices
  256. val copyHebrewStrings by registering(Copy::class) {
  257. from("./src/main/res/values-he")
  258. into("./src/main/res/values-iw")
  259. include("**/*")
  260. }
  261. preBuild {
  262. val ktlintTask = if (System.getenv("GITHUB_BASE_REF") == null) formatKotlin else lintKotlin
  263. dependsOn(ktlintTask, copyHebrewStrings, localesConfigTask)
  264. }
  265. }
  266. buildscript {
  267. dependencies {
  268. classpath(kotlinx.gradle)
  269. }
  270. }