Farklı ürün lezzetleri için farklı bağımlılıklar nasıl tanımlanır


153

Uygulamalarımdan birini Gradle'a dönüştürüyorum ve ücretli ve ücretsiz bir reklam tabanlı lezzet için yeni yapı lezzet özelliklerini kullanmak istiyorum.

Yalnızca reklam tabanlı sürümün admob SDK'sına bağlı olmasını istiyorum.

Yapım dosyam şöyle:

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

Ücretsiz ürün aromasında bağımlılığı, her iki aroma için genel kütüphaneler içeren ana libs klasörü ile birleştirilen kendi libs klasörüne sahip olacak şekilde yapılandırmanın bir yolu var mı?

Mümkünse bu klasörü nasıl tanımlarım?


Yanıtlar:


190

Lezzete özgü bir bağımlılık tanımlamak için bağımlılık bölümünüzde kullanmak proCompileyerine kullanabilirsiniz compile. Sınıf özelliklerini çalıştırdığınızda, otomatik oluşturulan yapılandırmalara genel bir bakış elde edersiniz.

Doğru derleme dosyası şöyle görünür:

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
Bunu deniyorum ve bu hatayı alıyorum, Error:(28, 0) Build script error, unsupported Gradle DSL method found: 'glassCompile()'!(Bir bağımlılık eklemeye çalıştığım lezzet "cam" dır.)
nmr

19
Ahh, görünüşe göre dependenciesbloğu bloğun altına androidtaşımalısın. Ne kadar sezgisel.
nmr

14
xxxCompileLezzet adı büyük harfle başlıyorsa Gradle'ın oluşturduğu kapakların çalışmayacağını unutmayın .
Jarett Millard

2
"packageName", "applicationId" olmalıdır
Apperside

7
Reklam sınıflarını çağırmamakla nasıl başa çıkıyorsunuz?
Jared Burrows

26

2018 ortasına kadar hızlı ileri. Eklemeniz gerekecek 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'
}

Ayrıca, not alın:

'Derleme' yapılandırması geçersiz ve yerine 'uygulama' ve 'api' getirildi. 2018'in sonunda kaldırılacak. Daha fazla bilgi için bkz. Http://d.android.com/r/tools/update-dependency-configurations.html


Bunun yerine buildVariants ile nasıl yapılacağını biliyor musunuz? proDebugImplementation gibi.
Leandro Ocampo

1
lütfen bunun için ayrı bir soru ekleyin. yorum bölümünde buraya bağlayın. lütfen elde etmeye çalıştığınız şeyin tam ayrıntılarını ekleyin. :)
user1506104

11

Her lezzet için manuel olarak konfigürasyon eklemeniz gerekir. Misal

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
Oradan nasıl devam edilir? Farklı konfigürasyonlar nasıl etkinleştirilir? Bu yalnızca Android derlemesi için mi geçerli? Android dışı sürümlerle bu mümkün mü?
koppor

9

Edit: Ben diğer tekniklerden birini kullanmanızı öneririz!

Kabul edilen cevaba bir alternatif şudur:

    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
Bu, aynı anda birden fazla lezzet oluşturmanıza izin vermez, bu da çoğumuz için bir anlaşma kırıcıdır. Ayrıca android stüdyosu ile de iyi çalışmayabilir
Rene Groeschke

3
bu bağımlılıklar bloğunda mı?
user1743524

2
Bu blok bağımlı mı?
Karacago

hmm ... 10 veya 50 lezzet ile iyi ölçeklenmiyor mu?
Ewoks

@Ewoks Çok lezzet yapmak için hava alıyorum, daha iyi bir fikrin var mı?
Vikash Parajuli

6

Basit:

dependencies {

    ....
    ....

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

    ....
    ....
}

ya da sadece:

FreeImplementation 'com.google.android.gms:play-services-ads:17.2.0'
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.