異なる製品フレーバーの異なる依存関係を定義する方法


153

アプリの1つをGradleに変換しています。新しいビルドフレーバー機能を使用して、有料および無料の広告ベースのフレーバーを作成したいと考えています。

広告ベースのバージョンのみがadmob SDKに依存するようにしたい。

私のビルドファイルは次のようになります。

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.5.+'
    }
}
apply plugin: 'android'

repositories {
    mavenCentral()
}

android {
    compileSdkVersion 18
    buildToolsVersion "18.0.1"

    defaultConfig {
        minSdkVersion 10
        targetSdkVersion 18
    }

    productFlavors {
        Pro {
            packageName "de.janusz.journeyman.zinsrechner.pro"
        }
        Free { 
            dependencies {

            }
        }
    }
}

dependencies {
    compile 'com.android.support:support-v4:18.0.+'
    compile 'com.actionbarsherlock:actionbarsherlock:4.4.0@aar'
    compile fileTree(dir: 'libs', include: '*.jar')
}

無料の製品フレーバーに依存関係を設定して、両方のフレーバーの一般的なライブラリを含むメインのlibsフォルダーとマージされる独自のlibsフォルダーを設定する方法はありますか?

これが可能な場合、このフォルダをどのように定義しますか?


このスレッドを参照してください。stackoverflow.com/questions/24860659/...
アリ

回答:


190

フレーバー固有の依存関係を定義するproCompilecompileは、依存関係セクションの代わりに使用できます。Gradleプロパティを実行すると、自動作成された構成の概要が表示されます。

正しいビルドファイルは次のようになります。

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.2.3'
    }
}
apply plugin: 'com.android.application'

repositories {
    mavenCentral()
}

android {
    compileSdkVersion 22
    buildToolsVersion "22.0.1"

    defaultConfig {
        minSdkVersion 10
        targetSdkVersion 22
    }

    productFlavors {
        pro {
            packageName "de.janusz.journeyman.zinsrechner.pro"
        }
        free { }
    }
}

dependencies {
    compile 'com.android.support:support-v4:22.2.0'
    freeCompile 'com.google.android.gms:play-services-ads:7.5.0'
}

2
私はこれを試してこのエラーを取得していますError:(28, 0) Build script error, unsupported Gradle DSL method found: 'glassCompile()'!(依存関係を追加しようとしているフレーバーは「ガラス」です。)
nmr

19
ああ、dependenciesブロックをブロックの下に移動する必要があるようですandroid。直感的です。
nmr

14
xxxCompileフレーバー名が大文字で始まる場合、Gradleが生成するクロージャーは機能しないことに注意してください。
Jarett Millard、2015

2
「packageName」は「applicationId」である必要があります
Apperside

7
Adクラスを呼び出さないようにするにはどうすればよいですか?
Jared Burrows、2015年

26

2018年半ばまで早送りします。追加する必要がありflavorDimensionsます。

android {
    ...
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

    flavorDimensions "dimensionName"
    productFlavors {
        pro {
            dimension "dimensionName"
        }
        free {
            dimension "dimensionName"
        }
    }
}

dependencies {
    implementation 'com.android.support:support-v4:22.2.0'
    freeImplementation 'com.google.android.gms:play-services-ads:15.0.1'
}

また、注意してください:

構成 'compile'は廃止され、 'implementation'および 'api'に置き換えられました。2018年末に削除されます。詳細については、http//d.android.com/r/tools/update-dependency-configurations.htmlをご覧ください。


代わりにbuildVariantsでそれを行う方法を知っていますか?proDebugImplementationのように。
Leandro Ocampo

1
これについては別の質問を追加してください。コメント欄にリンクしてください。達成しようとしていることの完全な詳細を追加してください。:)
user1506104

11

各フレーバーの設定を手動で追加する必要があります。例

configurations {
    proCompile
    freeCompile
}

dependencies {
    compile 'com.parse.bolts:bolts-tasks:1.3.0'

    proCompile 'com.android.support:design:23.1.1'
    freeCompile 'com.parse:parse-android:1.12.0'
}

1
そこからどうやって行くの?異なる構成をアクティブにする方法は?これはAndroidビルドのみに適用されますか?Android以外のビルドでそれは可能ですか?
koppor

9

編集:他のテクニックの1つを使用することをお勧めします!

受け入れられた答えの代わりはこれです:

    ext {
        flavorType = ""
    }


    gradle.startParameter.getTaskNames().each { task ->

        if(task.contains("flavor1")){
            flavorType = "flavor1"
        } else if (task.contains("flavor2")){
            flavorType = "flavor2"
        } else {
            flavorType = "flavor3"
        }

    }

 if(flavorType == 'flavor1' || flavorType == 'flavor2') {
        compile 'com.android.support:support-v4:18.0.+'
    }

2
これは、一度に複数のフレーバーを構築することを許可しません。これは、ほとんどの人にとって取引ブレーカーのようなものです。さらに、Androidスタジオでもうまく機能しない可能性があります
Rene Groeschke 2015年

3
これは依存関係ブロックにありますか?
user1743524 2016年

2
このブロックは依存関係にありますか?
カラカゴ2016

うーん... 10または50のフレーバーでうまくスケーリングしませんか?
Ewoks 2017年

@Ewoks私はたくさんのフレーバーを作るのが好きですが、もっと良いアイデアはありますか?
Vikash Parajuli

6

シンプル:

dependencies {

    ....
    ....

    gradle.startParameter.getTaskNames().each { task ->
        if(task.contains("free")) {
             implementation 'com.google.android.gms:play-services-ads:17.2.0'
        }
    }

    ....
    ....
}

あるいは単に:

FreeImplementation 'com.google.android.gms:play-services-ads:17.2.0'
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.