基于构建类型和Flavor的Gradle依赖项

58

我有几种构建类型:debugrelease。我还有两个口味:pubdev

pub口味的应用程序依赖于一个pub库,同样的情况也适用于dev口味。 现在我想让debug构建类型的应用程序依赖于库的debug构建。以下内容不起作用:

pubReleaseCompile project(path: ':common', configuration: "pubRelease")
devReleaseCompile project(path: ':common', configuration: "devRelease")
pubDebugCompile project(path: ':common', configuration: "pubDebug")
devDebugCompile project(path: ':common', configuration: "devDebug")

注意:该库已设置为编译所有变体。

是否有一种方式可以基于风味和构建类型指定条件项目依赖关系?

编辑: 为了避免混淆,这里提供我当前使用的项目的相关build.gradle文件。

project/common/build.gradle(该库)

apply plugin: 'com.android.library'
apply plugin: 'com.jakewharton.hugo' // annotation-based code generated logs only in debug build

android {
  defaultPublishConfig "pubRelease"
  publishNonDefault true // four variants of the library are built

  buildTypes {
    debug {}
    release {
      minifyEnabled false
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
    }
  }
  productFlavors {
    pub {
      // custom build config fields
    }
    dev {
      // custom build config fields
    }
  }
}

dependencies {
  // ...
}

project/parent/build.gradle(使用该库的应用模块之一)

apply plugin: 'com.android.application'
apply plugin: 'com.jakewharton.hugo'

android {
  // ...

  signingConfigs {
    release {
      // ...
    }
  }

  buildTypes {
    release {
      signingConfig signingConfigs.release
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-project.txt'
      shrinkResources true
      minifyEnabled true
    }
    debug {
      versionNameSuffix '-debug'
    }
  }
  productFlavors {
    pub {
      // custom res values
    }
    dev {
      // custom res values
    }
  }
}

dependencies {
  // ...
  pubCompile project(path: ':common', configuration: "pubRelease")
  devCompile project(path: ':common', configuration: "devRelease")
}

你最终找到了如何做到这一点吗? - BillHaggerty
我非常愿意。 - BillHaggerty
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - BillHaggerty
@Theyouthis 请查看我的答案。完美运作。 - Eugen Pechanec
更详细的问答请参见:Android Gradle中基于多种风味库的多风味应用程序 - Top-Master
显示剩余3条评论
4个回答

56

Gradle 3.x.x的Android插件

构建插件3.x.x使用基于变体的依赖关系解析,因此应用程序模块的devDebug变体将自动使用其库模块依赖项的devDebug变体。回答这个问题,以上内容已足够:

implementation project(':common')

阅读更多请参考:https://developer.android.com/studio/build/dependencies.html#variant_aware

原始答案

我在这里找到了解决方案:https://github.com/JakeWharton/u2020/blob/master/build.gradle

关于为什么我的原始代码不足以满足要求的更多信息,请参见:https://code.google.com/p/android/issues/detail?id=162285

有效的解决方案:

configurations {
  pubDebugCompile
  devDebugCompile
  pubReleaseCompile
  devReleaseCompile
}

dependencies {
  pubReleaseCompile project(path: ':common', configuration: "pubRelease")
  devReleaseCompile project(path: ':common', configuration: "devRelease")
  pubDebugCompile project(path: ':common', configuration: "pubDebug")
  devDebugCompile project(path: ':common', configuration: "devDebug")
}

未来可能不需要手动配置:https://code.google.com/p/android/issues/detail?id=162285 - Nikita Barishok
我这里有一个相关的问题,但是还无法解决。 我已经尝试了你提出的建议,但仍然没有运气。 http://stackoverflow.com/questions/36156596/gradle-subproject-external-library-dependency-based-on-main-project-module-fla - Wayne
@Wayne,你必须定义构建类型和风味,然后使用此名称模式定义配置:“<flavour><BuildType>Compile”。你不能随意定义配置。 - Eugen Pechanec
@Eugen 也许我只是忘记了<BuildType>...我会尝试一下。 感谢您的帮助。您知道有一个具有示例的git项目吗? - Wayne
@Wayne 如果您不定义构建类型,则会隐含两种:debugrelease。您还必须在库中定义产品风格。假设您定义了fOnefTwo,那么您可以在库的依赖项中使用fOneCompilefTwoCompile。然后,您必须告诉编译器您要构建所有库配置(风格和构建类型的所有组合)。然后,您的应用程序模块可以依赖于fOneRelease等等。整个示例都已在问题中为您展示,请仔细阅读。 - Eugen Pechanec
1
截至今天,3.0.0链接似乎已经失效。这应该是新的链接:https://developer.android.com/studio/build/dependencies.html#variant_aware - superjos

5

首先,定义不同的构建类型:

buildTypes {
    pubRelease {
        //config
    }
    devRelease {
        //config
    }
}

创建一个仅在特定的buildType和flavor下执行的任务:
task pubReleaseTask << {
    //code
}

task devReleaseTask << {
    //code
}

您可以动态添加依赖项:
```html

您可以动态添加依赖项:

```
tasks.whenTaskAdded { task ->
    if (task.name == 'pubRelease') {
        task.dependsOn pubReleaseTask
    }
    if (task.name == 'devRelease') {
        task.dependsOn devReleaseTask 
    }
}

如果我执行 gradlew clean build,这样会一次性添加所有依赖吗? - Eugen Pechanec
两个问题:1) 关于更新:但是如果我进行完整构建,它将执行所有任务,因此第一个特定于flavor的任务将获得自己的依赖项,并且每个连续的特定于flavor的任务都将获得自己的依赖项以及已添加的任何内容。这是否正确? 2) 我应该在哪些任务上挂接新任务? - Eugen Pechanec
@EugenPechanec - 请查看更新后附有更多解释的答案。 - Mithun
我在 app modulebuild.gradle 最后添加了 这个,但无法编译,找不到库资源。你是从哪里获得 'pubRelease' 和 'devRelease' 任务名称的?项目中没有这样的任务。(非常感谢您的耐心等待。) - Eugen Pechanec
请注意,构建类型releasedebug,而flavorspubdev - Eugen Pechanec
错误:(364,0)在依赖项解析后无法更改配置“:app:compile”的依赖项。 - StarWind0

3

参考@dooplaye的示例,假设你只想在一个口味中编译leanback,你可以参考下面的代码片段:

applicationVariants.all { variant ->
    def flavorString = ""
    def flavors = variant.productFlavors
    for (int i = 0; i < flavors.size(); i++) {
        flavorString += flavors[i].name;
    }

    if (flavorString.equalsIgnoreCase("pubdeb")) {
        dependencies {
            compile('com.android.support:leanback-v17:22.2.1')
        }
    }
}

我遇到了这个错误:在依赖项解析后,无法更改配置“:app:compile”的依赖项。 - Dmytro Karataiev
1
已经有(并且在4年前就有了)一种标准的方法来做到这一点:dependencies { pubdebCompile('com.android.support:leanback-v17:22.2.1') } 这个问题要求你已经知道如何根据口味声明依赖关系。我投反对票。 - Eugen Pechanec

2
请看 多品种变体。 不应该使用buildTypes来实现此功能。 但是,您可以定义多个品种。
flavorDimensions "first", "second"

productFlavors {
    pub {
        flavorDimension "first"
    }
    dev {
        flavorDimension "first"
    }
    deb {
        flavorDimension "second"
    }
    rel {
        flavorDimension "second"
    }
}

然后你可以像这样向你的库添加依赖:

pubRelCompile project(path: ':common', configuration: "pubRel")
devRelCompile project(path: ':common', configuration: "devRel")
pubDebCompile project(path: ':common', configuration: "pubDeb")
devDebCompile project(path: ':common', configuration: "devDeb")

这将包括pubRelease库在应用程序的pubDebugpubRelease变体中。这已经是我正在使用的方式。我要找的是,在pubRelease应用程序中包含pubRelease库,在pubDebug应用程序中包含pubDebug库。 - Eugen Pechanec
重新编辑:无法这样做。只能使用buildTypes,之后我必须维护曾经是flavors的重复值。这不是一个选项。 - Eugen Pechanec
这将生成两倍的APK,但几乎没有任何收益。请查看我的解决方案和相关资源。 - Eugen Pechanec

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接