【问题标题】:Android gradle: Sharing dependencies between product flavorsAndroid gradle:在产品风格之间共享依赖关系
【发布时间】:2017-08-08 23:06:35
【问题描述】:

我的应用中有 3 种产品风味(风味 1、风味 2、风味 3)。 flavor1 和 flavor2 共享一些与广告相关的依赖项。

有没有办法将与广告相关的依赖项捆绑到 gradle 维度或配置中,并将其添加到 flavor1 和 flavor2 而无需在我的 build.gradle 中复制 compileFlavor1 和 compileFlavor2 行?

这是我当前 gradle 的一部分。这行得通。但是,我想知道是否有更好的方法来做到这一点?因此,我不必为每种口味重复广告依赖项。

android {
    productFlavors {
        flavor1 {}
        flavor2 {}
        flavor3 {}
    }

    sourceSets {
       main {}
       flavor1.java.srcDir 'common/ads/java'     <--- shared sourceSet
       flavor2.java.srcDir 'common/ads/java'
       flavor3.java.srcDir 'common/no_ads/java'
    }
}

dependencies {
    compile 'dependency1'
    compile 'dependency2'

    compileFlavor1 'dependency3'   <----- Same list
    compileFlavor1 'dependency4'
    compileFlavor1 'dependency5'

    compileFlavor2 'dependency3'   <------ Same list
    compileFlavor2 'dependency4'
    compileFlavor2 'dependency5
}

【问题讨论】:

    标签: android gradle build.gradle android-productflavors gradle-dependencies


    【解决方案1】:

    在风味之间共享依赖关系的解决方案(为 implementation 更新,现在已替换 compile):

    由于implementationflavor1Implementationflavor2Implementation等实际上都是Configurations,因此您实际上可以在构建过程中应用这些步骤之间的继承关系。

    因此,在这种情况下,您可以指定您的共享依赖项,以及仅限 flavor1 的依赖项:

    dependencies {
        implementation 'dependency1'
        implementation 'dependency2'
    
        flavor1Implementation 'dependency3'
        flavor1Implementation 'dependency4'
        flavor1Implementation 'dependency5'
    }
    

    ...然后简单地允许flavor2Implementationflavor1Implementation 继承:

    configurations.flavor2Implementation.extendsFrom(flavor1Implementation)
    

    这也可以用来定义风味之间更复杂的关系,并且支持多重继承,例如:

    configurations {
        flavor3Implementation.extendsFrom(
                flavor1Implementation,
                flavor2Implementation
        )
    }
    

    (最后,请注意,应继续按照原始问题使用sourceSets 处理在不同风格之间共享代码。)

    【讨论】:

    • 感谢您的反对,但没有真正解释这个解决方案有什么问题......?(我们已经使用了大约 1 年,对我们来说非常好用)
    【解决方案2】:

    这就是我们在不同口味之间共享目录的做法:

    sourceSets {
        main {
          java.srcDirs = ['src/main/java']
          res.srcDirs = ['src/main/res']
          assets.srcDirs = ['src/main/assets']
        }
        production {
          java.srcDirs = ['src/main/java', 'src/shared/java']
          res.srcDirs = ['src/main/res', 'src/shared/res']
          assets.srcDirs = ['src/main/assets', 'src/shared/assets']
        }
        logger {
          java.srcDirs = ['src/main/java', 'src/shared/java', 'src/mock/java']
          res.srcDirs = ['src/main/res', 'src/shared/res']
          assets.srcDirs = ['src/main/assets', 'src/shared/assets']
        }
        nowav {
          java.srcDirs = ['src/main/java', 'src/nowav/java', 'src/mock/java']
          res.srcDirs = ['src/main/res', 'src/nowav/res']
          assets.srcDirs = ['src/main/assets', 'src/nowav/assets']
        }
    }
    

    【讨论】:

    • 谢谢@Christine。我已经用(在口味之间共享文件夹)这样做了。但是,我的问题是关于在口味之间共享外部依赖项(请检查我的问题中的依赖项块)。
    猜你喜欢
    • 2013-10-01
    • 2021-12-14
    • 1970-01-01
    • 1970-01-01
    • 2019-03-03
    • 2017-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多