plugins { alias(libs.plugins.android.application) alias(libs.plugins.kotlin.compose) alias(libs.plugins.kotlin.serialization) alias(libs.plugins.ksp) } val releaseStoreFile = System.getenv("ETA_RELEASE_STORE_FILE") val releaseStorePassword = System.getenv("ETA_RELEASE_STORE_PASSWORD") val releaseKeyAlias = System.getenv("ETA_RELEASE_KEY_ALIAS") val releaseKeyPassword = System.getenv("ETA_RELEASE_KEY_PASSWORD") val hasReleaseSigning = listOf( releaseStoreFile, releaseStorePassword, releaseKeyAlias, releaseKeyPassword ).all { !it.isNullOrBlank() } java { toolchain { languageVersion = JavaLanguageVersion.of(25) } } android { namespace = "fuck.andes" compileSdk = 37 defaultConfig { applicationId = "fuck.andes" minSdk = 33 targetSdk = 36 versionCode = 261 versionName = "2.6.1" } signingConfigs { if (hasReleaseSigning) { create("release") { storeFile = file(requireNotNull(releaseStoreFile)) storePassword = releaseStorePassword keyAlias = releaseKeyAlias keyPassword = releaseKeyPassword } } } buildTypes { debug { isMinifyEnabled = false isPseudoLocalesEnabled = true } release { signingConfig = signingConfigs.findByName("release") isMinifyEnabled = true isShrinkResources = true proguardFiles( getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" ) } } compileOptions { sourceCompatibility = JavaVersion.VERSION_25 targetCompatibility = JavaVersion.VERSION_25 } buildFeatures { buildConfig = false compose = true } androidResources { localeFilters += listOf("en", "b+zh+Hans", "b+zh+Hant") } packaging { resources { // 合并 Xposed 模块声明,避免 release 裁剪后模块入口失效 merges += "META-INF/xposed/*" // 仅排除会引发打包冲突的签名/版本元数据,避免误伤 Compose 资源 excludes += "META-INF/*.kotlin_module" excludes += "META-INF/INDEX.LIST" excludes += "META-INF/io.netty.versions.properties" } } lint { abortOnError = true checkReleaseBuilds = false } testOptions { unitTests.isIncludeAndroidResources = true } } dependencies { compileOnly(libs.libxposed.api) // UI 侧 RemotePreferences 写入桥:通过 XposedService 将配置提交到 LSPosed 数据库; // Hook 侧用 XposedInterface.getRemotePreferences 读取当前进程持有的配置缓存。 implementation(libs.libxposed.service) implementation(libs.miuix.ui) implementation(libs.miuix.blur) implementation(libs.miuix.preference) implementation(libs.miuix.navigation3.ui) implementation(libs.lucide.icons) implementation(libs.androidx.navigation3.runtime) implementation(libs.activity.compose) implementation(libs.markdown.renderer) implementation(libs.markdown.renderer.m3) // markdown-renderer-m3 将 material3 作为 compileOnly,需显式引入以满足运行时依赖 implementation(libs.material3) // DataStore:Provider / Model 结构化 JSON 与当前选中 ID 等键值 implementation(libs.datastore.preferences) implementation(libs.room.runtime) implementation(libs.room.ktx) ksp(libs.room.compiler) // OkHttp:替代 HttpURLConnection,支持 SSE implementation(libs.okhttp) implementation(libs.okhttp.sse) // Kotlinx Serialization:Provider 设置与运行时配置 JSON implementation(libs.kotlinx.serialization.json) // Coroutines:显式引入,避免依赖传递版本不确定 implementation(libs.kotlinx.coroutines.android) testImplementation(libs.junit) testImplementation(libs.json) testImplementation(libs.room.testing) testImplementation(libs.robolectric) }