• 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以下的写法是:

    1. productFlavors {
    2. DEV {
    3. dimension 'XXXXX'
    4. applicationIdSuffix '.dev'
    5. buildConfigField "String", "DOMAIN", '"https://XXXXX/"'
    6. buildConfigField "String", "XXXX_RETURN_URL", '"scheme://host"'
    7. buildConfigField "String", "XXXX_RETURN_URL", '"scheme://host"'
    8. buildConfigField "String", "XXXX_RETURN_URL", '"scheme://host"'
    9. buildConfigField "Long", "BUILD_DATE", "${buildDate}L"
    10. manifestPlaceholders = [
    11. app_name : "(DEV)XXXX",
    12. DEEP_LINK_HOST : "DOMAINXXXXX",
    13. ]
    14. }
    15. UAT {}
    16. PROD {}
    17. }

    但在8.0以上,写法要改成

    1. productFlavors {
    2. create("DEV").apply {
    3. this.dimension = "xxxxx"
    4. this.applicationIdSuffix = ".dev"
    5. this.buildConfigField("String", "DOMAIN", "\"https://XXXXXX/\"")
    6. this.buildConfigField("String", "XXXX_RETURN_URL", "\"scheme://host\"")
    7. this.buildConfigField("String", "XXXX_RETURN_URL", "\"scheme://host\"")
    8. this.buildConfigField("String", "XXXX_RETURN_URL", "\"scheme://host\"")
    9. this.buildConfigField("Long", "BUILD_DATE", "${buildDate}L")
    10. this.manifestPlaceholders.apply {
    11. this["app_name"] to "(DEV)XXXXX"
    12. this["DEEP_LINK_HOST"] to "DOMAINXXXX"
    13. }
    14. }
    15. create("UAT").apply {}
    16. create("PROD").apply {}
    17. }

    针对多渠道引用不同的包

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

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

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

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

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

    1. // 对于特定的flavor,使用特定的dependencies
    2. val libsProdPath = "src/PROD/libsPROD/XXXXX.aar"
    3. val libsUATPath = "src/UAT/libsUAT/XXXXX.aar"
    4. configurations {
    5. "PRODImplementation" {
    6. extendsFrom(configurations.implementation.get())
    7. }
    8. "UATImplementation" {
    9. extendsFrom(configurations.implementation.get())
    10. }
    11. }
    12. dependencies {
    13. // implementation(fileTree(mapOf("dir" to "../XXXXX/libs", "include" to listOf("*.jar","*.aar"))))
    14. "PRODImplementation"(files(libsProdPath))
    15. "UATImplementation"(files(libsUATPath))
    16. }

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

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

    1. // 对于特定的flavor,使用特定的dependencies
    2. val libsProdPath = listOf(
    3. "src/PROD/libsPROD/XXXXX.aar",
    4. "src/PROD/libsPROD/XXXXX.aar",
    5. "src/PROD/libsPROD/XXXXX.aar"
    6. )
    7. val libsUATPath = listOf(
    8. "src/UAT/libsUAT/XXXXX.aar",
    9. "src/UAT/libsUAT/XXXXX.aar",
    10. "src/UAT/libsUAT/XXXXX.aar"
    11. )
    12. configurations {
    13. "PRODImplementation" {
    14. extendsFrom(configurations.implementation.get())
    15. }
    16. "UATImplementation" {
    17. extendsFrom(configurations.implementation.get())
    18. }
    19. }
    20. dependencies {
    21. // implementation(fileTree(mapOf("dir" to "../XXXXX/libs", "include" to listOf("*.jar","*.aar"))))
    22. "PRODImplementation"(files(libsProdPath))
    23. "UATImplementation"(files(libsUATPath))
    24. }

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

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

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

    1. // 对于特定的flavor,使用特定的dependencies
    2. val libsProdPath = listOf(
    3. "src/PROD/libsPROD/XXX-${libs.versions.xxxxxVersion}-XX.aar",
    4. "src/PROD/libsPROD/XXX-${libs.versions.xxxxxVersion}-XX.aar",
    5. "src/PROD/libsPROD/XXX-${libs.versions.xxxxxVersion}-XX.aar"
    6. )
    7. val libsUATPath = listOf(
    8. "src/UAT/libsUAT/XXX-${libs.versions.xxxxxVersion}-XX.aar",
    9. "src/UAT/libsUAT/XXX-${libs.versions.xxxxxVersion}-XX.aar",
    10. "src/UAT/libsUAT/XXX-${libs.versions.xxxxxVersion}-XX.aar"
    11. )
    12. configurations {
    13. "PRODImplementation" {
    14. extendsFrom(configurations.implementation.get())
    15. }
    16. "UATImplementation" {
    17. extendsFrom(configurations.implementation.get())
    18. }
    19. }
    20. dependencies {
    21. // implementation(fileTree(mapOf("dir" to "../XXXXX/libs", "include" to listOf("*.jar","*.aar"))))
    22. "PRODImplementation"(files(libsProdPath))
    23. "UATImplementation"(files(libsUATPath))
    24. }

    出现了问题,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来延迟加载版本号,以确保在配置阶段能够正确加载到版本号

    于是,最终代码如下:

    1. val xxxxxVersionProvider: Provider = providers.provider { libs.versions.xxxxxVersion.get() }
    2. // 对于特定的flavor,使用特定的dependencies
    3. val libsProdPath = listOf(
    4. "src/PROD/libsPROD/XXX-${xxxxxVersionProvider.get()}-XX.aar",
    5. "src/PROD/libsPROD/XXX-${xxxxxVersionProvider.get()}-XX.aar",
    6. "src/PROD/libsPROD/XXX-${xxxxxVersionProvider.get()}-XX.aar"
    7. )
    8. val libsUATPath = listOf(
    9. "src/UAT/libsUAT/XXX-${xxxxxVersionProvider.get()}-XX.aar",
    10. "src/UAT/libsUAT/XXX-${xxxxxVersionProvider.get()}-XX.aar",
    11. "src/UAT/libsUAT/XXX-${xxxxxVersionProvider.get()}-XX.aar"
    12. )
    13. configurations {
    14. "PRODImplementation" {
    15. extendsFrom(configurations.implementation.get())
    16. }
    17. "UATImplementation" {
    18. extendsFrom(configurations.implementation.get())
    19. }
    20. }
    21. dependencies {
    22. // implementation(fileTree(mapOf("dir" to "../XXXXX/libs", "include" to listOf("*.jar","*.aar"))))
    23. "PRODImplementation"(files(libsProdPath))
    24. "UATImplementation"(files(libsUATPath))
    25. }

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

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

    本文终。

  • 相关阅读:
    (附源码)Springboot工程技术研究中心小程序 毕业设计 201738
    Three.js-绘制矩形shader
    Scala Iterator(迭代器)
    Splunk Connect for Kafka – Connecting Apache Kafka with Splunk
    Vue Day02
    README.md文件使用
    MIPI I3C协议
    HP服务器硬盘坏了一块,教你如何快速更换
    CDH CDH 13Cloudera Manager Console FreeIPA 用户规划(markdown新版)
    小笔记:02-jquery-将url作为参数传递给后端,需要进行的特殊处理
  • 原文地址:https://blog.csdn.net/yezisuifengbiao/article/details/133930690