build.gradle.kts 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319
  1. import java.io.FileInputStream
  2. import java.util.Properties
  3. plugins {
  4. alias(libs.plugins.compose.compiler)
  5. alias(libs.plugins.android.application)
  6. alias(libs.plugins.kotlin.parcelize)
  7. alias(libs.plugins.kotlin.serialization)
  8. alias(libs.plugins.room)
  9. alias(libs.plugins.ksp)
  10. alias(libs.plugins.google.services)
  11. alias(libs.plugins.baselineprofile)
  12. }
  13. apply(from = "download.gradle")
  14. val versionPropsFile = file("version.properties")
  15. val versionProps = Properties().apply {
  16. if (versionPropsFile.exists()) {
  17. load(FileInputStream(versionPropsFile))
  18. }
  19. }
  20. val versionMajor = versionProps["VERSION_MAJOR"]?.toString()?.toInt() ?: 0
  21. val versionMinor = versionProps["VERSION_MINOR"]?.toString()?.toInt() ?: 0
  22. val versionPatch = versionProps["VERSION_PATCH"]?.toString()?.toInt() ?: 0
  23. val appName = "legado"
  24. val projectVersionName = "$versionMajor.$versionMinor.$versionPatch"
  25. val enableAbiSplits = providers.gradleProperty("enableAbiSplits")
  26. .map(String::toBoolean)
  27. .getOrElse(true)
  28. android {
  29. compileSdk = 37
  30. namespace = "io.legado.app"
  31. signingConfigs {
  32. if (project.hasProperty("RELEASE_STORE_FILE")) {
  33. create("myConfig") {
  34. storeFile = file(project.property("RELEASE_STORE_FILE") as String)
  35. storePassword = project.property("RELEASE_STORE_PASSWORD") as String
  36. keyAlias = project.property("RELEASE_KEY_ALIAS") as String
  37. keyPassword = project.property("RELEASE_KEY_PASSWORD") as String
  38. enableV1Signing = true
  39. enableV2Signing = true
  40. enableV3Signing = true
  41. enableV4Signing = true
  42. }
  43. }
  44. }
  45. defaultConfig {
  46. applicationId = "io.legato.kazusa"
  47. minSdk = 26
  48. targetSdk = 37
  49. versionCode = System.getenv("COMMIT_NUMBER")?.toInt()?.let { 10000 + it } ?: 32640
  50. versionName = System.getenv("APP_VERSION_NAME") ?: projectVersionName
  51. testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
  52. buildConfigField("String", "Cronet_Version", "\"${project.findProperty("CronetVersion")}\"")
  53. buildConfigField(
  54. "String",
  55. "Cronet_Main_Version",
  56. "\"${project.findProperty("CronetMainVersion")}\""
  57. )
  58. javaCompileOptions {
  59. annotationProcessorOptions {
  60. arguments += mapOf(
  61. "room.incremental" to "true",
  62. "room.expandProjection" to "true",
  63. "room.schemaLocation" to "$projectDir/schemas"
  64. )
  65. }
  66. }
  67. }
  68. buildFeatures {
  69. compose = true
  70. buildConfig = true
  71. viewBinding = true
  72. }
  73. buildTypes {
  74. getByName("release") {
  75. if (project.hasProperty("RELEASE_STORE_FILE")) {
  76. signingConfig = signingConfigs.getByName("myConfig")
  77. }
  78. manifestPlaceholders["app_name"] = "@string/app_name"
  79. isMinifyEnabled = true
  80. isShrinkResources = true
  81. proguardFiles(
  82. getDefaultProguardFile("proguard-android-optimize.txt"),
  83. "proguard-rules.pro",
  84. "cronet-proguard-rules.pro"
  85. )
  86. }
  87. create("noR8") {
  88. initWith(getByName("release"))
  89. isMinifyEnabled = false
  90. isShrinkResources = false
  91. matchingFallbacks += listOf("release")
  92. versionNameSuffix = "-noR8"
  93. }
  94. getByName("debug") {
  95. applicationIdSuffix = ".debug"
  96. if (project.hasProperty("RELEASE_STORE_FILE")) {
  97. signingConfig = signingConfigs.getByName("myConfig")
  98. }
  99. manifestPlaceholders["app_name"] = "@string/app_name"
  100. versionNameSuffix = "_debug"
  101. isMinifyEnabled = false
  102. proguardFiles(
  103. getDefaultProguardFile("proguard-android-optimize.txt"),
  104. "proguard-rules.pro",
  105. "cronet-proguard-rules.pro"
  106. )
  107. }
  108. }
  109. splits {
  110. abi {
  111. isEnable = enableAbiSplits
  112. reset()
  113. include("armeabi-v7a", "arm64-v8a")
  114. isUniversalApk = true
  115. }
  116. }
  117. flavorDimensions += "mode"
  118. productFlavors {
  119. create("app") {
  120. dimension = "mode"
  121. manifestPlaceholders["APP_CHANNEL_VALUE"] = "app"
  122. }
  123. }
  124. compileOptions {
  125. isCoreLibraryDesugaringEnabled = true
  126. sourceCompatibility = JavaVersion.VERSION_21
  127. targetCompatibility = JavaVersion.VERSION_21
  128. }
  129. packaging {
  130. resources.excludes.add("META-INF/*")
  131. }
  132. sourceSets {
  133. getByName("androidTest").assets.directories.add("$projectDir/schemas")
  134. }
  135. lint {
  136. baseline = file("lint-baseline.xml")
  137. checkDependencies = true
  138. // UnusedResources 在基线里占 1223/1621 条、12218 行(全文件的 75%),几乎全是
  139. // 跟随上游时留下的资源;release 本来就开了精确资源压缩,它们不会进 APK。
  140. // 关掉它让基线只剩真正值得盯的那部分,新增问题照样报红。
  141. disable += "UnusedResources"
  142. }
  143. testOptions {
  144. unitTests {
  145. // 阅读器核心在构造期就读字符串资源(TextPageFactory 的 keepSwipeTip、
  146. // TextPage 的默认 text/title、ReadView 的无障碍动作名)。不打开这个,
  147. // Robolectric 下取任何 R.string 都是 Resources$NotFoundException,
  148. // 整条阅读器测试线(Track D·D1c)就起不来。
  149. isIncludeAndroidResources = true
  150. }
  151. }
  152. }
  153. kotlin {
  154. jvmToolchain {
  155. languageVersion.set(JavaLanguageVersion.of(21))
  156. }
  157. }
  158. room {
  159. schemaDirectory("$projectDir/schemas")
  160. }
  161. ksp {
  162. arg("room.incremental", "true")
  163. arg("room.expandProjection", "true")
  164. arg("room.generateKotlin", "false")
  165. }
  166. dependencies {
  167. implementation(libs.androidx.profileinstaller)
  168. "baselineProfile"(project(":baselineprofile"))
  169. coreLibraryDesugaring(libs.desugar)
  170. testImplementation(libs.junit)
  171. testImplementation(libs.robolectric)
  172. testImplementation(libs.kotlinx.coroutines.test)
  173. androidTestImplementation(libs.bundles.androidTest)
  174. implementation(libs.kotlin.stdlib)
  175. implementation(libs.kotlinx.collections.immutable)
  176. implementation(libs.kotlinx.serialization.json)
  177. implementation(libs.bundles.coroutines)
  178. implementation(libs.core.ktx)
  179. implementation(libs.appcompat.appcompat)
  180. implementation(libs.activity.ktx)
  181. implementation(libs.fragment.ktx)
  182. implementation(libs.preference.ktx)
  183. implementation(libs.androidx.constraintlayout)
  184. implementation(libs.androidx.swiperefreshlayout)
  185. implementation(libs.androidx.recyclerview)
  186. implementation(libs.androidx.viewpager2)
  187. implementation(libs.androidx.webkit)
  188. implementation(libs.material)
  189. implementation(libs.flexbox)
  190. implementation(libs.gson)
  191. implementation(libs.lifecycle.common.java8)
  192. implementation(libs.lifecycle.service)
  193. implementation(libs.media.media)
  194. implementation(libs.media3.exoplayer)
  195. implementation(libs.media3.datasource.okhttp)
  196. implementation(libs.splitties.appctx)
  197. implementation(libs.splitties.systemservices)
  198. implementation(libs.splitties.views)
  199. implementation(libs.room.runtime)
  200. implementation(libs.room.ktx)
  201. ksp(libs.room.compiler)
  202. androidTestImplementation(libs.room.testing)
  203. implementation(libs.liveeventbus)
  204. implementation(libs.jsoup)
  205. implementation(libs.json.path)
  206. implementation(libs.jsoupxpath)
  207. implementation(libs.intellij.markdown)
  208. implementation(project(":modules:book"))
  209. implementation(project(":modules:rhino"))
  210. implementation(libs.okhttp)
  211. implementation(fileTree(mapOf("dir" to "cronetlib", "include" to listOf("*.jar", "*.aar"))))
  212. implementation(libs.protobuf.javalite)
  213. implementation(libs.glide.glide)
  214. implementation(libs.glide.okhttp)
  215. ksp(libs.glide.ksp)
  216. implementation(libs.androidsvg)
  217. implementation(libs.glide.svg)
  218. implementation(libs.glide.recyclerview)
  219. implementation(libs.ktor.server.core)
  220. implementation(libs.ktor.server.cio)
  221. implementation(libs.ktor.server.content.negotiation)
  222. implementation(libs.ktor.serialization.gson)
  223. implementation(libs.ktor.server.cors)
  224. implementation(libs.ktor.server.websockets)
  225. implementation(libs.zxing.lite)
  226. implementation(libs.colorpicker)
  227. implementation(libs.colorpicker.compose)
  228. implementation(libs.libarchive)
  229. implementation(libs.commons.text)
  230. implementation(libs.markwon.core)
  231. implementation(libs.markwon.image.glide)
  232. implementation(libs.markwon.ext.tables)
  233. implementation(libs.markwon.html)
  234. implementation(libs.quick.chinese.transfer.core)
  235. // 书源 JS 通过 Packages.cn.hutool.* 调用,保留在 classpath(应用代码不依赖,见 AGENTS.md)
  236. implementation(libs.hutool.crypto)
  237. //noinspection GradleDependency
  238. implementation(platform(libs.firebase.bom))
  239. implementation(libs.firebase.analytics)
  240. implementation(libs.firebase.perf)
  241. implementation(libs.androidx.datastore.preferences)
  242. implementation(libs.androidx.palette)
  243. implementation(libs.androidx.biometric)
  244. implementation(libs.androidx.core.splashscreen)
  245. implementation(libs.androidx.startup.runtime)
  246. implementation(platform(libs.androidx.compose.bom))
  247. implementation(libs.activity.compose)
  248. implementation(libs.androidx.compose.ui)
  249. implementation(libs.androidx.compose.ui.tooling.preview)
  250. debugImplementation(libs.androidx.compose.ui.tooling)
  251. implementation(libs.androidx.compose.material3)
  252. implementation(libs.androidx.lifecycle.runtime.compose)
  253. implementation(libs.coil.compose)
  254. implementation(libs.coil.gif)
  255. implementation(libs.coil.svg)
  256. implementation(libs.coil.network.okhttp)
  257. implementation(libs.telephoto.zoomable.image.coil3)
  258. implementation(libs.accompanist.webview)
  259. implementation(libs.kotlinx.coroutines.android)
  260. implementation(libs.kotlinx.datetime)
  261. implementation(libs.androidx.lifecycle.viewmodel.compose)
  262. implementation(libs.androidx.lifecycle.viewmodel.navigation3)
  263. implementation(libs.androidx.compose.animation)
  264. implementation(libs.androidx.compose.foundation)
  265. implementation(libs.androidx.constraintlayout.compose)
  266. implementation(libs.androidx.compose.ui.viewbinding)
  267. implementation(libs.androidx.navigation3.runtime)
  268. implementation(libs.androidx.navigation3.ui)
  269. // 显式保持 navigationevent 1.2 系列,保留已分离输入的预测式返回崩溃修复。
  270. implementation(libs.androidx.navigationevent)
  271. implementation(libs.androidx.navigationevent.compose)
  272. implementation(libs.androidx.compose.adaptive)
  273. implementation(libs.androidx.compose.adaptive.layout)
  274. implementation(libs.androidx.compose.adaptive.navigation)
  275. implementation(libs.androidx.navigation.compose)
  276. implementation(libs.androidx.compose.material)
  277. implementation(libs.compose.materialIcons)
  278. implementation(platform(libs.koin.bom))
  279. implementation(libs.koin.core)
  280. implementation(libs.koin.android)
  281. implementation(libs.koin.compose)
  282. implementation(libs.koin.compose.viewmodel)
  283. implementation(libs.reorderable)
  284. implementation(libs.material.kolor)
  285. implementation(libs.haze.core)
  286. implementation(libs.haze.materials)
  287. implementation(libs.miuix.ui.android)
  288. implementation(libs.miuix.preference.android)
  289. implementation(libs.miuix.icons.android)
  290. implementation(libs.miuix.blur.android)
  291. implementation(libs.miuix.core)
  292. implementation(libs.capsule)
  293. implementation(libs.backdrop)
  294. implementation(libs.lyricViewx)
  295. implementation(libs.timber)
  296. }