So definieren Sie unterschiedliche Abhängigkeiten für unterschiedliche Produktvarianten


153

Ich konvertiere eine meiner Apps in Gradle und möchte die neuen Build-Flavour-Funktionen verwenden, um eine kostenpflichtige und kostenlose werbebasierte Flavour zu erhalten.

Ich möchte, dass nur die werbebasierte Version vom Admob SDK abhängt.

Meine Build-Datei sieht folgendermaßen aus:

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

Gibt es eine Möglichkeit, die Abhängigkeit in der kostenlosen Produktversion so zu konfigurieren, dass ein eigener libs-Ordner mit dem Hauptbibliotheksordner zusammengeführt wird, der allgemeine Bibliotheken für beide Varianten enthält?

Wenn dies möglich ist, wie würde ich diesen Ordner definieren?


Besuchen Sie diesen Thread: stackoverflow.com/questions/24860659/…
— Ali

Antworten:


190

Um eine geschmacksspezifische Abhängigkeit zu definieren, können Sie diese proCompileanstelle compileIhres Abhängigkeitsabschnitts verwenden. Wenn Sie Gradle-Eigenschaften ausführen, erhalten Sie einen Überblick über automatisch erstellte Konfigurationen.

Die richtige Build-Datei sieht folgendermaßen aus:

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
Ich versuche dies und erhalte diesen Fehler. Error:(28, 0) Build script error, unsupported Gradle DSL method found: 'glassCompile()'!(Der Geschmack, dem ich eine Abhängigkeit hinzufügen
— möchte

19
Ahh, es sieht so aus, als müssten Sie den dependenciesBlock unter den androidBlock bewegen . Wie intuitiv.
— nmr

14
Beachten Sie, dass die von xxxCompileGradle generierten Verschlüsse nicht funktionieren, wenn der Geschmacksname mit einem Großbuchstaben beginnt.
— Jarett Millard

2
"packageName" sollte "applicationId" sein
— Apperside

7
Wie gehen Sie damit um, die Anzeigenklassen nicht aufzurufen?
— Jared Burrows

25

Schneller Vorlauf bis Mitte 2018. Sie müssen hinzufügen 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'
}

Beachten Sie auch:

Die Konfiguration 'Kompilieren' ist veraltet und wurde durch 'Implementierung' und 'API' ersetzt. Es wird Ende 2018 entfernt. Weitere Informationen finden Sie unter: http://d.android.com/r/tools/update-dependency-configurations.html


Wissen Sie, wie es stattdessen mit buildVariants geht? wie proDebugImplementation.
— Leandro Ocampo

1
Bitte fügen Sie dazu eine separate Frage hinzu. verlinke es hier im Kommentarbereich. Bitte fügen Sie vollständige Details zu dem hinzu, was Sie erreichen möchten. :)
— user1506104

11

Sie müssen die Konfiguration für jede Variante manuell hinzufügen. Beispiel

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
Wie geht es weiter? Wie aktiviere ich die verschiedenen Konfigurationen? Gilt dies nur für den Android-Build? Ist das mit Nicht-Android-Builds möglich?
— Koppor

9

Bearbeiten: Ich empfehle eine der anderen Techniken!

Eine Alternative zur akzeptierten Antwort ist folgende:

    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
Das erlaubt Ihnen nicht, mehrere Geschmacksrichtungen gleichzeitig zu kreieren, was für die meisten von uns eine Art Deal Breaker ist. Außerdem funktioniert es möglicherweise nicht gut mit Android Studio
— Rene Groeschke

3
Dies ist im Abhängigkeitsblock?
— user1743524

2
Ist dieser Block abhängig?
— Karacago

hmm ... skaliert nicht gut mit 10 oder 50 Geschmacksrichtungen, oder?
— Ewoks

@Ewoks Ich muss viele Aromen machen, hast du eine bessere Idee?
— Vikash Parajuli

6

Einfach:

dependencies {

    ....
    ....

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

    ....
    ....
}

oder nur:

FreeImplementation 'com.google.android.gms:play-services-ads:17.2.0'
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.