web-dev-qa-db-ja.com

Gradle:ライブラリの特定のフレーバーに依存関係を追加します

ライブラリプロジェクトとアプリケーションがあります。ライブラリとアプリケーションの両方に2つの製品フレーバー(storedev)が必要です。アプリケーションの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/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')
}

この状況では、次のエラーが発生します:Error:(12、23)指定された名前(値 '@ string/app_name'の 'text')に一致するリソースが見つかりません。 app_nameは、ライブラリのstring.xmlで定義されています(mainstoreディレクトリの両方で)

ProductFlavorsをライブラリから削除すると、ビルドされますが、常にvalues.xmlmainディレクトリから使用します

40
amarkovits

ライブラリでは、すべてのバリアントを作成するたびにgradleに指示する必要があります。

Android {
    publishNonDefault true
}

その後、アプリケーションで、最近推測したので、これを行うことができます:

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

Library Publication の下の公式ドキュメントにあります。

編集:

バージョン .14.3(2014/11/18) 以降、Flavor-buildType-Compileディレクティブも使用できるようになりました。

Build.gradleで、Android {}スコープの前に以下を追加します。

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以降、モジュール間の依存関係管理が変更されました。アプリとそれが依存するライブラリ/モジュールの間でフレーバーを自動的に一致させようとします。

説明全体のドキュメント !を参照してください!

54
galex

各フレーバーに特定の依存関係を定義するには、「compile」の代わりに「nameOfTheFlavorCompile」を使用できます

dependencies {
    storeCompile project(':lib')
}
5
user3543470

少し前に同様の問題が発生しましたが、コンパイラプロジェクトがライブラリプロジェクトの製品フレーバーを無視するということが起こります。さらに、ビルドタイプを追加しても、リリース/デバッグソースを探してコンパイルし続けます。

理由は簡単です:

  • 製品のフレーバーは、ライブラリプラグインではサポートされていません。
  • サポートされている唯一のビルドタイプは、デバッグとリリースのようです。

コンパイラはneverライブラリプロジェクトのストアディレクトリにあるものを探します。だから、あなたはそれを回避する方法を見つける必要があります。

回避策の1つは、ライブラリに抽象化レベルの両方の実装を(インターフェイス、複数のコンストラクターなどを介して)含め、アプリプロジェクトでライブラリのどの部分を実行するかを決定できるようにすることです。 proguardを使用する場合、十分に分離されていれば(そして場合によっては分離されていなくても)不要なコードを自動的に取り除きます。

2
Hessan Feghhi