import com.android.build.gradle.internal.api.BaseVariantOutputImpl import java.text.SimpleDateFormat import java.util.Date import java.util.Properties fun getVersionCode(): Int { val dateFormat = SimpleDateFormat("yyyyMMdd") val versionCodeStr = dateFormat.format(Date()) return versionCodeStr.toInt() } plugins { alias(libs.plugins.android.application) alias(libs.plugins.kotlin.android) alias(libs.plugins.kotlin.compose) alias(libs.plugins.kotlin.serialization) } // 读取 gradle.properties 并解析 project.xx 字段 fun buildTypeChain(): Map> { val properties = Properties() val file = File(rootDir, "gradle.properties") if (file.exists()) { properties.load(file.inputStream()) } // 只取 project.xx 字段 val projectMap = properties.entries .filter { (k, _) -> k.toString().startsWith("project.") } .associate { (k, v) -> k.toString().removePrefix("project.") to v.toString() } // 递归查找链 fun resolveChain(key: String): List { val next = projectMap[key] return if (next == null || next == "debug" || next == "release") { listOfNotNull(key, next) } else { listOf(key) + resolveChain(next) } } // 构建所有链并返回 return projectMap.keys.associateWith { resolveChain(it) } } val buildTypeChain = buildTypeChain() android { namespace = "com.hzliuzhi.applet.container" compileSdk = 35 defaultConfig { applicationId = "com.hzliuzhi.applet.container" minSdk = 26 targetSdk = 35 versionCode = getVersionCode() versionName = "2.2.1" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } buildTypes { release { isMinifyEnabled = false proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") } buildTypeChain.values.sortedBy { it.size }.forEach { chain -> when (val name = chain.first()) { "debug", "release", -> return@forEach else -> create(name) { // initWith 取 chain 的下一个(即父级) initWith(getByName(chain.getOrNull(1) ?: "debug")) // matchingFallbacks 取除自己外的所有 matchingFallbacks += chain.drop(1) } } } } sourceSets { buildTypeChain.forEach { (name, chain) -> maybeCreate(name).apply { // 不包含 main,只合并链上的自定义类型 val dirs = chain.reversed() dirs.forEach { dir -> assets.srcDir("src/$dir/assets") } } } } androidResources { noCompress.add("apk") } applicationVariants.all { outputs.all { val appName = "six" // 你的自定义名称 val buildType = buildType.name val versionName = versionName val versionCode = versionCode val fileName = "${appName}.${buildType}-${versionName}-${versionCode}.apk" (this as BaseVariantOutputImpl).apply { outputFileName = fileName } } } compileOptions { sourceCompatibility = JavaVersion.VERSION_11 targetCompatibility = JavaVersion.VERSION_11 } kotlinOptions { jvmTarget = "11" } buildFeatures { compose = true } } dependencies { implementation(libs.androidx.core.ktx) implementation(libs.androidx.lifecycle.runtime.ktx) implementation(libs.androidx.activity.compose) implementation(libs.androidx.navigation.compose) implementation(libs.serialization.json) implementation(platform(libs.androidx.compose.bom)) implementation(libs.androidx.ui) implementation(libs.androidx.ui.graphics) implementation(libs.androidx.ui.tooling.preview) implementation(libs.androidx.material3) testImplementation(libs.junit) androidTestImplementation(libs.androidx.junit) androidTestImplementation(libs.androidx.espresso.core) androidTestImplementation(platform(libs.androidx.compose.bom)) androidTestImplementation(libs.androidx.ui.test.junit4) debugImplementation(libs.androidx.ui.tooling) debugImplementation(libs.androidx.ui.test.manifest) implementation(project(":core")) implementation(project(":library:browser")) implementation(project(":library:device:pulse")) implementation(project(":library:device:printer")) implementation(project(":library:device:scanner")) implementation(libs.gson) }