gradle Android分级:共享产品风味之间的依赖关系

np8igboo  于 2023-01-13  发布在  Android
关注(0)|答案(3)|浏览(260)

我的应用中有3种产品风味(风味1、风味2、风味3)。风味1和风味2共享一些与广告相关的依赖项。
是否有办法将广告相关依赖项绑定到一个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
}
cgfeq70w

cgfeq70w1#

用于在风格之间共享依赖项的解决方案(针对implementation进行了更新,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进行处理。)

nsc4cvqm

nsc4cvqm2#

下面是我们在不同风格之间共享目录所做的工作:

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']
    }
}
798qvoo8

798qvoo83#

我找不到一种简洁的方法来实现这一点(风味继承对我来说不是一个选项),所以我为它编写了一个小实用程序。

实用程序

只需在dependencies块之前添加以下函数:

/** Adds [dependency] as a dependency for the flavor [flavor] */
dependencies.ext.flavorImplementation = { flavor, dependency ->
    def cmd = "${flavor}Implementation"
    dependencies.add(cmd, dependency)
}

/** Adds [dependency] as a dependency for every flavor in [flavors] */
dependencies.ext.flavorsImplementation = { flavors, dependency ->
    flavors.each { dependencies.flavorImplementation(it, dependency) }
}

用法

该实用程序的使用方法如下:

dependencies {
    ...
    def myFlavors = ["flavor1", "flavor2", "flavor3"]
    flavorsImplementation(myFlavors, "com.example.test:test:1.0.0")
    flavorsImplementation(myFlavors, project(':local'))
    ...
}

工作原理

此实用程序的关键是gradle的dependencies.add API,它采用2个参数:
1.依赖项的类型,例如implementationapiflavor1Implementation。这可以是字符串,它允许我们使用字符串操作动态创建此值。
1.依赖项本身,例如"com.example.test:test:1.0.0"project(':local')
使用这个API,您可以动态地添加依赖项,具有相当大的灵活性!

相关问题