web-dev-qa-db-ja.com

Android Gradleのマルチフレーバーライブラリに基づくマルチフレーバーアプリ

私のアプリには、いくつかの市場のアプリ内課金システム用のいくつかのフレーバーがあります。

すべてのプロジェクトの基本コードを共有する単一のライブラリがあります。そこで、これらの支払いシステムを製品フレーバーとしてこのライブラリに追加することにしました。

問題は、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を使用しています。

96
Ali

最後にこれを行う方法を見つけました。同じ問題に直面している他の人のためにここで説明します。

重要な部分は、ライブラリ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はバリアントの選択の競合について不平を言いますが、無視してかまいません。

enter image description here

135
Ali

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')

}
34
AppiDevo

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 St​​udioプラグインを3.0.0以降にアップグレードするのに役立つことを願っています。

15
Harsh4789

フレーバーをAARライブラリーで機能させるには、Android Libraryモジュールのbuild.gradleファイルでdefaultPublishConfigを定義する必要があります。

詳細については、 Library Publication を参照してください。

図書館出版

デフォルトでは、ライブラリはリリースバリアントのみを公開します。このバリアントは、自身がどのバリアントをビルドするかに関係なく、ライブラリを参照するすべてのプロジェクトで使用されます。これはGradleの制限による一時的な制限であり、削除に向けて取り組んでいます。どのバリアントを公開するかを制御できます。

Android {defaultPublishConfig "debug"}

この公開構成名は完全なバリアント名を参照していることに注意してください。リリースとデバッグは、フレーバーがない場合にのみ適用可能です。フレーバーの使用中にデフォルトの公開されたバリアントを変更する場合は、次のように記述します。

Android {defaultPublishConfig "flavor1Debug"}

2
David Lev

私の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')
}

同期後、Build Variantsウィンドウですべてのオプションを切り替えることができます: enter image description here

1
JiajiaGu

現時点では不可能ですが、追加したい機能を正しく思い出せば。 (編集2: linklink2

編集:今のところ、defaultPublishConfigオプションを使用して、どのライブラリバリアントを公開するかを宣言しています。

Android {
    defaultPublishConfig fullRelease
    defaultPublishConfig demoRelease 
}
1
Delblanco

また、さまざまなオプションのモジュールをコンパイルする際に問題が発生しました。

私が見つけたもの:

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')
1
Sergio

私はこの主題が閉じられていることを知っていますが、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はそれらを魔法のようにマップし、構成は必要ありません。

1
AlexG