এডিটি বিল্ডকনফিগ.ডেবিউজি কখন মিথ্যাতে সেট করে?


110

ADT (r17) এর নতুন সংস্করণে একটি উত্পন্ন ধ্রুবক যুক্ত করা হয়েছিল BuildConfig.DEBUGযা বিল্ডের ধরণ অনুযায়ী সেট করা হয়। আমার সমস্যাটি হ'ল এটি কখনই মিথ্যা হিসাবে সেট করা হয় না, "অ্যান্ড্রয়েড সরঞ্জাম -> রফতানি স্বাক্ষরিত অ্যাপ্লিকেশন প্যাকেজ" করার সময় এটি পরিবর্তিত হবে বলে আমি প্রত্যাশা করি তবে এটি আমার পক্ষে হয়নি।

তাহলে আমি কীভাবে বিল্ড টাইপ পরিবর্তন করব?

এমন একটি বৈশিষ্ট্য যুক্ত করা হয়েছে যা আপনাকে কেবল ডিবাগ মোডে কিছু কোড চালানোর অনুমতি দেয়। বিল্ডস এখন বিল্ডকনফিগ নামে একটি শ্রেণি উত্পন্ন করে যেখানে একটি DEBUG ধ্রুবক থাকে যা আপনার বিল্ডের ধরণ অনুসারে স্বয়ংক্রিয়ভাবে সেট হয়। কেবলমাত্র ডিবাগ-ফাংশনগুলি চালানোর জন্য আপনি আপনার কোডে স্থির (বিল্ডকনফিগ.ডি.ইউবিইউ) চেক করতে পারেন


2
বিল্ডকনফিগ.জভা অ্যান্ড্রয়েড বিল্ড সরঞ্জামগুলির দ্বারা স্বয়ংক্রিয়ভাবে উত্পন্ন হয় এবং জেন ফোল্ডারে স্থাপন করা হয়। স্বাক্ষরিত এপিএলে বিল্ডকনফিগ থাকতে হবে DE DEBUG = মিথ্যা। এটি আপনার সমস্যা হওয়া উচিত নয়। আপনাকে সেই ফাইলটি ম্যানুয়ালি স্পর্শ করা উচিত নয় ...
ইগোরগানাপলস্কি

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

উত্তর:


56

বর্তমানে আপনি "বিল্ড অটোমেটিক" অক্ষম করে, প্রকল্পটি পরিষ্কার করে এবং তারপরে "অ্যান্ড্রয়েড সরঞ্জাম -> রফতানি স্বাক্ষরিত অ্যাপ্লিকেশন প্যাকেজ" এর মাধ্যমে সঠিক আচরণ পেতে পারেন। আপনি অ্যাপ্লিকেশন চালানোর সময় BuildConfig.DEBUGমিথ্যা হওয়া উচিত।


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

আমার সর্বদা মিথ্যা, এমনকি ডিবাগ করার
সময়ও

39

সঙ্গে অন্ধকার , আমি সবসময় অক্ষম "বিল্ড স্বয়ংক্রিয়ভাবে" রিলিজে অ্যাপ্লিকেশন এক্সপোর্ট সামনে বিকল্প। তারপরে আমি প্রকল্পটি পরিষ্কার করে রফতানি করি। অন্যথায় এটি ডিবাগ মোডে সংকলন শুরু হয় এবং তারপরে বিল্ডকনফিগ.ডিইউবিগির মান ভুল হতে পারে।

সঙ্গে অ্যান্ড্রয়েড স্টুডিও , আমি কেবল build.gradle মধ্যে আমার নিজস্ব পরিবর্তনশীল যোগ করুন:

buildTypes {
    debug {
        buildConfigField "Boolean", "DEBUG_MODE", "true"
    }
    release {
        buildConfigField "Boolean", "DEBUG_MODE", "false"
    }
}

আমি যখন প্রকল্পটি তৈরি করি তখন বিল্ডকনফিগ.জভাটি নীচে তৈরি করা হয়:

public final class BuildConfig {
  // Fields from build type: debug
  public static final Boolean DEBUG_MODE = true;
}

তারপরে আমার কোডে আমি এটি ব্যবহার করতে পারি:

if (BuildConfig.DEBUG_MODE) {
    // do something
}

আমি ডিবাগ / রিলিজ বিল্ডটি স্যুইচ করার পরে পরিষ্কার করার পুনর্নির্দেশ করছি।


1
আপনি যদি অগ্রসর ব্যবহার করেন তবে এই সমাধানটি সেরা।
ভিক্টর লেয়ার্টে

33

এটি সঠিকভাবে কাজ করে না:

ইস্যু 27940 : BuildConfig.DEBUG রপ্তানি আবেদন প্যাকেজের জন্য "সত্যিকারের" হয়

হতাশাজনক যে তারা কখনও কখনও বাগি বৈশিষ্ট্য প্রকাশ করে।


9
দয়া করে উপরে উল্লিখিত ইস্যুর লিঙ্কে যান এবং যদি আপনি এটি স্থির করতে চান তবে এটি 'স্টার' করুন।
ছেলে

11

এটি কাজ করে, তবে মনে রাখবেন যে স্বাক্ষরিত ফাইলটি রফতানি করার পরেও কোড ফাইলটি কখনই পরিবর্তন হয় না। রফতানি প্রক্রিয়া এই ভেরিয়েবলের মানটিকে মিথ্যাতে পরিবর্তিত করে, যা আপনাকে মিথ্যা ধারণা দেয় যে এটি কাজ করছে না। আমি যেমন লগিং বিবৃতি দিয়ে এটি পরীক্ষা

if (com.mypackage.BuildConfig.DEBUG)
            Log.d(TAG, location.getProvider() + " location changed");

পরীক্ষা করার সময়, আমার লগ স্টেটমেন্টগুলি আর কোনও আউটপুট উত্পাদন করে না।


1
তুমি ঠিক কি করেছ?
pbhowmick

2
আমি বিল্ডকনফিগ.ডি.ডি.গু.গির উদাহরণগুলি com.mypackage.BuildConfig.DEBUG এ পরিবর্তন করেছি, তারপরে অ্যাপ্লিকেশনটি পুনরায় পুনরায় পাঠানো ... এবং এটি সর্বদা সত্যে ফিরে আসে। আপনার পরামর্শটি আমি ভুল বুঝেছি।
ক্রিস রায়ে

1
আমি যা বলছি তা হ'ল কোডটি পরিবর্তন হবে না। তবে, com.mypackage.BuildConfig.DEBUG মিথ্যা পোস্ট সংকলনে সেট করা হবে। উপরের মতো পরীক্ষার লগিং স্টেটমেন্টটি ব্যবহার করে দেখুন (লগ করার জন্য একটি স্বেচ্ছাসেবী স্ট্রিং চয়ন করুন), রফতানি করুন এবং তারপরে এটি চালান। দেখুন অ্যাডবি লগিংয়ের বিবৃতি প্রদর্শন করে কিনা। আমি একটি বাজি নেব যে অ্যাডিবির সেই লগিং স্টেটমেন্টটি রিপোর্ট করবে না, এটি নির্দেশ করে যে ডিইউবিউজি মিথ্যা হিসাবে সেট করা হয়েছে।
pbhowmick

1
আমি নিশ্চিত না যে "কোড" সম্পর্কে আপনি কী বোঝাতে পেরেছি তা আমি জানি ... তবে, আমি বলব যে APK রফতানির আগে একটি পরিষ্কার করা (গৃহীত উত্তরের হিসাবে প্রস্তাবিত) বিল্ডকনফিগ.ডাইবিউজি এবং com.mypackage.BuildConfig উভয়ই তৈরি করেছে .DeBUG রিপোর্ট প্রত্যাশিত হিসাবে মিথ্যা।
ক্রিস রায়ে

তুমি বুঝতে পেরেছ. এটাই প্রত্যাশিত আচরণ।
pbhowmick

10

অনুসন্ধান করুন imports, কখনও কখনও বিল্ডকনফিগ অবিচ্ছিন্নভাবে যে কোনও শ্রেণির পাঠাগার থেকে আমদানি করা হয়। উদাহরণ স্বরূপ:

import io.fabric.sdk.android.BuildConfig;

এই ক্ষেত্রে বিল্ডকনফিগ.ডিডিইউবিজি সর্বদা মিথ্যা ফেরত আসবে ;

import com.yourpackagename.BuildConfig;

এই ক্ষেত্রে বিল্ডকনফিগ.ডিইডিইউবিজি আপনার আসল বিল্ড বৈকল্পিকটি ফিরিয়ে দেবে ।

পিএস আমি কেবল এখানে আমার উত্তরটি থেকে এটি অনুলিপি করছি: গ্রেড সহ গ্রন্থাগার প্রকল্পগুলি তৈরি করার সময় বিল্ডকনফিগ.ডিইউবিজি সর্বদা মিথ্যা


1
হ্যাঁ, আমার জন্য এটি দুর্ঘটনাক্রমে আমদানি করা হয়েছিল android.support.compat। আমার ধারণা, অন্য একটি নাম দিয়ে নিজের ক্ষেত্রটি সংজ্ঞায়িত করার এটি অন্য কারণ reason
arekolek

5

মুক্তির জন্য প্রস্তুত থেকে :

লগিং এবং ডিবাগিং বন্ধ করুন

আপনি মুক্তির জন্য আপনার অ্যাপ্লিকেশনটি তৈরি করার আগে আপনি লগিং নিষ্ক্রিয় করেছেন এবং ডিবাগিং বিকল্পটি অক্ষম করেছেন তা নিশ্চিত করুন। আপনি আপনার উত্স ফাইলগুলিতে লগ পদ্ধতিতে কলগুলি সরিয়ে লগিং নিষ্ক্রিয় করতে পারেন। আপনি আপনার ম্যানিফেস্ট ফাইলের ট্যাগ থেকে অ্যান্ড্রয়েড: ডিবাগযোগ্য অ্যাট্রিবিউটটি সরিয়ে বা আপনার ম্যানিফেস্ট ফাইলটিতে অ্যান্ড্রয়েড: ডিবাগযোগ্য বৈশিষ্ট্যটি সেট করে ডিবাগিং অক্ষম করতে পারেন। এছাড়াও, আপনার প্রকল্পে তৈরি হওয়া কোনও লগ ফাইল বা স্থির পরীক্ষার ফাইলগুলি সরান।

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

আরও তথ্য লিঙ্ক অনুসরণ করা হয়।


1
আমি ভেবেছিলাম যে এই প্রক্রিয়াটি এখন সময় নির্ধারণের সময় স্বয়ংক্রিয়ভাবে ঘটে: developer.android.com/tools/sdk/tools-notes.html
IgorGanapolsky

সংকলন-সময় ত্রুটির কারণ: deb ডিবাগ মোডের হার্ডকোডিং এড়ানো; এটিকে ছেড়ে দিলে ডিবাগ এবং রিলিজ
বিল্ডকে

5

আমার জন্য সমাধান:

  1. প্রকল্প -> স্বয়ংক্রিয়ভাবে তৈরি করুন
  2. প্রকল্প -> পরিষ্কার
  3. প্রকল্প -> নির্মাণ
  4. প্রজেক্ট এক্সপোর্ট অ্যান্ড্রয়েড অ্যাপ্লিকেশন

এটি r20-এ কাজ


1
এটি এখনই আমার জন্য কাজ করেছে (আমার ধারনার সর্বশেষতম এডিটি ব্যবহার করে)। সম্ভবত পরিষ্কারটি এটি স্থির করেছে, নিশ্চিত নয়।
জনি

3

আপনি যদি APK রফতানির সময় অগ্রগতি ব্যবহার করেন তবে আমি একটি সাধারণ কাজের প্রস্তাব দিতে চাই।

প্রিগার্ড রিলিজ মোডে নির্দিষ্ট ফাংশনগুলিতে কলগুলি সরিয়ে দেওয়ার একটি উপায় সরবরাহ করে। ডিবাগিং লগের জন্য যে কোনও কল নিম্নলিখিত সেটিং-এর মাধ্যমে মুছে ফেলা যাবে proguard-project.txt

# Remove debug logs
-assumenosideeffects class android.util.Log {
    public static *** d(...);
    public static *** v(...);
}

এবং অপ্টিমাইজেশন সেটিংস ইন project.properties

proguard.config=${sdk.dir}/tools/proguard/proguard-android-optimize.txt:proguard-project.txt

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

সুতরাং বিল্ডকনফিগ.ডি.ইউবিউজি-র জন্য কার্যনির্বাহী নিম্নলিখিতগুলির মতো অগ্রগতির একই বৈশিষ্ট্যটি ব্যবহার করে।

public class DebugConfig {

    private static boolean debug = false;

    static {
        setDebug(); // This line will be removed by proguard in release.
    }

    private static void setDebug() {
        debug = true;
    }

    public static boolean isDebug() {
        return debug;
    }
}

এবং সেটিং অনুসরণ করে proguard-project.txt

-assumenosideeffects class com.neofect.rapael.client.DebugConfig {
    private static *** setDebug();
}

আমি Build Automaticallyবিকল্পটি অক্ষম করার জন্য এটি ব্যবহার করতে পছন্দ করব , কারণ এটি বিল্ডারের পৃথক আইডিই সেটিংয়ের উপর নির্ভর করে না তবে প্রতিশ্রুতিবদ্ধ ফাইল হিসাবে বজায় রাখা হয় যা বিকাশকারীদের মধ্যে ভাগ করা হয়।


1

আমি যতদূর বুঝতে পেরেছি ঠিকমতো কাজ করে না ( অ্যান্ড্রয়েড সমস্যা 22241 )

একটি প্রকল্পে (গ্রহের সাথে কাজ করা) আমার কিছুটা সমস্যা হয়েছিল, আমার প্রকল্পের একটি স্বাক্ষরিত APK রফতানি করার সময় এই ধ্রুবকটি সত্য হয় নি :(

শুনতে ভাল লাগবে যদিও এটি কাজ করে


1
এটি r17-এ ঠিক করা উচিত, এটি বাগ ট্র্যাকারের মতো চিহ্নিত।
স্মিথ 324

1
প্রকৃতপক্ষে রফতানি করার সময় এডিটিতে রিলিজ মোডে লিবস সংকলিত হয় না (পিঁপড়ে কাজ করে)। আমি কোড. google.com/p/android/issues/detail?id=27940
জাভিয়ের ডুক্রোহেট

1
@ এক্স এটিকে দেখার জন্য ধন্যবাদ, আমি আপনাকে এখন প্রতিশ্রুতি দেওয়া স্প্যামিং বন্ধ করব। এটি আসলে আমার মূল সমস্যা ছিল যা নিয়ে সমস্যা ছিল (নির্ভরযোগ্য লাইব্রেরির দিকে তাকান না)। যদি আমি একটি কংক্রিট পরীক্ষার কেস তৈরি করতে পারি তবে আমি এটি একই সমস্যার অধীনে বাগ ট্র্যাকারে পোস্ট করব।
স্মিথ 324

1

একটি ভাল উপায় আপনার নিজস্ব শ্রেণি তৈরি করছে:

public class Log {

public static void d(String message) {
    if (BuildConfig.DEBUG)
        android.util.Log.d(
            "[" + (new Exception().getStackTrace()[1].getClassName()) + "]",
            "{" + (new Exception().getStackTrace()[1].getMethodName()) + "} "
            + message
        );
}

}

12
এই পদ্ধতির সমস্যাটি হ'ল, যখন ইভেন্টটি ডিইবিইউজি মিথ্যা হয়, তখনও জাভা প্রতিটি স্ট্রিংকে এটি আপনার কাস্টম শ্রেণিতে পাস করার জন্য গণনা করবে। যদি (DEBUG) লগ.ডি (...) কম মার্জিত তবে আরও দক্ষ।
জেরেমিফা

0

আমি কিছু অদ্ভুত আচরণ দেখেছি যা বিল্ডকনফাইগের মানগুলি যখন তাদের চূড়ান্ত মানগুলিতে সেট করা হয় তখন তার সাথে করতে হয়। এটি আপনার ইস্যুটির সাথে কিছু করতে পারে।

সহজ ব্যাখ্যাটি হ'ল প্রগার্ড চালানোর আগে ডিফল্ট মানগুলি প্রথমে সেট করা হয়, তারপরে প্রোগার্ড চলার পরে, বিল্ডকনফিগ ফাইলটি যথাযথ মানগুলির সাথে পুনরায় জেনারেট হয়। যাইহোক, প্রোগার্ডটি ইতিমধ্যে এই কোডটি দ্বারা আপনার কোডটি অনুকূলিত করেছে এবং আপনার সমস্যা রয়েছে।

গ্রেডলের বিপরীতে আমি এখানে একটি বাগ তৈরি করেছি। https://code.google.com/p/android/issues/detail?id=182449

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