私のアプリには、いくつかの市場のアプリ内課金システム用のいくつかのフレーバーがあります。
すべてのプロジェクトの基本コードを共有する単一のライブラリがあります。そこで、これらの支払いシステムを製品フレーバーとしてこのライブラリに追加することにしました。
問題は、Androidライブラリに製品フレーバーを含めることができるかどうかです。
その場合、アプリの各フレーバーに異なるフレーバーを含めるにはどうすればよいですか?
よく検索しましたが、このシナリオについては何も見つかりませんでした。私が見つけた唯一の近いものは http://tools.Android.com/tech-docs/new-build-system/user-guide にありました:
dependencies {
flavor1Compile project(path: ':lib1', configuration: 'flavor1Release')
flavor2Compile project(path: ':lib1', configuration: 'flavor2Release')
}
設定を別のものに変更しましたが、うまくいきませんでした!
Android studio 0.8.2を使用しています。
最後にこれを行う方法を見つけました。同じ問題に直面している他の人のためにここで説明します。
重要な部分は、ライブラリbuild.gradleでpublishNonDefaultをtrueに設定することです。その後、ユーザーガイドの提案に従って依存関係を定義する必要があります。
プロジェクト全体は次のようになります。
ライブラリbuild.gradle:
apply plugin: 'com.Android.library'
Android {
....
publishNonDefault true
productFlavors {
market1 {}
market2 {}
}
}
project build.gradle:
apply plugin: 'com.Android.application'
Android {
....
productFlavors {
market1 {}
market2 {}
}
}
dependencies {
....
market1Compile project(path: ':lib', configuration: 'market1Release')
market2Compile project(path: ':lib', configuration: 'market2Release')
}
これで、アプリフレーバーと[ビルドバリアント]パネルを選択でき、それに応じてライブラリが選択され、選択したフレーバーに基づいてすべてのビルドと実行が行われます。
ライブラリAndroidに基づいた複数のアプリモジュールがある場合、Studioはバリアントの選択の競合について不平を言いますが、無視してかまいません。
ALi answerには1つの問題があります。ビルドバリアントでは、非常に重要な1つの側面が失われています。すべてのオプションが必要な場合(私の例では4(2 x 2)以下)、main module build.gradleファイルにcustom構成を追加するだけです。 Build Variants
ですべてのマルチフレーバーmulti-buildTypeを使用できるようにします。また、library module build.gradleファイルでpublishNonDefault trueを設定する必要があります。
ソリューション例:
Lib build.gradle
Android {
publishNonDefault true
buildTypes {
release {
}
debug {
}
}
productFlavors {
free {
}
paid {
}
}
}
アプリbuild.gradle
Android {
buildTypes {
debug {
}
release {
}
}
productFlavors {
free {
}
paid {
}
}
}
configurations {
freeDebugCompile
paidDebugCompile
freeReleaseCompile
paidReleaseCompile
}
dependencies {
freeDebugCompile project(path: ':lib', configuration: 'freeDebug')
paidDebugCompile project(path: ':lib', configuration: 'paidDebug')
freeReleaseCompile project(path: ':lib', configuration: 'freeRelease')
paidReleaseCompile project(path: ':lib', configuration: 'paidRelease')
}
Androidプラグイン3.0.0以降の更新
公式のAndroidドキュメントによれば- ローカルモジュールの依存関係設定を移行する 、
バリアント対応の依存関係の解決により、ローカルモジュールの依存関係にfreeDebugImplementationなどのバリアント固有の構成を使用する必要がなくなりました。プラグインがこれを処理します
代わりに、次のように依存関係を構成する必要があります。
dependencies {
// This is the old method and no longer works for local
// library modules:
// debugImplementation project(path: ':library', configuration: 'debug')
// releaseImplementation project(path: ':library', configuration: 'release')
// Instead, simply use the following to take advantage of
// variant-aware dependency resolution. You can learn more about
// the 'implementation' configuration in the section about
// new dependency configurations.
implementation project(':library')
// You can, however, keep using variant-specific configurations when
// targeting external dependencies. The following line adds 'app-magic'
// as a dependency to only the "debug" version of your module.
debugImplementation 'com.example.Android:app-magic:12.3'
}
アリの答えで
dependencies {
....
market1Compile project(path: ':lib', configuration: 'market1Release')
market2Compile project(path: ':lib', configuration: 'market2Release')
}
に
implementation project(':lib')
また、プラグインはバリアント固有の構成を自動的に処理します。他の人がAndroid Studioプラグインを3.0.0以降にアップグレードするのに役立つことを願っています。
フレーバーをAARライブラリーで機能させるには、Android Libraryモジュールのbuild.gradleファイルでdefaultPublishConfigを定義する必要があります。
詳細については、 Library Publication を参照してください。
図書館出版
デフォルトでは、ライブラリはリリースバリアントのみを公開します。このバリアントは、自身がどのバリアントをビルドするかに関係なく、ライブラリを参照するすべてのプロジェクトで使用されます。これはGradleの制限による一時的な制限であり、削除に向けて取り組んでいます。どのバリアントを公開するかを制御できます。
Android {defaultPublishConfig "debug"}
この公開構成名は完全なバリアント名を参照していることに注意してください。リリースとデバッグは、フレーバーがない場合にのみ適用可能です。フレーバーの使用中にデフォルトの公開されたバリアントを変更する場合は、次のように記述します。
Android {defaultPublishConfig "flavor1Debug"}
私のAndroidプラグインは3.4.0であり、今は設定が不要であることがわかります。必要なのは、アプリケーションのflavorDimensionsとproductFlavorsに、ライブラリ内の同じflavorDimensionsとproductFlavorsの1つのproductFlavorが含まれていることを確認することですサンプルの場合:
Mylibraryのbuild.gradle
apply plugin: 'com.Android.library'
Android {
....
flavorDimensions "mylibFlavor"
productFlavors {
market1
market2
}
}
アプリケーションのbuild.gradle:
apply plugin: 'com.Android.application'
Android {
....
flavorDimensions "mylibFlavor", "appFlavor"
productFlavors {
market1 {
dimension "mylibFlavor"
}
market2 {
dimension "mylibFlavor"
}
common1 {
dimension "appFlavor"
}
common2 {
dimension "appFlavor"
}
}
}
dependencies {
....
implementation project(path: ':mylibrary')
}
また、さまざまなオプションのモジュールをコンパイルする際に問題が発生しました。
私が見つけたもの:
Gradle 3.0.1なので、publishNonDefault true
をlibのbuild.gradle
ファイルに追加する必要はないようです。
クラスを逆コンパイルした後BaseExtension
はこれを見つけました:
public void setPublishNonDefault(boolean publishNonDefault) {
this.logger.warn("publishNonDefault is deprecated and has no effect anymore. All variants are now published.");
}
そして代わりに:
dependencies {
...
Compile project(path: ':lib', configuration: 'config1Debug')
}
以下を使用する必要があります。
dependencies {
...
implementation project(':lib')
}
重要なことは、configurations {...}
部分をbuild.gradle
に追加することだけです。
したがって、アプリのbuild.gradle
ファイルの最終的なバリアントは次のとおりです。
buildTypes {
debug {
...
}
release {
...
}
}
flavorDimensions "productType", "serverType"
productFlavors {
Free {
dimension "productType"
...
}
Paid {
dimension "productType"
...
}
Test {
dimension "serverType"
...
}
Prod {
dimension "serverType"
...
}
}
configurations {
FreeTestDebug
FreeTestRelease
FreeProdDebug
FreeProdRelease
PaidTestDebug
PaidTestRelease
PaidProdDebug
PaidProdRelease
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation project(':lib')
...
}
また、 Filter variant を使用してビルドバリアントを制限できます。
追伸次のように、settings.gradle
ファイルにモジュールを含めることを忘れないでください。
include ':app'
include ':lib'
project(':lib').projectDir = new File('app/libs/lib')
私はこの主題が閉じられていることを知っていますが、gradle 3.0の更新だけです、これを参照してください: https://developer.Android.com/studio/build/gradle-plugin-3-0-0-migration.html #variant_aware and grep matchingFallbacks
and missingDimensionStrategy
。モジュールフレーバー間の依存関係を宣言するのがより簡単になりました。
...そしてgradle3.0のこの正確なケースでは、フレーバーは同じ名前を共有しているため、gradleはそれらを魔法のようにマップし、構成は必要ありません。