Как определить разные зависимости для разных вкусов продукта

153

Я конвертирую одно из моих приложений в 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

Чтобы определить специфическую для вкуса зависимость, вы можете использовать proCompileее compileв разделе зависимостей. Когда вы запускаете свойства 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блока. Как интуитивно понятно.
мр
14
Обратите внимание, что xxxCompileзамыкания, которые генерирует Gradle, не будут работать, если имя аромата начинается с заглавной буквы.
Джаретт Миллард
2
«packageName» должно быть «applicationId»
Apperside
7
Как вы справляетесь с тем, чтобы не вызывать классы объявлений?
Джаред Барроуз,
27

Перенесемся в середину 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' устарела и была заменена на 'реализация' и 'api'. Он будет удален в конце 2018 года. Для получения дополнительной информации см .: http://d.android.com/r/tools/update-dependency-configurations.html

user1506104
источник
Вы знаете, как сделать это с buildVariants вместо этого? как proDebugImplementation.
Леандро Окампо
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 сборками?
Коппор
9

Изменить: я рекомендую использовать один из других методов!

Альтернатива принятому ответу такова:

    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
это не позволяет вам создавать несколько вкусов одновременно, что является своего рода прерывателем соглашения для большинства из нас. Кроме того, это может не очень хорошо работать с андроид-студией
Рене Грошке,
3
это в блоке зависимостей?
user1743524
2
Этот блок находится в зависимости?
Каракаго
хм ... плохо масштабируется с 10 или 50 ароматами, не так ли?
Ewoks
@Ewoks Я хочу сделать много ароматов, у тебя есть идея получше?
Викаш Параджули
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'
nnyerges
источник