Android Gradle8.0以上多渠道写法以及针对不同渠道导入包的方式,填坑!

目录

多渠道的写法

针对多渠道引用不同的包

There was a failure while populating the build operation queue: Could not stat file E:\xxxx\xxxx\xxxx\app\src\UAT\libsUAT\xxx-provider(?)-xx.aar


最近升级了Gradle8.3之后,从Groovy 迁移到 Kotlin,很多写法都有发生改变。

其他的不细说了,针对这篇文章的主题,多渠道写法 以及 不同渠道如何导入不同的包 来讲。

多渠道的写法

日常单一渠道的话,一般会用这种方式去区分环境。在8.0以下的写法是:

productFlavors {
        DEV {
            dimension 'XXXXX'
            applicationIdSuffix '.dev'
            buildConfigField "String", "DOMAIN", '"https://XXXXX/"'
            buildConfigField "String", "XXXX_RETURN_URL", '"scheme://host"'
            buildConfigField "String", "XXXX_RETURN_URL", '"scheme://host"'
            buildConfigField "String", "XXXX_RETURN_URL", '"scheme://host"'
            buildConfigField "Long", "BUILD_DATE", "${buildDate}L"
            manifestPlaceholders = [
                    app_name          : "(DEV)XXXX",
                    DEEP_LINK_HOST    : "DOMAINXXXXX",
            ]
        }
        
        UAT {}

        PROD {}
}

但在8.0以上,写法要改成

productFlavors {
        create("DEV").apply {
            this.dimension = "xxxxx"
            this.applicationIdSuffix = ".dev"
            this.buildConfigField("String", "DOMAIN", "\"https://XXXXXX/\"")
            this.buildConfigField("String", "XXXX_RETURN_URL", "\"scheme://host\"")
            this.buildConfigField("String", "XXXX_RETURN_URL", "\"scheme://host\"")
            this.buildConfigField("String", "XXXX_RETURN_URL", "\"scheme://host\"")
            this.buildConfigField("Long", "BUILD_DATE", "${buildDate}L")
            this.manifestPlaceholders.apply {
                this["app_name"] to "(DEV)XXXXX"
                this["DEEP_LINK_HOST"] to "DOMAINXXXX"
            }
        }
        
        create("UAT").apply {}

        create("PROD").apply {}
}

针对多渠道引用不同的包

这个可能不是每个人都需要,我是遇到是这个问题。

背景:台湾的支付平台SDK,UAT跟PROD给了两个SDK,同时导入会引发重复包的错误,不然就需要在开发阶段,放置UAT的SDK,等上线的时候记得替换PROD的SDK,这样存在一定的风险,可能会忘记替换等等原因。我希望做成当切换渠道(环境)的时候,自动切换到不同的SDK。

正常引用SDK,我们是使用下面这两种方式

dependencies {
    implementation(files("XXXX"))
    implementation(fileTree(mapOf("dir" to "../XXXX/libs", "include" to listOf("*.jar","*.aar"))))
}

我没在Gradle8.0以下针对不同渠道引用不同的SDK,没办法给出8.0以下的写法,我将8.0以上的写法直接贴出来

// 对于特定的flavor,使用特定的dependencies
val libsProdPath = "src/PROD/libsPROD/XXXXX.aar"
val libsUATPath = "src/UAT/libsUAT/XXXXX.aar"

configurations {
    "PRODImplementation" {
        extendsFrom(configurations.implementation.get())
    }
    "UATImplementation" {
        extendsFrom(configurations.implementation.get())
    }
}

dependencies {
    // implementation(fileTree(mapOf("dir" to "../XXXXX/libs", "include" to listOf("*.jar","*.aar"))))
    "PRODImplementation"(files(libsProdPath))
    "UATImplementation"(files(libsUATPath))
}

这样在build的时候,就能根据不同的渠道(环境)去拿到对应的路径下的SDK文件了。

我需要加载多个SDK,所以改成了

// 对于特定的flavor,使用特定的dependencies
val libsProdPath = listOf(
    "src/PROD/libsPROD/XXXXX.aar",
    "src/PROD/libsPROD/XXXXX.aar",
    "src/PROD/libsPROD/XXXXX.aar"
)
val libsUATPath = listOf(
    "src/UAT/libsUAT/XXXXX.aar",
    "src/UAT/libsUAT/XXXXX.aar",
    "src/UAT/libsUAT/XXXXX.aar"
)
configurations {
    "PRODImplementation" {
        extendsFrom(configurations.implementation.get())
    }
    "UATImplementation" {
        extendsFrom(configurations.implementation.get())
    }
}

dependencies {
    // implementation(fileTree(mapOf("dir" to "../XXXXX/libs", "include" to listOf("*.jar","*.aar"))))
    "PRODImplementation"(files(libsProdPath))
    "UATImplementation"(files(libsUATPath))
}

后面又觉得把版本号写固定在路径下并不方便,于是把版本号抽出来,由于我其他的libs的版本号都写在libs.versions.toml下统一管理,于是也很自然而然的去这个文件下添加了

[versions]
xxxxxVersion = "x.y.z"

但当我回来build.gradle.kts修改为如下之后

// 对于特定的flavor,使用特定的dependencies
val libsProdPath = listOf(
    "src/PROD/libsPROD/XXX-${libs.versions.xxxxxVersion}-XX.aar",
    "src/PROD/libsPROD/XXX-${libs.versions.xxxxxVersion}-XX.aar",
    "src/PROD/libsPROD/XXX-${libs.versions.xxxxxVersion}-XX.aar"
)
val libsUATPath = listOf(
    "src/UAT/libsUAT/XXX-${libs.versions.xxxxxVersion}-XX.aar",
    "src/UAT/libsUAT/XXX-${libs.versions.xxxxxVersion}-XX.aar",
    "src/UAT/libsUAT/XXX-${libs.versions.xxxxxVersion}-XX.aar"
)
configurations {
    "PRODImplementation" {
        extendsFrom(configurations.implementation.get())
    }
    "UATImplementation" {
        extendsFrom(configurations.implementation.get())
    }
}

dependencies {
    // implementation(fileTree(mapOf("dir" to "../XXXXX/libs", "include" to listOf("*.jar","*.aar"))))
    "PRODImplementation"(files(libsProdPath))
    "UATImplementation"(files(libsUATPath))
}

出现了问题,Sync的时候提示错误:

There was a failure while populating the build operation queue: Could not stat file E:\xxxx\xxxx\xxxx\app\src\UAT\libsUAT\xxx-provider(?)-xx.aar

找不到文件?为什么找不到,因为版本号没有被正确的加载,变成了provider(?)。

猜测是因为Gradle在执行阶段的时候引用了没有被正确解析的变量,最后通过provider来延迟加载版本号,以确保在配置阶段能够正确加载到版本号

于是,最终代码如下:

val xxxxxVersionProvider: Provider<String> = providers.provider { libs.versions.xxxxxVersion.get() }

// 对于特定的flavor,使用特定的dependencies
val libsProdPath = listOf(
    "src/PROD/libsPROD/XXX-${xxxxxVersionProvider.get()}-XX.aar",
    "src/PROD/libsPROD/XXX-${xxxxxVersionProvider.get()}-XX.aar",
    "src/PROD/libsPROD/XXX-${xxxxxVersionProvider.get()}-XX.aar"
)
val libsUATPath = listOf(
    "src/UAT/libsUAT/XXX-${xxxxxVersionProvider.get()}-XX.aar",
    "src/UAT/libsUAT/XXX-${xxxxxVersionProvider.get()}-XX.aar",
    "src/UAT/libsUAT/XXX-${xxxxxVersionProvider.get()}-XX.aar"
)
configurations {
    "PRODImplementation" {
        extendsFrom(configurations.implementation.get())
    }
    "UATImplementation" {
        extendsFrom(configurations.implementation.get())
    }
}

dependencies {
    // implementation(fileTree(mapOf("dir" to "../XXXXX/libs", "include" to listOf("*.jar","*.aar"))))
    "PRODImplementation"(files(libsProdPath))
    "UATImplementation"(files(libsUATPath))
}

这样就能完美根据Build Variants中选择的Active Build Variant,build.gradle.kts自动去找到相对应的SDK了。

代码中所有实际项目相关的内容,都用【xxxxx】隐去,相应的路径、文件名,大家便根据各自实际情况修改了,有问题可以留言。

本文终。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android 开发中,Gradle 是一个非常重要的构建工具,可以用来构建和打 Android 应用程序。Gradle 插件是一种工具,可以扩展 Gradle 的功能,使其能够支持更多的功能。而多渠道Android 应用程序开发中非常重要的一个方面,它可以让我们将应用程序打不同的版本,并发布到不同的应用商店或市场上。 在 Android Studio 中,我们可以通过自定义 Gradle 插件来实现多渠道,具体步骤如下: 1. 创建 Gradle 插件项目 在 Android Studio 中创建一个新项目,选择 Gradle 插件项目模板。这将创建一个 Gradle 插件项目,并生成一些默认的代码和文件。 2. 实现多渠道 在插件项目中,我们需要实现多渠道的功能。这可以通过 Gradle 的 productFlavors 和 buildTypes 配置来实现。我们可以定义多个 productFlavors,并为每个 productFlavor 配置不同的参数,例如应用程序的名、应用程序名称等。在 buildTypes 中,我们可以为每个 buildType 配置不同的参数,例如应用程序的版本号、是否开启混淆等。 3. 打应用程序 在插件项目中,我们可以编写一个 Gradle 任务来实现应用程序的打。这个任务可以使用 Gradle 提供的 assemble 任务来实现。我们可以为每个 productFlavor 和 buildType 配置不同的打参数,并使用 Gradle 的 assemble 任务来生成应用程序的 APK 文件。 4. 发布应用程序 在插件项目中,我们可以编写一个 Gradle 任务来实现应用程序的发布。这个任务可以使用 Gradle 提供的 uploadArchives 任务来实现。我们可以为每个 productFlavor 和 buildType 配置不同的发布参数,并使用 Gradle 的 uploadArchives 任务将应用程序发布到不同的应用商店或市场上。 总的来说,自定义 Gradle 插件多渠道Android 应用程序开发中非常重要的一个方面。通过自定义 Gradle 插件,我们可以实现更加灵活和高效的应用程序打和发布。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值