如何根据构建变体使用 gradle 不同依赖模块的依赖项进行编译?

Posted

技术标签:

【中文标题】如何根据构建变体使用 gradle 不同依赖模块的依赖项进行编译?【英文标题】:How to compile with gradle different dependency module's dependencies based on build variants? 【发布时间】:2017-09-09 10:17:45 【问题描述】:

我有一个具有模块依赖关系的 android 应用程序。这个模块本身有一个 jar 库作为依赖项,它有两个变体,每个变体都与主应用程序的构建变体相关。当我在主应用程序中切换构建变体时,我设法自动选择了模块的构建变体,它选择了正确的 jar,但这没有反映在代码中,在构建变体特定代码中找不到来自 jar 的特定类.

以下是主应用程序和依赖模块的 build.gradle 文件中的相关代码:

主应用 - build.gradle

buildTypes 
    type1 initWith(debug)
    type2 initWith(debug)


productFlavors 
    live
    test


dependencies 
    type1Compile project(path: ':module', configuration: 'one')
    type2Compile project(path: ':module', configuration: 'two')

模块 - build.gradle

android 
    compileSdkVersion 25
    buildToolsVersion "25.0.2"
    useLibrary 'org.apache.http.legacy'
    publishNonDefault true

defaultConfig 
    minSdkVersion 14
    targetSdkVersion 22


buildTypes 
    release 
        minifyEnabled = false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 
            'proguard-rules.pro'
    
    one initWith(release)
    two initWith(release)



dependencies 
    oneCompile files('libs/versionOne/mylib.jar')
    twoCompile files('libs/versionTwo/mylib.jar')

因此,当我构建 testType1 变体时,Android Studio 会自动选择 one 变体,并且通过干净的构建一切正常。但是如果我切换到testType2,尽管选择了模块的two 变体,编辑器会突出显示缺失的类和方法。

当我在应用的构建变体之间切换时,如何让 gradle 选择正确的 jar?

一些注意事项: 该模块需要该库,因为它使用了两个版本之间通用的一些类。 我知道这可能看起来像是糟糕的项目设计,但它是由不同人在不同时期构建的应用程序,我现在必须“按原样”开发它。

【问题讨论】:

你可以尝试在 gradle 中使用排除关键字 怎么样?似乎不是这样,因为没有什么可以排除的,我只需要交替选择两个不同的文件依赖项 the editor will highlight missing classes and methods 为什么?究竟缺少哪些课程? 首先让你的应用依赖两个相同的依赖是不正确的,尤其是当差异是版本时 @azizbekian 换句话说,Type1 使用仅存在于 jar One 中的类,Type2 使用仅存在于 jar 2 中的类。当我切换构建变体时,Type2 类找不到 jarTwo 对象,因为 gradle 没有加载 jar 二,虽然模块的构建二已经执行。 【参考方案1】:

经过一番修修补补,我找到了一些线索。首先,我的两个罐子同名,在不同的文件夹中。在重命名 jar 以具有不同的名称后,gradle 设法在构建变体切换后选择正确的,前提是完成了一个额外的“与 gradle 文件同步项目”。所以现在它不是立竿见影的,但最终它会起作用。

【讨论】:

以上是关于如何根据构建变体使用 gradle 不同依赖模块的依赖项进行编译?的主要内容,如果未能解决你的问题,请参考以下文章

在 Gradle 中为 Android 中的库项目构建变体

用于仅测试依赖项的 Gradle 变体感知依赖项管理

Gradle for Android 第三篇( 依赖管理 )

Android Gradle 插件Android 依赖管理 ⑤ ( Gradle 依赖优化 | 命令行查看依赖模块 | 依赖冲突问题 | 依赖传递冲突 | 分库冲突 | 依赖分组不同导致冲突 )

转载Gradle for Android 第四篇( 构建变体 )

如何在 gradle kts 中排除(忽略)android 构建变体