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")
            }
        }
    }
}
相关推荐
不爱说话郭德纲2 小时前
告别漫长的HbuilderX云打包排队!uni-app x 安卓本地打包保姆级教程(附白屏、包体积过大排坑指南)
android·前端·uni-app
Sinclair6 小时前
简单几步,安卓手机秒变服务器,安装 CMS 程序
android·服务器
雮尘9 小时前
手把手带你玩转Android gRPC:一篇搞定原理、配置与客户端开发
android·前端·grpc
ktl11 小时前
Android 编译加速/优化 80%:一个文件搞定,零侵入零配置
android
alexhilton21 小时前
使用FunctionGemma进行设备端函数调用
android·kotlin·android jetpack
冬奇Lab1 天前
InputManagerService:输入事件分发与ANR机制
android·源码阅读
张小潇1 天前
AOSP15 Input专题InputManager源码分析
android·操作系统
RdoZam1 天前
Android-封装基类Activity\Fragment,从0到1记录
android·kotlin
奥陌陌1 天前
android 打印函数调用堆栈
android
用户985120035831 天前
Compose Navigation 3 深度解析(二):基础用法
android·android jetpack