| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319 |
- import java.io.FileInputStream
- import java.util.Properties
- plugins {
- alias(libs.plugins.compose.compiler)
- alias(libs.plugins.android.application)
- alias(libs.plugins.kotlin.parcelize)
- alias(libs.plugins.kotlin.serialization)
- alias(libs.plugins.room)
- alias(libs.plugins.ksp)
- alias(libs.plugins.google.services)
- alias(libs.plugins.baselineprofile)
- }
- apply(from = "download.gradle")
- val versionPropsFile = file("version.properties")
- val versionProps = Properties().apply {
- if (versionPropsFile.exists()) {
- load(FileInputStream(versionPropsFile))
- }
- }
- val versionMajor = versionProps["VERSION_MAJOR"]?.toString()?.toInt() ?: 0
- val versionMinor = versionProps["VERSION_MINOR"]?.toString()?.toInt() ?: 0
- val versionPatch = versionProps["VERSION_PATCH"]?.toString()?.toInt() ?: 0
- val appName = "legado"
- val projectVersionName = "$versionMajor.$versionMinor.$versionPatch"
- val enableAbiSplits = providers.gradleProperty("enableAbiSplits")
- .map(String::toBoolean)
- .getOrElse(true)
- android {
- compileSdk = 37
- namespace = "io.legado.app"
- signingConfigs {
- if (project.hasProperty("RELEASE_STORE_FILE")) {
- create("myConfig") {
- storeFile = file(project.property("RELEASE_STORE_FILE") as String)
- storePassword = project.property("RELEASE_STORE_PASSWORD") as String
- keyAlias = project.property("RELEASE_KEY_ALIAS") as String
- keyPassword = project.property("RELEASE_KEY_PASSWORD") as String
- enableV1Signing = true
- enableV2Signing = true
- enableV3Signing = true
- enableV4Signing = true
- }
- }
- }
- defaultConfig {
- applicationId = "io.legato.kazusa"
- minSdk = 26
- targetSdk = 37
- versionCode = System.getenv("COMMIT_NUMBER")?.toInt()?.let { 10000 + it } ?: 32640
- versionName = System.getenv("APP_VERSION_NAME") ?: projectVersionName
- testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
- buildConfigField("String", "Cronet_Version", "\"${project.findProperty("CronetVersion")}\"")
- buildConfigField(
- "String",
- "Cronet_Main_Version",
- "\"${project.findProperty("CronetMainVersion")}\""
- )
- javaCompileOptions {
- annotationProcessorOptions {
- arguments += mapOf(
- "room.incremental" to "true",
- "room.expandProjection" to "true",
- "room.schemaLocation" to "$projectDir/schemas"
- )
- }
- }
- }
- buildFeatures {
- compose = true
- buildConfig = true
- viewBinding = true
- }
- buildTypes {
- getByName("release") {
- if (project.hasProperty("RELEASE_STORE_FILE")) {
- signingConfig = signingConfigs.getByName("myConfig")
- }
- manifestPlaceholders["app_name"] = "@string/app_name"
- isMinifyEnabled = true
- isShrinkResources = true
- proguardFiles(
- getDefaultProguardFile("proguard-android-optimize.txt"),
- "proguard-rules.pro",
- "cronet-proguard-rules.pro"
- )
- }
- create("noR8") {
- initWith(getByName("release"))
- isMinifyEnabled = false
- isShrinkResources = false
- matchingFallbacks += listOf("release")
- versionNameSuffix = "-noR8"
- }
- getByName("debug") {
- applicationIdSuffix = ".debug"
- if (project.hasProperty("RELEASE_STORE_FILE")) {
- signingConfig = signingConfigs.getByName("myConfig")
- }
- manifestPlaceholders["app_name"] = "@string/app_name"
- versionNameSuffix = "_debug"
- isMinifyEnabled = false
- proguardFiles(
- getDefaultProguardFile("proguard-android-optimize.txt"),
- "proguard-rules.pro",
- "cronet-proguard-rules.pro"
- )
- }
- }
- splits {
- abi {
- isEnable = enableAbiSplits
- reset()
- include("armeabi-v7a", "arm64-v8a")
- isUniversalApk = true
- }
- }
- flavorDimensions += "mode"
- productFlavors {
- create("app") {
- dimension = "mode"
- manifestPlaceholders["APP_CHANNEL_VALUE"] = "app"
- }
- }
- compileOptions {
- isCoreLibraryDesugaringEnabled = true
- sourceCompatibility = JavaVersion.VERSION_21
- targetCompatibility = JavaVersion.VERSION_21
- }
- packaging {
- resources.excludes.add("META-INF/*")
- }
- sourceSets {
- getByName("androidTest").assets.directories.add("$projectDir/schemas")
- }
- lint {
- baseline = file("lint-baseline.xml")
- checkDependencies = true
- // UnusedResources 在基线里占 1223/1621 条、12218 行(全文件的 75%),几乎全是
- // 跟随上游时留下的资源;release 本来就开了精确资源压缩,它们不会进 APK。
- // 关掉它让基线只剩真正值得盯的那部分,新增问题照样报红。
- disable += "UnusedResources"
- }
- testOptions {
- unitTests {
- // 阅读器核心在构造期就读字符串资源(TextPageFactory 的 keepSwipeTip、
- // TextPage 的默认 text/title、ReadView 的无障碍动作名)。不打开这个,
- // Robolectric 下取任何 R.string 都是 Resources$NotFoundException,
- // 整条阅读器测试线(Track D·D1c)就起不来。
- isIncludeAndroidResources = true
- }
- }
- }
- kotlin {
- jvmToolchain {
- languageVersion.set(JavaLanguageVersion.of(21))
- }
- }
- room {
- schemaDirectory("$projectDir/schemas")
- }
- ksp {
- arg("room.incremental", "true")
- arg("room.expandProjection", "true")
- arg("room.generateKotlin", "false")
- }
- dependencies {
- implementation(libs.androidx.profileinstaller)
- "baselineProfile"(project(":baselineprofile"))
- coreLibraryDesugaring(libs.desugar)
- testImplementation(libs.junit)
- testImplementation(libs.robolectric)
- testImplementation(libs.kotlinx.coroutines.test)
- androidTestImplementation(libs.bundles.androidTest)
- implementation(libs.kotlin.stdlib)
- implementation(libs.kotlinx.collections.immutable)
- implementation(libs.kotlinx.serialization.json)
- implementation(libs.bundles.coroutines)
- implementation(libs.core.ktx)
- implementation(libs.appcompat.appcompat)
- implementation(libs.activity.ktx)
- implementation(libs.fragment.ktx)
- implementation(libs.preference.ktx)
- implementation(libs.androidx.constraintlayout)
- implementation(libs.androidx.swiperefreshlayout)
- implementation(libs.androidx.recyclerview)
- implementation(libs.androidx.viewpager2)
- implementation(libs.androidx.webkit)
- implementation(libs.material)
- implementation(libs.flexbox)
- implementation(libs.gson)
- implementation(libs.lifecycle.common.java8)
- implementation(libs.lifecycle.service)
- implementation(libs.media.media)
- implementation(libs.media3.exoplayer)
- implementation(libs.media3.datasource.okhttp)
- implementation(libs.splitties.appctx)
- implementation(libs.splitties.systemservices)
- implementation(libs.splitties.views)
- implementation(libs.room.runtime)
- implementation(libs.room.ktx)
- ksp(libs.room.compiler)
- androidTestImplementation(libs.room.testing)
- implementation(libs.liveeventbus)
- implementation(libs.jsoup)
- implementation(libs.json.path)
- implementation(libs.jsoupxpath)
- implementation(libs.intellij.markdown)
- implementation(project(":modules:book"))
- implementation(project(":modules:rhino"))
- implementation(libs.okhttp)
- implementation(fileTree(mapOf("dir" to "cronetlib", "include" to listOf("*.jar", "*.aar"))))
- implementation(libs.protobuf.javalite)
- implementation(libs.glide.glide)
- implementation(libs.glide.okhttp)
- ksp(libs.glide.ksp)
- implementation(libs.androidsvg)
- implementation(libs.glide.svg)
- implementation(libs.glide.recyclerview)
- implementation(libs.ktor.server.core)
- implementation(libs.ktor.server.cio)
- implementation(libs.ktor.server.content.negotiation)
- implementation(libs.ktor.serialization.gson)
- implementation(libs.ktor.server.cors)
- implementation(libs.ktor.server.websockets)
- implementation(libs.zxing.lite)
- implementation(libs.colorpicker)
- implementation(libs.colorpicker.compose)
- implementation(libs.libarchive)
- implementation(libs.commons.text)
- implementation(libs.markwon.core)
- implementation(libs.markwon.image.glide)
- implementation(libs.markwon.ext.tables)
- implementation(libs.markwon.html)
- implementation(libs.quick.chinese.transfer.core)
- // 书源 JS 通过 Packages.cn.hutool.* 调用,保留在 classpath(应用代码不依赖,见 AGENTS.md)
- implementation(libs.hutool.crypto)
- //noinspection GradleDependency
- implementation(platform(libs.firebase.bom))
- implementation(libs.firebase.analytics)
- implementation(libs.firebase.perf)
- implementation(libs.androidx.datastore.preferences)
- implementation(libs.androidx.palette)
- implementation(libs.androidx.biometric)
- implementation(libs.androidx.core.splashscreen)
- implementation(libs.androidx.startup.runtime)
- implementation(platform(libs.androidx.compose.bom))
- implementation(libs.activity.compose)
- implementation(libs.androidx.compose.ui)
- implementation(libs.androidx.compose.ui.tooling.preview)
- debugImplementation(libs.androidx.compose.ui.tooling)
- implementation(libs.androidx.compose.material3)
- implementation(libs.androidx.lifecycle.runtime.compose)
- implementation(libs.coil.compose)
- implementation(libs.coil.gif)
- implementation(libs.coil.svg)
- implementation(libs.coil.network.okhttp)
- implementation(libs.telephoto.zoomable.image.coil3)
- implementation(libs.accompanist.webview)
- implementation(libs.kotlinx.coroutines.android)
- implementation(libs.kotlinx.datetime)
- implementation(libs.androidx.lifecycle.viewmodel.compose)
- implementation(libs.androidx.lifecycle.viewmodel.navigation3)
- implementation(libs.androidx.compose.animation)
- implementation(libs.androidx.compose.foundation)
- implementation(libs.androidx.constraintlayout.compose)
- implementation(libs.androidx.compose.ui.viewbinding)
- implementation(libs.androidx.navigation3.runtime)
- implementation(libs.androidx.navigation3.ui)
- // 显式保持 navigationevent 1.2 系列,保留已分离输入的预测式返回崩溃修复。
- implementation(libs.androidx.navigationevent)
- implementation(libs.androidx.navigationevent.compose)
- implementation(libs.androidx.compose.adaptive)
- implementation(libs.androidx.compose.adaptive.layout)
- implementation(libs.androidx.compose.adaptive.navigation)
- implementation(libs.androidx.navigation.compose)
- implementation(libs.androidx.compose.material)
- implementation(libs.compose.materialIcons)
- implementation(platform(libs.koin.bom))
- implementation(libs.koin.core)
- implementation(libs.koin.android)
- implementation(libs.koin.compose)
- implementation(libs.koin.compose.viewmodel)
- implementation(libs.reorderable)
- implementation(libs.material.kolor)
- implementation(libs.haze.core)
- implementation(libs.haze.materials)
- implementation(libs.miuix.ui.android)
- implementation(libs.miuix.preference.android)
- implementation(libs.miuix.icons.android)
- implementation(libs.miuix.blur.android)
- implementation(libs.miuix.core)
- implementation(libs.capsule)
- implementation(libs.backdrop)
- implementation(libs.lyricViewx)
- implementation(libs.timber)
- }
|