एंड्रॉइड स्टूडियो में रनटाइम पर बिल्ड वेरिएंट कैसे प्राप्त करें?


81

मैं रनटाइम के दौरान बिल्ड वेरिएंट प्राप्त करना चाहता हूं, क्या यह किसी अतिरिक्त कॉन्फ़िगरेशन या कोड के बिना संभव है?

जवाबों:


130

उत्पन्न BuildConfigवर्ग को देखो ।

public final class BuildConfig {
  public static final boolean DEBUG = Boolean.parseBoolean("true");
  public static final String APPLICATION_ID = "com.example.app";
  public static final String BUILD_TYPE = "debug";
  public static final String FLAVOR = "";
  public static final int VERSION_CODE = 1;
  public static final String VERSION_NAME = "";
}

इसलिए यदि आपका ऐप अभी तक नहीं बनाया गया है, तो यह वर्ग मौजूद नहीं होगा और निर्मित होने से पहले कक्षा का उपयोग करने से संकलन त्रुटि हो जाएगी, नहीं? क्या यह मुर्गी बनाम अंडा परिदृश्य नहीं है?
AndroidDev

13
BuildConfig एक ग्रैडल सिंक के दौरान उत्पन्न होता है, न कि ऐप के निर्माण के लिए।
आशीषुदेव

7
मैत्रीपूर्ण अनुस्मारक एक बाहरी पुस्तकालय BuildConfig के बजाय अपने ऐप पैकेज के लिए BulidConfig को आयात करने के लिए ... जैसा कि मैंने किया ...
levibostian

3
PACKAGE_NAMEलगता है की जगह ले ली गई हैAPPLICATION_ID
रॉकहैमर

@ashishduh "BuildConfig एक ग्रैडल सिंक के दौरान उत्पन्न होता है, न कि ऐप के निर्माण के लिए।" नहीं, यह सही नहीं है। बस परियोजना को साफ करें और आप नोटिस करेंगे BuildConfigकि चला गया है। इसे एक कारण के लिए BuildConfig कहा जाता है
फरीद

29

एक और विकल्प यह होगा कि प्रत्येक बिल्ड वैरिएंट के लिए एक अलग बिल्ड कॉन्फिगर वैरिएबल बनाएं और इसे अपने कोड में इस तरह से उपयोग करें:

अपनी बिल्ड.ग्रेड फ़ाइल में:

productFlavors {

    production {
        buildConfigField "String", "BUILD_VARIANT", "\"prod\""
    }

    dev {
        buildConfigField "String", "BUILD_VARIANT", "\"dev\""
    }       
}

अपने कोड में इसका उपयोग करने के लिए:

if (BuildConfig.BUILD_VARIANT.equals("prod")){ // do something cool }

3

आप के साथ कोशिश कर सकते हैं

getPackageName(); 

बिल्ड.ग्रेड में आपने जो भी परिभाषित किया है, वह वापस आ जाएगा

productFlavours{
  flavour1{
     applicationId 'com.example.package.flavour1'
  }
  flavour2{
     applicationId 'com.example.package.flavour2'
  }
}

3

BuildConfigविभिन्न स्वादों को परिभाषित करने और प्राप्त करने के लिए यहां एक उदाहरण है

android {

    defaultConfig {
        ...
    buildTypes {
        ...
    }

    flavorDimensions "default"
    productFlavors {

        develop {
            applicationIdSuffix ".dev"
            versionNameSuffix "-dev"
        }

        staging {
            applicationIdSuffix ".stg"
            versionNameSuffix "-stg"
        }

        production {
            applicationIdSuffix ""
            versionNameSuffix ""
        }
    }

    applicationVariants.all { variant ->

        def BASE_URL = ""

        if (variant.getName().contains("develop")) {
            BASE_URL = "https://localhost:8080.com/"
        } else if (variant.getName().contains("staging")) {
            BASE_URL = "https://stagingdomain.com/"
        } else if (variant.getName().contains("production")) {
            BASE_URL = "https://productdomain.com/"
        }
        variant.buildConfigField "String", "BASE_URL", "\"${BASE_URL}\""

    }
}

का उपयोग करते हुए

BuildConfig.BASE_URL


2

यदि आप पहले से ही स्वाद ले रहे हैं तो अपने ग्रेड में अतिरिक्त स्ट्रिंग क्षेत्र प्रदान करने की कोई आवश्यकता नहीं है। बिल्ड विवरण प्राप्त करने के लिए सरल चरणों का पालन करें:

बिल्ड वेरिएंट के लिए: BuildConfig.FLAVOR
बिल्ड वर्जन कोड के लिए: BuildConfig.VERSION_CODE
बिल्ड वर्जन के नाम के लिए: BuildConfig.VERSION_NAME


3
BuildConfig.BUILD_TYPEबिल्ड वैरिएंट के लिए इस्तेमाल किया जाना चाहिए। BuildConfig.FLAVORआपके द्वारा निर्दिष्ट किसी भी स्वाद के लिए उपयोग किया जाना चाहिए।
एडिक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.