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")
            }
        }
    }
}
相关推荐
小宋10212 小时前
Agent轨迹级评测实战:工具选择、预算超限与回归门禁
android·网络·人工智能·回归
墨天梦3 小时前
D05_ViewModel与单向数据流
android·kotlin
蒸鱼Yuzheng5 小时前
Android 构建可复现性:APK 指纹、文件级差异与供应链审计
android·apk·devops·软件供应链·可复现构建
墨天梦7 小时前
D03_Compose列表与稳定身份
android·gitee·kotlin
萌新杰少7 小时前
Kuikly股票查看软件开发体验——SaiRen
android·kotlin·客户端
vilya8 小时前
把 Python 塞进 APK:Chaquopy 打包实践
android·python
用户92817267390168 小时前
Android Compose版本的AI组件库来了。
android·kotlin
知昂七昂8 小时前
00-02:AOSP 源码阅读环境与检索方法论源码剖析(Android 16 / aosp-main)
android
知昂七昂8 小时前
00-01:AOSP 源码仓库结构与 repo 工作流源码剖析(Android 16 / aosp-main)
android·google
跨境数据猎手8 小时前
Android Native 层黑盒调用实战:unidbg 模拟执行 so 的原理
android