ฉันจะตรวจสอบได้อย่างไรว่าฉันอยู่ในโหมดรีลีสหรือดีบั๊ก


คำตอบ:


770

วิธีแก้ปัญหาระยะยาวที่ง่ายและดีที่สุดคือการใช้ BuildConfig.DEBUGที่ง่ายและดีที่สุดแก้ปัญหาระยะยาวคือการใช้งานนี่คือbooleanค่าที่จะใช้trueสำหรับการตรวจแก้จุดบกพร่องfalseมิฉะนั้น:

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

มีรายงานว่าค่านี้ไม่น่าเชื่อถือ 100% จากการสร้างโดยใช้ Eclipse แม้ว่าฉันเองจะไม่พบปัญหาดังนั้นฉันไม่สามารถบอกได้ว่าปัญหามันเป็นเรื่องจริงมากเพียงใด

หากคุณใช้ Android Studio หรือถ้าคุณใช้ Gradle จากบรรทัดคำสั่งคุณสามารถเพิ่มสิ่งของของคุณเองBuildConfigหรือปรับแต่งdebugและreleaseสร้างชนิดเพื่อแยกแยะสถานการณ์เหล่านี้ในขณะทำงาน

การแก้ปัญหาจากการโต้แย้งที่ผิดกฎหมายขึ้นอยู่กับค่าของการandroid:debuggableตั้งค่าสถานะในรายการ หากนั่นคือวิธีที่คุณต้องการแยกแยะ "debug" บิลด์จากบิลด์ "ปล่อย" จากนั้นตามคำนิยามนั่นคือทางออกที่ดีที่สุด อย่างไรก็ตามโปรดจำไว้ว่าการก้าวไปข้างหน้าการdebuggableตั้งค่าสถานะเป็นแนวคิดอิสระจากสิ่งที่ Gradle / Android Studio พิจารณาว่าเป็นการสร้าง "debug" ชนิดบิลด์ใด ๆ สามารถเลือกที่จะตั้งค่าdebuggableแฟล็กเป็นค่าใดก็ได้ที่เหมาะสมสำหรับผู้พัฒนานั้นและสำหรับประเภทบิลด์นั้น


34
BuildConfigตั้งอยู่ในแพ็คเกจแอปของคุณเช่นimport com.mycompany.myapp.BuildConfig;
Chris Cirefice

10
เนื่องจากข้อผิดพลาดใน AndroiStudio นี้ไม่ทำงานอีกต่อไปมันเป็นเท็จเสมอแม้ในโหมด DEBUG
user387184

1
@ user387184: ใน Android Studio 1.2.2 ฉันได้รับแล้ว public static final boolean DEBUG = Boolean.parseBoolean("true"); debug ขณะที่เป็นวิธีที่แปลกประหลาดชุดDEBUGไปtrueก็ควรจะทำงาน หากคุณกำลังเห็นนี้ในหนึ่งใน 1.3.0 รุ่นทดสอบหรือหากคุณมีกรณีทดสอบทำซ้ำสำหรับ 1.2.2 โปรดยื่นปัญหา ฉันไม่เห็นปัญหายอดเยี่ยมใด ๆ ที่รายงานปัญหานี้
CommonsWare

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

มันมาจากการโพสต์ bundells จากที่นี่


3
คำตอบนี้จะทำงานในทุกกรณีโดยไม่คำนึงถึงโครงการห้องสมุดหรือโครงการแอปพลิเคชัน
Lavekush Agrawal

สิ่งที่ต้องนำเข้าสำหรับgetApplicationInfo().flagsการทำงาน
A1m

1
ตกลงมันไม่ทำงานในบริบทแบบคงที่ดูstackoverflow.com/questions/10641144/…
A1m

54

ใช่คุณจะไม่มีปัญหาในการใช้:

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

เว้นแต่ว่าคุณกำลังนำเข้าคลาส BuildConfig ที่ไม่ถูกต้อง ตรวจสอบให้แน่ใจว่าคุณกำลังอ้างอิงคลาส BuildConfig ของโครงการไม่ใช่จากไลบรารีอ้างอิงใด ๆ ของคุณ

ป้อนคำอธิบายรูปภาพที่นี่


1
"เว้นแต่คุณจะนำเข้าคลาส BuildConfig ที่ไม่ถูกต้อง" ... ใช่แล้วจุดดีมาก: D
Benjamin Piette

ขอบคุณ! นี่เป็นปัญหาในโครงการของฉัน แต่อย่างใดมันก็มารับ BuildConfig ของโครงการห้องสมุด (ซึ่งมักจะปล่อยโหมดจนกว่า Android Studio 3 จะออกมา)
Amit Garg

36

เนื่องจากความคิดเห็นแบบผสมเกี่ยวกับBuildConfig.DEBUGฉันใช้สิ่งต่อไปนี้เพื่อปิดใช้งาน crashlytics (และการวิเคราะห์) ในโหมดแก้ไขข้อบกพร่อง:

อัปเดต /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เป็นอะไรก็ได้ที่คุณต้องการ ฉันชอบวิธีนี้เพราะฉันสามารถดูการตั้งค่าสถานะในการกำหนดค่าและฉันสามารถควบคุมการตั้งค่าสถานะ


คุณไม่ควรเรียก Crashlytics และ Answers แยกต่างหาก เพียงใช้: Fabric.with (นี่คือ Crashlytics ใหม่) () เพื่อรวม Crashlytics และ Answers
Mike Bonnell

1
ขอบคุณ @MikeBonnell ฉันเปลี่ยนรหัสเป็นโค้ดตัวอย่าง
คนอยู่ที่ไหนสักแห่ง

ฉันไม่เห็นว่าสิ่งนี้แตกต่างจากการใช้ BuildConfig.DEBUG อย่างไร - หากคุณตั้งค่า BuildConfig.ENABLE_CRASHLYTICS สำหรับการดีบักบิลด์ของคุณบิวด์ BuildConfig.DEBUG และ BuildConfig.ENABLE_CRASHLYTICS จะมีค่าเดียวกันเสมอใช่ไหม
k2col

ฉันคิดว่าการทำงานของ dev ในโครงการห้องสมุดมีปัญหาในการตรวจสอบการดีบัก / ปล่อยบิลด์โดยใช้ BuildConfig.DEBUG อาจมีข้อผิดพลาดในช่วงต้นของ Android Studio เช่นกัน ...
บางคนที่ไหนสักแห่ง

13

อีกวิธีหนึ่งคุณสามารถแยกความแตกต่างโดยใช้BuildConfig.BUILD_TYPE

หากคุณกำลังเรียกใช้ debug build BuildConfig.BUILD_TYPE.equals("debug");จะส่งคืนจริง และสำหรับรุ่นบิลด์BuildConfig.BUILD_TYPE.equals("release");จะส่งคืนจริง


1
นี่คือคำตอบที่ถูกต้อง ผลตอบแทน "ปล่อย" trueในขณะที่ผลตอบแทน
Minas Mina

6

ฉันใช้โซลูชันนี้เพื่อตรวจสอบว่าแอปของฉันกำลังทำงานในเวอร์ชันแก้ไขข้อบกพร่อง

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

1
โปรดเพิ่มคำอธิบายให้กับคำตอบของคุณ มันจะมีประโยชน์มากกว่ารหัสเพียงส่วนหนึ่ง
แมทธิวส์ซันนี่

ฉันใช้if (BuildConfig.DEBUG) {} ในโมดูล gradle ที่ขึ้นต่อกันซึ่งไม่มีการอ้างอิงถึงไฟล์ build.gradle ของแอปซึ่งทำให้โหมดการดีบักได้รับการยอมรับในทางที่ผิด if (BuildConfig.BUILD_TYPE.equals("Debug")){ }แก้ไขปัญหาแล้ว ขอบคุณ
kosiara - Bartosz Kosarzycki

นี่คือคำตอบที่แท้จริงเพียงแค่เปลี่ยน "Debug" เป็น "debug"
Jetwiz

1

ตรวจสอบให้แน่ใจว่าคุณกำลังนำเข้าคลาส BuildConfig ที่ถูกต้องและใช่คุณจะไม่มีปัญหาในการใช้:

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

มันใช้งานได้ดี! ขอบคุณ!
sud007
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.