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

ama*_*its 41 android gradle library-project android-productflavors

我有一个图书馆项目和一个应用程序.我想为图书馆和应用程序提供2种产品口味(商店,开发).当我为应用程序构建商店风味时,我想使用库中的商店风味.此外,当我为应用程序构建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'])
}
Run Code Online (Sandbox Code Playgroud)

我有这些文件:src/main/res/values/strings.xml和src/store/res/values/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')
}
Run Code Online (Sandbox Code Playgroud)

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

如果我删除从它建立图书馆的productFlavors但始终使用values.xml目录

gal*_*lex 55

在您的库中,您需要告诉gradle每次每个变体都要构建:

android {
    publishNonDefault true
}
Run Code Online (Sandbox Code Playgroud)

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

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

图书馆出版物的官方文件中找到.

编辑:

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

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

configurations {
    devDebugCompile
    devReleaseCompile
    storeDebugCompile
    storeReleaseCompile
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以根据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') 
}
Run Code Online (Sandbox Code Playgroud)

编辑:

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

有关完整说明,请参阅文档!

  • 任何想法如何这样做devDebug使用devDebug,devRelease使用devRelease(在这种情况下没有意义,但对我的用例有用)? (3认同)

小智 5

要为每个flavor定义特定的依赖项,可以使用"nameOfTheFlavorCompile"而不是"compile"

dependencies {
    storeCompile project(':lib')
}
Run Code Online (Sandbox Code Playgroud)