在依赖项中选择特定的构建类型

时间:2018-06-09 06:24:10

标签: android android-gradle android-build

假设我有一个包含三种构建类型的Android应用程序:

buildTypes {
    release {
        ....
    }
    optRelease {
        ....
    }
    debug {
        ....
    }
}

我有一个依赖模块:

dependencies {
    implementation project(':myDependency')
}

假设这个依赖项只有两种构建类型(让我们说debugrelease),我想要完全控制我的哪个应用程序的构建类型使用哪个类型依赖关系的构建类型。例如,我希望我的应用optRelease使用图书馆的release,应用的release使用图书馆&debug #39; s dbca

在Android Studio 3.0之前曾经有过这种情况,但新的构建变体系统似乎不再允许这样做。

如何明确说明要使用的构建类型?让我们说我无法控制依赖关系,也无法修改其gradle配置。

5 个答案:

答案 0 :(得分:4)

您可以使用matchingFallback

buildTypes {
    release {
       matchingFallbacks = ['debug']
       ... 
    }
    optRelease {
       matchingFallbacks = ['release']  
       ...
    }
    debug {
       matchingFallbacks = ['debug']  
       ...
    }
}

您还可以按如下方式指定回退列表:

optRelease {
    matchingFallbacks = ['release','debug']  
}
  

这将指定回退构建类型的排序列表   当依赖项不包含a时,插件应该尝试使用   " optRelease"构建类型。您可以指定尽可能多的后备   喜欢和插件选择可用的第一个构建类型   依赖

您可以参考HERE了解详情。

但是,如果要在定位外部依赖项时使用特定于变体的配置。你可以这样做:

debugImplementation project(':myDependency')

这将使myDependency仅依赖于" debug"你的模块的版本。

答案 1 :(得分:1)

非常感谢ahasbini您的解决方案。从ahasbini's复制this thread回答,以便于参考解决方案。

  

您需要使用Android Gradle指定matchingFallback   插件的插件3.0.0知道哪种后备构建类型   在使用应用程序代码进行编译时使用的库   库中找不到应用中定义的构建类型。

buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
    debug {
        applicationIdSuffix '.debug'
    }
    staging {
        initWith release
        applicationIdSuffix '.staging'
        matchingFallbacks = ['release']
    }
}
     

此处有更多信息:Migrate to Android Plugin for Gradle 3.0.0.

答案 2 :(得分:1)

如果要为结合了产品风味和构建类型的变体添加依赖项,则必须在配置块中初始化配置名称。(如果想为自定义的buildTypes来添加依赖项,需要配置configurations {})

android {
    buildTypes {
        release {
            ....
        }
        optRelease {
            ....
        }
        debug {
            ....
        }
    }
}

configurations {
    // Initializes a placeholder for the optReleaseImplementation dependency configuration
    optReleaseImplementation {}
}

dependencies {
        debugImplementation xxx
        // Then it can work
        optReleaseImplementation xxx
        releaseImplementation xxx
    }

答案 3 :(得分:0)

从gradle 3.0.0开始,您可以使用以下默认项目变体(发布,调试,测试等)

  • 实施
  • releaseImplementation
  • testImplementation
  • debugImplementation
  • androidTestImplementation

简单的例子是:

android {
   ....
}
dependencies {
    implementation "com.google.dagger:dagger-android-support:$DAGGER_VERSION"
    androidTestImplementation jUnit
    testImplementation mockito
}

如果您的应用程序有多种风格,从3.0开始,您必须首先声明风味维度,在默认配置中定义回退和匹配策略(对于远程依赖项和没有维度的依赖项),gradle将识别应该是哪些依赖项包括那种味道。 有关详细信息,请查看this迁移指南。

答案 4 :(得分:0)

我所做的是:

创建的产品风味类似于创建构建类型:

    android {
        flavorDimensions 'tier'
        compileSdkVersion 27
        defaultConfig {
            applicationId "com.example.sample"
            minSdkVersion 15
            targetSdkVersion 27
        }

        buildTypes {
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
                --------------
            }
            debug {
                debuggable true
            }
        }
        productFlavors {
            qc {
                applicationIdSuffix ".qc"
                dimension "tier"

            }
            production {
                applicationIdSuffix ".production"
                dimension "tier"
            }
        }
    }

允许依赖项选择如下的构建类型

dependencies { 
    qcDebugCompile project(path: ':libName', configuration: "debug") 
    qcReleaseCompile project(path: ':libName', configuration: "release") 
    productionDebugCompile project(path: ':libName', configuration: "debug") 
    productionReleaseCompile project(path: ':libName', configuration: "release") 
... 
} 

enter image description here