ライブラリプロジェクトとアプリケーションがあります。ライブラリとアプリケーションの両方に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/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で定義されています(mainとstoreディレクトリの両方で)
ProductFlavorsをライブラリから削除すると、ビルドされますが、常にvalues.xmlをmainディレクトリから使用します
ライブラリでは、すべてのバリアントを作成するたびに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以降、モジュール間の依存関係管理が変更されました。アプリとそれが依存するライブラリ/モジュールの間でフレーバーを自動的に一致させようとします。
説明全体のドキュメント !を参照してください!
各フレーバーに特定の依存関係を定義するには、「compile」の代わりに「nameOfTheFlavorCompile」を使用できます
dependencies {
storeCompile project(':lib')
}
少し前に同様の問題が発生しましたが、コンパイラプロジェクトがライブラリプロジェクトの製品フレーバーを無視するということが起こります。さらに、ビルドタイプを追加しても、リリース/デバッグソースを探してコンパイルし続けます。
理由は簡単です:
コンパイラはneverライブラリプロジェクトのストアディレクトリにあるものを探します。だから、あなたはそれを回避する方法を見つける必要があります。
回避策の1つは、ライブラリに抽象化レベルの両方の実装を(インターフェイス、複数のコンストラクターなどを介して)含め、アプリプロジェクトでライブラリのどの部分を実行するかを決定できるようにすることです。 proguardを使用する場合、十分に分離されていれば(そして場合によっては分離されていなくても)不要なコードを自動的に取り除きます。