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")
            }
        }
    }
}
相关推荐
冬奇Lab2 分钟前
Camera HAL3 接口:Android 相机的真正底牌
android·音视频开发·源码阅读
sensen_kiss8 分钟前
CAN302 Technologies for E-Commerce 电子商务技术 Pt.6 市场营销与SEO(搜索引擎优化)
android·学习·搜索引擎
菜鸟国国43 分钟前
Compose + Koin ViewModel 实战完全手册
android
小羊子说1 小时前
Android 音频系统深度解析:从 App 到内核的完整链路
android·人工智能·性能优化·车载系统
fengci.1 小时前
php反序列化(复习)(第三章)
android·开发语言·学习·php
D4c-lovetrain1 小时前
linux个人心得24 (mysql③,AI排版尝试)
android·adb
csj502 小时前
安卓基础之《(25)—竖屏与横屏切换》
android
顾北川_野2 小时前
Android 隐藏桌面应用,指定应用显示;暗码输入显示所有应用,以及暗码方式触发
android
csj502 小时前
安卓基础之《(26)—回到桌面与切到任务列表》
android
Grackers2 小时前
Android Perfetto 系列 7:MainThread 和 RenderThread 解读
android