2

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

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

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

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
}
4

2 回答 2

2

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

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

因此,在这种情况下,您可以指定您的共享依赖项,并且flavor1仅针对:

dependencies {
    implementation 'dependency1'
    implementation 'dependency2'

    flavor1Implementation 'dependency3'
    flavor1Implementation 'dependency4'
    flavor1Implementation 'dependency5'
}

...然后简单地允许flavor2Implementation继承自flavor1Implementation

configurations.flavor2Implementation.extendsFrom(flavor1Implementation)

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

configurations {
    flavor3Implementation.extendsFrom(
            flavor1Implementation,
            flavor2Implementation
    )
}

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

于 2019-02-18T10:31:31.217 回答
0

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

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']
    }
}
于 2017-08-08T23:45:07.527 回答