android स्वाद का उपयोग करके प्रत्येक स्वाद संयोजन के लिए अलग-अलग एप्लिकेशन आईडी कैसे सेट करें?




gradle android-gradle (2)

मेरे पास और पुराना एंड्रॉइड ऐप है जो मैं एंड्रॉइड ग्रेडल बिल्ड सिस्टम में माइग्रेट करने की कोशिश कर रहा हूं। ऐप वर्तमान में एक बहु परियोजना सेटअप में बनाया गया है और चार अलग-अलग ऐप्स (दो अलग-अलग डेटा सेट शामिल हैं और दोनों डेटासेट के लिए मुफ्त / भुगतान संस्करण) के रूप में प्रकाशित किया गया है। मैं स्वाद डिमेंशन (जिसे पहले स्वाद समूह कहा जाता है) का उपयोग करके बहु परियोजना सेटअप से दूर हो गया है, लेकिन मैं यह नहीं समझ सकता कि प्रत्येक स्वाद संयोजन के लिए एक अलग एप्लिकेशन आईडी कैसे सेट करें।

चूंकि ऐप संस्करण पहले ही प्रकाशित हो चुके हैं, इसलिए मुझे उसी एप्लिकेशनिड को वर्तमान में रखना होगा। मेरे मूल पैकेज नामकरण के तरीके के कारण, मैं केवल "पैकेज नाम सूफिक्स" के साथ स्वाद-निर्माण प्रकार का उपयोग नहीं कर सकता (जो एक अप्रकाशित ऐप था तो यह एक अच्छा विकल्प होता)।

https://stackoverflow.com/a/20956353/4177090 स्वाद संयोजनों के लिए विभिन्न स्रोत फ़ोल्डरों का उपयोग करने का उत्तर दे रहा है, लेकिन निर्माण फ़ाइल में प्रत्येक संयोजन के लिए विशिष्ट कॉन्फ़िगरेशन सेट करने के लिए (यदि संभव हो) भी नहीं।

ग्रैडल फ़ाइल स्निपेट बनाएं:

flavorDimensions "price", "dataset"

productFlavors {
    free { flavorDimension "price" }
    paid { flavorDimension "price" }
    dataset1 { flavorDimension "dataset" }
    dataset2 { flavorDimension "dataset" }
}

मैं अपनी ग्रेडल बिल्ड फ़ाइल में निम्न जैसा कुछ चाहूंगा (ध्यान दें कि मेरा नामकरण कितना अनलॉक है, यही कारण है कि मैं पैकेज नाम का उपयोग नहीं कर सकता):

freeDataset1 { applicationId "com.beansys.freeappdataset1" }
freeDataset2 { applicationId "com.beansys.freedataset2" }
paidDataset1 { applicationId "com.beansys.dataset1paid" }
paidDataset2 { applicationId "com.beansys.mypaiddataset2" }

मैं अंत में इसे हल करने में कामयाब रहे। मुझे लगता है कि समाधान सुरुचिपूर्ण है (यद्यपि असली कोड संभवत: ग्रोवी ज्ञान वाले किसी व्यक्ति द्वारा बहुत अच्छा लिखा जा सकता है)।

प्रत्येक संयुक्त स्वाद के लिए एक विशिष्ट अनुप्रयोग आईडी सेट करने के लिए समाधान:

flavorDimensions "price", "dataset"

productFlavors {
    free { flavorDimension "price" }
    paid { flavorDimension "price" }
    dataset1 { flavorDimension "dataset" }
    dataset2 { flavorDimension "dataset" }
}

android.variantFilter { variant ->
    def flavorString = ""
    def flavors = variant.getFlavors()
    for (int i = 0; i < flavors.size(); i++) {
        flavorString += flavors[i].name;
    }
    if(flavorString.equalsIgnoreCase("freeDataset1")) {
        variant.getDefaultConfig().applicationId "com.beansys.freeappdataset1"
    }
    if(flavorString.equalsIgnoreCase("freeDataset2")) {
        variant.getDefaultConfig().applicationId "com.beansys.freedataset2"
    }
    if(flavorString.equalsIgnoreCase("paidDataset1")) {
        variant.getDefaultConfig().applicationId "com.beansys.dataset1paid"
    }
    if(flavorString.equalsIgnoreCase("paidDataset2")) {
        variant.getDefaultConfig().applicationId "com.beansys.mypaiddataset2"
    }
}

फ्रेड्रिक द्वारा प्रस्तावित समाधान एंड्रॉइड स्टूडियो को 1.0.2 (और प्लगइन को 1.0.0 तक ले जाने के लिए) को अपग्रेड करने के बाद काम करना बंद कर दिया है, इसलिए मुझे निम्नलिखित परिवर्तनों को जोड़ना था, जो धीरे-धीरे प्लगइन 1.3.1 के रूप में चालू था:

flavorDimensions "price", "dataset"

productFlavors {
    free { dimension "price" }
    paid { dimension "price" }
    dataset1 { dimension "dataset" }
    dataset2 { dimension "dataset" }
}

android.applicationVariants.all { variant ->
    def mergedFlavor = variant.mergedFlavor
    switch (variant.flavorName) {
        case "freeDataset1":
            mergedFlavor.setApplicationId("com.beansys.freeappdataset1")
            break
        case "freeDataset2":
            mergedFlavor.setApplicationId("com.beansys.freedataset2")
            break
        case "paidDataset1":
            mergedFlavor.setApplicationId("com.beansys.dataset1paid")
            break
        case "paidDataset2":
            mergedFlavor.setApplicationId("com.beansys.mypaiddataset2")
            break
    }
}




android-build