Hoe verschillende afhankelijkheden voor verschillende productaroma’s te definiëren

Ik converteer een van mijn apps naar Gradle en wil de nieuwe build-smaakfuncties gebruiken om een ​​betaalde en een gratis op advertenties gebaseerde smaak te hebben.

Ik wil dat alleen de op advertenties gebaseerde versie afhankelijk is van de admob-SDK.

Mijn buildbestand ziet er als volgt uit:

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

Is er een manier om de afhankelijkheid in de gratis product-smaak te configureren om een ​​eigen libs-map te hebben die wordt samengevoegd met de hoofdmap libs die algemene bibliotheken voor beide smaken bevat?

Als dit mogelijk is, hoe zou ik deze map dan definiëren?


Antwoord 1, autoriteit 100%

Om een ​​smaakspecifieke afhankelijkheid te definiëren, kunt u proCompilegebruiken in plaats van compilein uw afhankelijkheidssectie. Wanneer u gradle-eigenschappen uitvoert, krijgt u een overzicht van automatisch gemaakte configuraties.

Het juiste buildbestand ziet er als volgt uit:

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

Antwoord 2, autoriteit 19%

Snel vooruit naar medio 2018. U moet flavorDimensionstoevoegen.

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

Let ook op:

Configuratie ‘compileren’ is verouderd en is vervangen door
‘implementatie’ en ‘api’. Het wordt eind 2018 verwijderd. Voor
meer informatie zie:
http://d.android.com/r/tools/update-dependency -configurations.html


Antwoord 3, autoriteit 6%

Je moet voor elke smaak handmatig een configuratie toevoegen. Voorbeeld

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

Antwoord 4, autoriteit 5%

Eenvoudig:

dependencies {
    ....
    ....

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

    ....
    ....
}

of gewoon:

FreeImplementation 'com.google.android.gms:play-services-ads:17.2.0'

Antwoord 5, autoriteit 4%

Bewerken:ik raad aan om een ​​van de andere technieken te gebruiken!

Een alternatief voor het geaccepteerde antwoord is dit:

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

Antwoord 6

Als je Gradle met Kotlin gebruikt, kunnen afhankelijkheden voor aangepaste smaken als volgt worden toegevoegd:

dependencies {
    "freeImplementation"("com.google.android.gms:play-services-ads:7.5.0")
}

Other episodes