আমি কীভাবে সনাক্ত করব যে আমি মুক্তি বা ডিবাগ মোডে আছি?


374

আমি কীভাবে আমার কোডটি সনাক্ত করতে পারি যে আমি প্রকাশের মোডে বা ডিবাগ মোডে আছি?

উত্তর:


770

সবচেয়ে সহজ এবং সর্বোত্তম দীর্ঘমেয়াদী সমাধানটি হ'ল ব্যবহার করা BuildConfig.DEBUG। এটি একটি booleanমান যা trueডিবাগ বিল্ডের জন্য হবে , falseঅন্যথায়:

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

এমন খবরে বলা হয়েছে যে এই মানটি গ্রহ-ভিত্তিক বিল্ডগুলি থেকে 100% নির্ভরযোগ্য নয়, যদিও আমি ব্যক্তিগতভাবে কোনও সমস্যার মুখোমুখি হইনি, সুতরাং এটি আসলে কতটা ইস্যু তা বলতে পারি না।

আপনি যদি অ্যান্ড্রয়েড স্টুডিও ব্যবহার করছেন বা আপনি যদি কমান্ড লাইন থেকে গ্রেডল ব্যবহার করছেন, আপনি রানটাইমের সময় এই পরিস্থিতিগুলিকে আলাদা করতে সহায়তা করতে নিজের নিজস্ব জিনিস যোগ করতে BuildConfigবা অন্যথায় টুইঙ্ক করতে পারেন debugএবং releaseপ্রকারগুলি তৈরি করতে পারেন।

অবৈধ তর্ক থেকে সমাধানটি android:debuggableম্যানিফেস্টে পতাকাটির মানের উপর ভিত্তি করে । যদি আপনি এইভাবে কোনও "রিলিজ" বিল্ড থেকে কোনও "ডিবাগ" বিল্ডকে আলাদা করতে চান তবে সংজ্ঞা অনুসারে এটিই সেরা সমাধান। তবে, মনে রাখবেন যে এগিয়ে যাওয়া, debuggableগ্রেডেল / অ্যান্ড্রয়েড স্টুডিও একটি "ডিবাগ" বিল্ডকে কী বলে বিবেচনা করে তা থেকে পতাকাটি সত্যই একটি স্বাধীন ধারণা। যে কোনও বিল্ড টাইপ debuggableপতাকাটি সেট করতে নির্বাচিত করতে পারে যা সেই বিকাশকারীর জন্য এবং সেই বিল্ড প্রকারের জন্য অর্থকে কার্যকর করে whatever


34
BuildConfigআপনার অ্যাপ্লিকেশানের প্যাকেজে অবস্থিত, যেমনimport com.mycompany.myapp.BuildConfig;
ক্রিস সাইরেফাইস

10
এন্ড্রোইস্টুডিওতে বাগের কারণে এটি আর কাজ করে না, এটি সর্বদা মিথ্যা, এমনকি
ডিইবিইউজি

1
@ ব্যবহারকারী 387184: অ্যান্ড্রয়েড স্টুডিও ১.২.২ এ, আমি public static final boolean DEBUG = Boolean.parseBoolean("true");একটি ডিবাগ বিল্ড পাই । এটি সেট DEBUGকরার একটি উদ্ভট উপায় হলেও trueএটি কাজ করা উচিত। আপনি যদি এটি ১.৩.০ পরীক্ষার রিলিজের একটিতে দেখতে পাচ্ছেন বা আপনার যদি ১.২.২ এর জন্য পুনরুত্পাদনযোগ্য টেস্ট কেস থাকে তবে দয়া করে একটি সমস্যা ফাইল করুন । এই সমস্যার প্রতিবেদন করার মতো কোনও অসামান্য সমস্যা আমি দেখতে পাচ্ছি না।
কমন্সওয়্যার

2
আমি v1.2.2 ব্যবহার করছি এবং বিল্ডকনফিগ.ডিডিইউবি সবসময় মিথ্যা, তারপরে আমি নীচের পরামর্শটি দিয়েছি যা আমার পক্ষে কাজ করে - আমিও আপনার চেষ্টা করব - অনেক ধন্যবাদ!
ব্যবহারকারী 387184

3
দেখা যাচ্ছে যে কোনও লাইব্রেরি ব্যবহার করার সময় এটি কার্যকর হবে না (সর্বদা সত্য ফিরে আসে): stackoverflow.com/q/20176284/878126 । সেরা বিকল্পটি কী তা
অ্যান্ড্রয়েড বিকাশকারী

59

নিম্নলিখিত চেষ্টা করুন:

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

Kotlin:

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

এটি এখান থেকে বান্ডেল পোস্ট থেকে নেওয়া হয়েছে


3
এই উত্তরটি লাইব্রেরি প্রকল্প বা অ্যাপ্লিকেশন প্রকল্প নির্বিশেষে সব ক্ষেত্রেই কাজ করবে।
ল্যাভাকুশ অগ্রওয়াল

কাজের জন্য কী আমদানি করা দরকার getApplicationInfo().flags?
এম

1
ঠিক আছে এটা শুধু স্ট্যাটিক প্রেক্ষাপটে কাজ, দেখেন stackoverflow.com/questions/10641144/...
A1m

54

হ্যাঁ, ব্যবহার করে আপনার কোনও সমস্যা হবে না:

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

আপনি যদি ভুল বিল্ডকনফিগ শ্রেণিটি আমদানি না করে থাকেন। নিশ্চিত হয়ে নিন যে আপনি আপনার প্রকল্পের বিল্ডকনফিগ ক্লাসটি উল্লেখ করছেন, আপনার কোনও নির্ভরতা লাইব্রেরি থেকে নয়।

এখানে চিত্র বর্ণনা লিখুন


1
"যদি আপনি ভুল বিল্ডকনফিগ শ্রেণিটি আমদানি না করেন" ... হ্যাঁ, খুব ভাল বিষয়: ডি
বেঞ্জামিন পাইট

ধন্যবাদ! এটি আমার প্রকল্পে সমস্যা ছিল, কোনওভাবে এটি গ্রন্থাগার প্রকল্পের বিল্ডকনফিগটি তুলছিল (যা অ্যান্ড্রয়েড স্টুডিও 3 বের হওয়া অবধি সর্বদা প্রকাশিত হয়)
অমিত গার্গ

36

সম্পর্কে মিশ্র মন্তব্যের কারণে BuildConfig.DEBUGআমি নিম্নলিখিতটি ডিবাগ মোডে ক্র্যাশলাইটিক্স (এবং বিশ্লেষণ) অক্ষম করতে ব্যবহার করেছি:

আপডেট / অ্যাপ্লিকেশন / বিল্ড.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যে কোনও কিছুতে নতুন নামকরণ করুন । আমি এই পদ্ধতির পছন্দ করি কারণ আমি কনফিগারেশনে পতাকাটি দেখতে পারি এবং আমি পতাকাটি নিয়ন্ত্রণ করতে পারি।


আপনার পৃথকভাবে ক্র্যাশলিটিক্স এবং উত্তরগুলি কল করা উচিত নয়। কেবল ব্যবহার করুন: ফ্যাব্রিক.উইথ (এটি, নতুন ক্র্যাশলিটিক্স ()); ক্র্যাশলিটিক্স এবং উত্তরগুলি অন্তর্ভুক্ত করতে।
মাইক বোনেল

1
ধন্যবাদ, @ মাইকবোনেল, আমি কোডটি উদাহরণ কোডে পরিবর্তন করেছি
কেউ কোথাও

আমি দেখতে পাচ্ছি না যে এটি বিল্ডকনফিগ.ডিডিবিউজি ব্যবহারের চেয়ে আলাদা কীভাবে - যদি আপনি কেবল আপনার ডিবাগ বিল্ডসের জন্য বিল্ডকনফিগ.এএনএবিএল_সিআরএইচএলটাইকস সেট করেন তবে বিল্ডকনফিগ.এডিবিউজি এবং বিল্ডকনফিগ।এএনএবিএল_সিআরএসএলএলটিক্সের সর্বদা একই মান ঠিক থাকবে?
2col

আমার মনে হয় লাইব্রেরি প্রকল্পগুলিতে দেবের কাজ করতে বিল্ডকনফিগ.ডিডিইউবি ব্যবহার করে ডিবাগ / রিলিজ বিল্ডগুলি সনাক্ত করতে সমস্যা হয়েছিল। প্রথম দিকে অ্যান্ড্রয়েড স্টুডিও বাগটিও জড়িত থাকতে পারে ...
কেউ কোথাও

13

বিকল্পভাবে, আপনি বিল্ডকনফিগ ব্যবহার করে আলাদা করতে পারেন B BUILD_TYPE;

আপনি যদি ডিবাগ বিল্ড চালাচ্ছেন তবে BuildConfig.BUILD_TYPE.equals("debug");রিটার্ন সত্য হবে। রিলিজের জন্য বিল্ড BuildConfig.BUILD_TYPE.equals("release");রিটার্নস সত্য।


1
এটা সঠিক উত্তর. বিল্ডকনফিগ.ডেবিইউজি সর্বদা ফিরে আসে এমন সময় "রিলিজ" দেয় true
মিনাস মিনা 21

6

আমার অ্যাপটি ডিবাগ সংস্করণে চলছে কিনা তা জানতে আমি এই সমাধানটি ব্যবহার করছি।

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

1
আপনার উত্তরে বর্ণনা যোগ করুন। এটি কেবলমাত্র এক টুকরো কোডের চেয়ে বেশি সহায়ক।
ম্যাথিউজ সানি

আমি if (BuildConfig.DEBUG) {} একটি নির্ভরশীল গ্রেড মডিউল ব্যবহার করছিলাম যা অ্যাপ্লিকেশন বিল্ড.gradle ফাইলের (অবশ্যই) কোনও রেফারেন্স ছিল না - এর ফলে ডিবাগ মোডটি ভুল উপায়ে স্বীকৃত হয়েছিল। if (BuildConfig.BUILD_TYPE.equals("Debug")){ }ইস্যুটি ফিক্সড। ধন্যবাদ
কোসিয়ারা - বার্তোসক কোসারজেকি

এটি আসল উত্তর, কেবল "ডিবাগ" "ডিবাগ"
জেটউইজ

1

নিশ্চিত হয়ে নিন যে আপনি সঠিক বিল্ডকনফিগ শ্রেণিটি আমদানি করছেন এবং হ্যাঁ, আপনাকে ব্যবহার করতে কোনও সমস্যা হবে না:

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

এটি ঠিক কাজ করে! ধন্যবাদ!
Sud007
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.