Як визначити різні залежності для різних смаків продукту


153

Я перетворюю одну з моїх програм у Gradle і хотів би використовувати нові функції аромату побудови, щоб мати платний та безкоштовний аромат на основі оголошень.

Я хочу, щоб лише версія на основі реклами залежала від пакета 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блоком. Як інтуїтивно зрозумілий.
nmr

14
Зауважте, що xxxCompileзакриття, яке створює Gradle, не працюватиме, якщо назва аромату починається з великої літери.
Джаретт Міллард

2
"packageName" має бути "applicationId"
Apperside

7
Як вам вдається не викликати класи оголошень?
Джаред Берроуз

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

Також врахуйте:

Конфігурація "компілювати" застаріла і була замінена на "реалізація" та "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 версій?
koppor

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
це не дозволяє створити кілька ароматів одночасно, що є своєрідним вимикачем угод для більшості з нас. Крім того, це може не працювати і з андроїд-студією
Rene Groeschke

3
це в блоці залежностей?
користувач1743524

2
Чи цей блок залежить від залежності?
Каракаго

хм ... не гарно масштабує 10 чи 50 смаків?
Евокс

@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.