android两种渠道支持一键打包 + 随意组合各种渠道

该代码支持两种渠道的打包,对于一种或两种以上,可自行修改代码来支持,很简单的

在app下面的build.gradle.kts中,里面都有注释,复制直接用,只需修改一下渠道变量即可

kotlin 复制代码
// 定义渠道,在android{}外面哦!
val channel_pad = "pad"
val channel_phone = "phone"
val model_hongmi = "xiaomi"
val model_huawei = "huawei"
// 下面是所有渠道包list
val allChannels = listOf(channel_pad, channel_phone)
val allModels = listOf(model_hongmi, model_huawei)
// 下面是要打特定渠道包map,自由组合
val specifyMap = listOf(
    channel_pad to model_hongmi,
    channel_pad to model_huawei,
)
// 打特定渠道测试包,直接点三角运行
tasks.register("assembleSpecifyDebug") {
    group = "packaging"
    description = "Build all debug APKs for all channel+model combinations"

    specifyMap.forEach { (channel, model) ->
        val taskName = "assemble${channel.capitalize()}${model.capitalize()}Debug"
        println("开始打包: $taskName")  // 调试输出,可在 Gradle 同步时看到
        dependsOn(taskName)
    }

    doLast {
        println("✅ 所有渠道打包完成!共 ${specifyMap.size} 个包")
    }
}
// 打特定渠道正式包,直接点三角运行
tasks.register("assembleSpecifyRelease") {
    group = "packaging"
    description = "Build all release APKs for all channel+model combinations"

    specifyMap.forEach { (channel, model) ->
        val taskName = "assemble${channel.capitalize()}${model.capitalize()}Release"
        println("开始打包: $taskName")  // 调试输出,可在 Gradle 同步时看到
        dependsOn(taskName)
    }

    doLast {
        println("✅ 所有渠道打包完成!共 ${specifyMap.size} 个包")
    }
}

android {
    // .........
    // 定义维度,多渠道
    flavorDimensions += listOf("channel", "model")

    productFlavors {
        allChannels.forEach { channel ->
            create(channel) {
                dimension = "channel"
            }
        }

        allModels.forEach { model ->
            create(model) {
                dimension = "model"
                val apiUrl = if (model == model_huawei) {
                    "https://api.pjx.pjx"
                } else "https://api.example.com"
                buildConfigField("String", "API_URL", "\"$apiUrl\"")
            }
        }
    }
}
// 自定义打包包名,是在android{}外面哦!
androidComponents {
    onVariants { variant ->
        variant.outputs.forEach { output ->
            if (output is com.android.build.api.variant.impl.VariantOutputImpl) {
                val flavorName = variant.flavorName ?: ""
                val buildType = variant.buildType ?: ""
                val verName = android.defaultConfig.versionName ?: "1.0"

                output.outputFileName.set("xbb_${flavorName}_${buildType}_v${verName}.apk")
            }
        }
    }
}
相关推荐
拥小抱15 小时前
Compose 知识点
android
文章永久免费只为良心15 小时前
Web应用安全与防护_第三章_日志文件包含_从一道 CTFshow 题目讲透「日志投毒型 LFI → RCE」:原理、时序陷阱与全变种攻防手册
android·网络安全·渗透测试·漏洞危害·漏洞描述·日志投毒·红队指南
AIsoft_868916 小时前
学术讲座录音如何整理?录音APP可行吗
android·iphone
Patrick在香港18 小时前
一个斜杠,把毫秒变成十几秒
android·数据库·python·性能优化·正则表达式·回溯·redos
海雅达手持终端PDA19 小时前
工业手持终端的“去手机化”演进:看海雅达如何以“同轴扫摄”终结工程妥协,重塑工业PDA新范式
android·物联网·智能手机·硬件工程·能源·制造·iot
booboosui20 小时前
删掉一个住在本机的 agent:8 处要清,顺序不能反
android
hcgeng21 小时前
Android获取崩溃日志
android
aqi0021 小时前
AI编程让鸿蒙开发电子书APP更加快捷
android·华为·harmonyos·鸿蒙·harmony
GY-9321 小时前
【Android】Android Studio 中的协程
android