विभिन्न उत्पाद स्वादों के लिए अलग-अलग निर्भरता कैसे परिभाषित करें


153

मैं अपने एक ऐप को ग्रैडल में परिवर्तित कर रहा हूं और भुगतान और मुफ्त विज्ञापन आधारित स्वाद के लिए नई बिल्ड स्वाद विशेषताओं का उपयोग करना चाहूंगा।

मैं केवल विज्ञापन आधारित संस्करण को 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')
}

क्या नि: शुल्क उत्पाद स्वाद में निर्भरता को कॉन्फ़िगर करने का एक तरीका है कि अपने स्वयं के लिबास फ़ोल्डर को मुख्य फ़ेबल्स फ़ोल्डर में विलय कर दिया जाए जिसमें दोनों फ्लेवर के लिए सामान्य पुस्तकालय शामिल हैं?

यदि यह संभव है तो मैं इस फ़ोल्डर को कैसे परिभाषित करूंगा?


इस धागे को देखें: stackoverflow.com/questions/24860659/…
अली

जवाबों:


190

एक स्वाद विशिष्ट निर्भरता को परिभाषित करने के लिए आप अपनी निर्भरता अनुभाग के proCompileबजाय उपयोग कर सकते हैं compile। जब आप गतिरोध गुण चलाते हैं तो आपको स्वचालित निर्मित कॉन्फ़िगरेशन का अवलोकन मिलता है।

सही बिल्ड फ़ाइल इस तरह दिखती है:

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। कितना सहज है।
एनएमआर

14
ध्यान दें कि xxxCompileयदि ग्रैड नाम कैपिटल लेटर से शुरू होता है तो ग्रैडल जेनरेट करने से काम नहीं चलेगा।
जेरेत मिलार्ड

2
"packageName" को "applicationId" होना चाहिए
अप्रैज़ाइड

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

इसके अलावा, ध्यान दें:

कॉन्फ़िगरेशन 'संकलन' अप्रचलित है और इसे 'कार्यान्वयन' और 'एपीआई' से बदल दिया गया है। इसे 2018 के अंत में हटा दिया जाएगा। अधिक जानकारी के लिए देखें: http://d.android.com/r/tools/update-d dependency-configurations.html


क्या आप जानते हैं कि इसके बजाय buildVariants के साथ कैसे करना है? ProDebugIm कार्यान्वयन की तरह।
Leandro ओकाम्पो

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 बिल्ड पर लागू होता है? क्या यह गैर-एंड्रॉइड बिल्ड के साथ संभव है?
कोपपर

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
यह आपको एक साथ कई स्वादों का निर्माण करने की अनुमति नहीं देता है, जो कि हम में से अधिकांश के लिए एक सौदा ब्रेकर है। इसके अलावा यह एंड्रॉइड स्टूडियो के साथ भी अच्छा काम नहीं कर सकता है
रेने ग्रेशेके

3
यह निर्भरता ब्लॉक में है?
user1743524

2
क्या यह ब्लॉक भरोसेमंद है?
कराकैगो

हम्म ... 10 या 50 जायके के साथ अच्छी तरह से नहीं करता है?
इवोक

@ ईव्स मैं बहुत सारे फ्लेवर बनाने के लिए हवलदार हूं, क्या आपके पास कोई बेहतर विचार है?
विकाश पराजुली

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 Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.