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


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


Вы знаете, как сделать это с 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'
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.