Gradle:为库的特定风格添加依赖项

时间:2014-06-24 14:21:17

标签: android gradle library-project android-productflavors

我有一个图书馆项目和一个应用程序。我想为库和应用程序提供2种产品风格( store dev )。当我为应用程序构建 store 风格时,我想使用库中的 store 风格。此外,当我为应用程序构建 dev 风格时,我想使用库中的 dev 风格。我尝试为库和应用程序设置相同的产品风格,但它不起作用。

这是我的配置:

apply plugin: 'android-library'

android {
    compileSdkVersion 19
    buildToolsVersion "19.1.0"

    defaultConfig {
        applicationId "ro.amarkovits.graddletest.lib"
        minSdkVersion 14
        targetSdkVersion 19
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            runProguard false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    productFlavors{
        store{

        }
        dev{

        }
    }

}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
}

我有这个文件: 的src /主/ RES /值/ strings.xml中 和 SRC /存储/ RES /值/ strings.xml中

应用

apply plugin: 'android'

android {
    compileSdkVersion 19
    buildToolsVersion '19.1.0'
    defaultConfig {
        applicationId 'ro.amarkovits.mymodule.app'
        minSdkVersion 14
        targetSdkVersion 19
        versionCode 1
        versionName '1.0'
    }
    buildTypes {
        release {
            runProguard false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    productFlavors{
        store{

        }
        dev{

        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile project(':lib')
}

在这种情况下,我收到此错误:错误:(12,23)找不到与给定名称匹配的资源(在'文本'值为' @ string / app_name') 。 app_name 在库中的 string.xml 中定义(在商店目录中)

如果我从它构建的库中删除productFlavors,但总是使用 main 目录中的 values.xml

3 个答案:

答案 0 :(得分:54)

在你的图书馆中,你需要告诉gradle每次变种时都要建立:

android {
    publishNonDefault true
}

然后在你的应用程序中,从最近我猜,你可以这样做:

dependencies {
    (...)
    devCompile project(path: ':lib', configuration: 'devDebug') // or 'devRelease'
    storeCompile project(path: ':lib', configuration: 'storeRelease') // or 'storeDebug'
}

Library Publication下的官方文档中找到。

编辑:

从版本0.14.3 (2014/11/18)开始,您现在也可以使用Flavor-buildType-Compile指令:

在android {}范围之前的build.gradle中添加以下内容:

configurations {
    devDebugCompile
    devReleaseCompile
    storeDebugCompile
    storeReleaseCompile
}

然后,您可以根据Flavor-BuildType声明并使用不同版本的库:

dependencies {
    (...)
    devDebugCompile project(path: ':lib', configuration: 'devDebug')
    devReleaseCompile project(path: ':lib', configuration: 'devRelease')
    storeDebugCompile project(path: ':lib', configuration: 'storeDebug')
    storeReleaseCompile project(path: ':lib', configuration: 'storeRelease') 
}

编辑:

Android Gradle Plugin 3.0.0 以来,模块之间的依赖关系管理已发生变化。它会自动尝试匹配您的应用程序与其所依赖的库/模块之间的风格。

请参阅documentation for the whole explanation

答案 1 :(得分:5)

为您可以使用的每种口味定义特定的依赖关系&name; nameOfTheFlavorCompile"而不是"编译"

dependencies {
    storeCompile project(':lib')
}

答案 2 :(得分:2)

我前一段时间遇到过类似问题,但是编译器会忽略库项目的产品风格。此外,即使您添加了更多构建类型,它也会继续查找和编译发布/调试源。

原因很简单:

  • 库插件不支持产品风格。
  • 支持的唯一构建类型似乎是调试和发布。

编译器将从不查找您放入库项目的商店目录中的任何内容。所以,你需要找到解决方法。

它的一种方法是在库中包含两个具有抽象级别的实现(通过接口,多个构造函数等),然后让您的应用程序项目决定运行库的哪个部分。如果你使用proguard,它会自动消除不需要的代码,如果它足够分离(即使它不是这样的话也可能如此)。