@file:Suppress("UNUSED_VARIABLE") import com.android.build.gradle.AppExtension import com.android.build.gradle.BaseExtension import java.net.URL import java.util.* buildscript { repositories { mavenCentral() google() maven("https://maven.kr328.app/releases") } dependencies { classpath(libs.build.android) classpath(libs.build.kotlin.common) classpath(libs.build.kotlin.serialization) classpath(libs.build.ksp) classpath(libs.build.golang) } } subprojects { repositories { mavenCentral() google() maven("https://maven.kr328.app/releases") } val isApp = name == "app" apply(plugin = if (isApp) "com.android.application" else "com.android.library") extensions.configure { defaultConfig { if (isApp) { applicationId = "com.github.kr328.clash" } minSdk = 21 targetSdk = 31 versionName = "2.5.8" versionCode = 205008 resValue("string", "release_name", "v$versionName") resValue("integer", "release_code", "$versionCode") externalNativeBuild { cmake { abiFilters("arm64-v8a", "armeabi-v7a", "x86", "x86_64") } } if (!isApp) { consumerProguardFiles("consumer-rules.pro") } else { setProperty("archivesBaseName", "cfa-$versionName") } } ndkVersion = "23.0.7599858" compileSdkVersion(defaultConfig.targetSdk!!) if (isApp) { packagingOptions { excludes.add("DebugProbesKt.bin") } } productFlavors { flavorDimensions("feature") create("foss") { isDefault = true dimension = flavorDimensionList[0] versionNameSuffix = ".foss" buildConfigField("boolean", "PREMIUM", "Boolean.parseBoolean(\"false\")") if (isApp) { applicationIdSuffix = ".foss" } } create("premium") { dimension = flavorDimensionList[0] versionNameSuffix = ".premium" buildConfigField("boolean", "PREMIUM", "Boolean.parseBoolean(\"true\")") val tracker = rootProject.file("tracker.properties") if (tracker.exists()) { val prop = Properties().apply { tracker.inputStream().use(this::load) } buildConfigField( "String", "APP_CENTER_KEY", "\"${prop.getProperty("appcenter.key")!!}\"" ) } } } signingConfigs { val keystore = rootProject.file("signing.properties") if (keystore.exists()) { create("release") { val prop = Properties().apply { keystore.inputStream().use(this::load) } storeFile = rootProject.file(prop.getProperty("keystore.path")!!) storePassword = prop.getProperty("keystore.password")!! keyAlias = prop.getProperty("key.alias")!! keyPassword = prop.getProperty("key.password")!! } } } buildTypes { named("release") { isMinifyEnabled = isApp isShrinkResources = isApp signingConfig = signingConfigs.findByName("release") proguardFiles( getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" ) } named("debug") { versionNameSuffix = ".debug" } } buildFeatures.apply { dataBinding { isEnabled = name != "hideapi" } } variantFilter { ignore = name.startsWith("premium") && !project(":core") .file("src/premium/golang/clash/go.mod").exists() } if (isApp) { this as AppExtension splits { abi { isEnable = true isUniversalApk = true } } } } } task("clean", type = Delete::class) { delete(rootProject.buildDir) } tasks.wrapper { distributionType = Wrapper.DistributionType.ALL doLast { val sha256 = URL("$distributionUrl.sha256").openStream() .use { it.reader().readText().trim() } file("gradle/wrapper/gradle-wrapper.properties") .appendText("distributionSha256Sum=$sha256") } }