यदि मैं रिलीज़ या डिबग मोड में हूं तो मुझे कैसे पता चलेगा?


374

मैं अपने कोड में कैसे पता लगा सकता हूं कि मैं रिलीज मोड या डिबग मोड में हूं?

जवाबों:


770

सबसे सरल, और सबसे अच्छा दीर्घकालिक समाधान, उपयोग करना है BuildConfig.DEBUG। यह एक booleanमान है जो trueडीबग बिल्ड के लिए होगा , falseअन्यथा:

if (BuildConfig.DEBUG) {
  // do something for a debug build
}

ऐसी रिपोर्टें आई हैं कि यह मूल्य ग्रहण-आधारित बिल्ड से 100% विश्वसनीय नहीं है, हालांकि मुझे व्यक्तिगत रूप से कोई समस्या नहीं हुई है, इसलिए मैं यह नहीं कह सकता कि यह वास्तव में कितना मुद्दा है।

यदि आप एंड्रॉइड स्टूडियो का उपयोग कर रहे हैं, या यदि आप कमांड लाइन से ग्रैडल का उपयोग कर रहे हैं, तो आप रनटाइम पर इन स्थितियों को अलग करने में मदद करने के लिए अपना स्वयं का सामान जोड़ सकते हैं BuildConfigया अन्यथा ट्विक कर सकते हैं debugऔर releaseप्रकार का निर्माण कर सकते हैं।

अवैध तर्क से समाधान android:debuggableप्रकट में ध्वज के मूल्य पर आधारित है । यदि आप "डिबग" बिल्ड को "रिलीज़" बिल्ड से अलग करना चाहते हैं, तो परिभाषा के अनुसार, यह सबसे अच्छा समाधान है। हालांकि, ध्यान रखें कि आगे बढ़ना, debuggableझंडा वास्तव में एक स्वतंत्र अवधारणा है जो ग्रैडल / एंड्रॉइड स्टूडियो एक "डिबग" के निर्माण पर विचार करता है। कोई भी बिल्ड प्रकार debuggableध्वज को सेट करने के लिए चुनाव कर सकता है जो उस मूल्य के लिए जो उस डेवलपर के लिए और उस बिल्ड प्रकार के लिए मायने रखता है।


34
BuildConfigआपके ऐप के पैकेज में स्थित है, जैसेimport com.mycompany.myapp.BuildConfig;
क्रिस साइरफिस

10
AndroiStudio में एक बग के कारण यह अब काम नहीं करता है, यह हमेशा गलत है, यहां तक ​​कि DEBUG मोड में भी
user387184

1
@ user387184: एंड्रॉइड स्टूडियो 1.2.2 में, मैं public static final boolean DEBUG = Boolean.parseBoolean("true");डिबग बिल्ड के लिए मिलता हूं । जबकि यह एक विचित्र तरीका है जिसे सेट DEBUGकरना है true, इसे काम करना चाहिए। यदि आप इसे 1.3.0 परीक्षण रिलीज़ में से एक में देख रहे हैं, या यदि आपके पास 1.2.2 के लिए एक प्रतिलिपि प्रस्तुत करने योग्य परीक्षण मामला है, तो कृपया एक समस्या दर्ज करें । मुझे इस समस्या की रिपोर्ट करने वाले कोई भी बकाया मुद्दे नहीं दिख रहे हैं।
कॉमन्सवेयर जूल

2
मैं v1.2.2 का उपयोग कर रहा हूं और BuildConfig.DEBUG हमेशा गलत है, फिर मैंने नीचे दिए गए सुझाव की कोशिश की, जो मेरे लिए काम करता है - मैं तुम्हारा भी प्रयास करूंगा - बहुत धन्यवाद!
user387184

3
जैसा कि यह पता चला है, यह लाइब्रेरी का उपयोग करते समय काम नहीं करेगा (हमेशा सच होता है): stackoverflow.com/q/20176284/878126 । आश्चर्य है कि सबसे अच्छा विकल्प क्या है
Android डेवलपर

59

निम्नलिखित आज़माएँ:

boolean isDebuggable =  ( 0 != ( getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE ) );

Kotlin:

val isDebuggable = 0 != applicationInfo.flags and ApplicationInfo.FLAG_DEBUGGABLE

इसे यहां से बंडल पोस्ट से लिया गया है


3
यह जवाब सभी मामलों में लाइब्रेरी प्रोजेक्ट या एप्लिकेशन प्रोजेक्ट की परवाह किए बिना काम करेगा।
लवकुश अग्रवाल

getApplicationInfo().flagsकाम करने के लिए क्या आयात करना होगा?
A1

1
ठीक है, यह केवल स्थैतिक संदर्भ में काम नहीं करता है, देखें stackoverflow.com/questions/10641144/…
A1m

54

हां, आपको उपयोग करने में कोई समस्या नहीं होगी:

if (BuildConfig.DEBUG) {
   //It's not a release version.
}

जब तक आप गलत BuildConfig वर्ग आयात कर रहे हैं। सुनिश्चित करें कि आप अपनी परियोजना के बिल्डकॉनफिग वर्ग का संदर्भ ले रहे हैं, न कि आपके किसी भी निर्भरता वाले पुस्तकालय से।

यहां छवि विवरण दर्ज करें


1
"जब तक आप गलत बिल्डकॉन्फिग क्लास का आयात नहीं कर रहे हैं" ... हाँ, बहुत अच्छा बिंदु: डी
बेंजामिन पीट

धन्यवाद! यह मेरी परियोजना में समस्या थी, किसी तरह यह पुस्तकालय परियोजना के बिल्डकॉन्फिग को उठा रहा था (जो एंड्रॉइड स्टूडियो 3 तक हमेशा रिलीज होता है)
अमित गर्ग

36

के बारे में मिश्रित टिप्पणियों के कारण BuildConfig.DEBUG, मैंने डिबग मोड में क्रैशलीटिक्स (और एनालिटिक्स) को अक्षम करने के लिए निम्नलिखित का उपयोग किया:

अद्यतन /app/build.gradle

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.1"

    defaultConfig {
        applicationId "your.awesome.app"
        minSdkVersion 16
        targetSdkVersion 25
        versionCode 100
        versionName "1.0.0"
        buildConfigField 'boolean', 'ENABLE_CRASHLYTICS', 'true'
    }
    buildTypes {
        debug {
            debuggable true
            minifyEnabled false
            buildConfigField 'boolean', 'ENABLE_CRASHLYTICS', 'false'
        }
        release {
            debuggable false
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

फिर, आपके कोड में आप ENABLE_CRASHLYTICSध्वज का पता लगाते हैं:

    if (BuildConfig.ENABLE_CRASHLYTICS)
    {
        // enable crashlytics and answers (Crashlytics by default includes Answers)
        Fabric.with(this, new Crashlytics());
    }

अपने ऐप में उसी अवधारणा का उपयोग करें और ENABLE_CRASHLYTICSजो कुछ भी आप चाहते हैं उसका नाम बदलें । मुझे यह दृष्टिकोण पसंद है क्योंकि मैं कॉन्फ़िगरेशन में ध्वज को देख सकता हूं और मैं ध्वज को नियंत्रित कर सकता हूं।


आपको क्रैशलाईटिक्स और उत्तर अलग से नहीं बुलाने चाहिए। बस उपयोग करें: Fabric.with (यह, नए क्रैशलाईटिक्स ()); Crashlytics और उत्तरों को शामिल करने के लिए।
माइक बॉननेल

1
धन्यवाद, @MikeBonnell, मैंने कोड को उदाहरण कोड में बदल दिया
किसी ने कहीं

मैं नहीं देखता कि यह बिल्डकॉनफिग। डीबग का उपयोग करने से कैसे अलग है - यदि आप केवल अपने डिबग बिल्ड के लिए BuildConfig.ENABLE_CRASHLYTICS सेट करते हैं तो BuildConfig.DEBUG और BuildConfig.ENABLE_CRASHLYTICS का हमेशा समान मान होगा?
k2col

मुझे लगता है कि लाइब्रेरी प्रोजेक्ट्स पर देव के काम करने से बिल्डकॉनफिग डी.ब्यूग का उपयोग करके डिबग / रिलीज बिल्ड का पता लगाने में समस्या थी। हो सकता है कि एक प्रारंभिक एंड्रॉइड स्टूडियो बग भी शामिल हो गया हो ...
किसी ने

13

वैकल्पिक रूप से, आप BuildConfig.BUILD_TYPE का उपयोग करके अंतर कर सकते हैं;

यदि आप डिबग बिल्ड BuildConfig.BUILD_TYPE.equals("debug");रिटर्न सही चला रहे हैं । और रिलीज बिल्ड बिल्ड के लिए BuildConfig.BUILD_TYPE.equals("release");सही है।


1
यह सही जवाब है। रिटर्न "रिलीज" जबकि BuildConfig.DEBUG हमेशा लौटता है true
मिनस मीना

6

मैं इस समाधान का उपयोग कर रहा हूं ताकि यह पता लगाया जा सके कि मेरा ऐप डिबग संस्करण पर चल रहा है।

if (BuildConfig.BUILD_TYPE.equals("Debug")){
   //Do something
}

1
कृपया अपने उत्तर में विवरण जोड़ें। यह कोड के एक टुकड़े की तुलना में अधिक उपयोगी होगा।
मैथ्यूज सनी

मैं if (BuildConfig.DEBUG) {} एक आश्रित ग्रेडेल मॉड्यूल का उपयोग कर रहा था जिसमें (निश्चित रूप से) ऐप की बिल्ड.ग्रेड फ़ाइल के लिए कोई संदर्भ नहीं था - इससे डिबग मोड को गलत तरीके से पहचाना जाने लगा। if (BuildConfig.BUILD_TYPE.equals("Debug")){ }मुद्दा उठाया। धन्यवाद
कोसियारा - बार्टोज़ कोसरज़ी का '

यह वास्तविक उत्तर है, बस "डीबग" को "डीबग" में
बदलें

1

सुनिश्चित करें कि आप सही BuildConfig वर्ग आयात कर रहे हैं और हाँ, आपको उपयोग करने में कोई समस्या नहीं होगी:

if (BuildConfig.DEBUG) {
   //It's not a release version.
}

यह ठीक काम करता है! धन्यवाद!
सूद
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.