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?

Janusz
quelle
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'
}
Rene Groeschke
quelle
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

user1506104
quelle
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'
}
Arkadiusz Konior
quelle
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.+'
    }
Jordy
quelle
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'
nnyerges
quelle