ฉันจะตรวจจับในรหัสของฉันว่าฉันอยู่ในโหมด Release หรือโหมด Debug ได้อย่างไร
ฉันจะตรวจจับในรหัสของฉันว่าฉันอยู่ในโหมด Release หรือโหมด Debug ได้อย่างไร
คำตอบ:
วิธีแก้ปัญหาระยะยาวที่ง่ายและดีที่สุดคือการใช้ 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
แฟล็กเป็นค่าใดก็ได้ที่เหมาะสมสำหรับผู้พัฒนานั้นและสำหรับประเภทบิลด์นั้น
public static final boolean DEBUG = Boolean.parseBoolean("true");
debug ขณะที่เป็นวิธีที่แปลกประหลาดชุดDEBUG
ไปtrue
ก็ควรจะทำงาน หากคุณกำลังเห็นนี้ในหนึ่งใน 1.3.0 รุ่นทดสอบหรือหากคุณมีกรณีทดสอบทำซ้ำสำหรับ 1.2.2 โปรดยื่นปัญหา ฉันไม่เห็นปัญหายอดเยี่ยมใด ๆ ที่รายงานปัญหานี้
ลองทำสิ่งต่อไปนี้:
boolean isDebuggable = ( 0 != ( getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE ) );
Kotlin:
val isDebuggable = 0 != applicationInfo.flags and ApplicationInfo.FLAG_DEBUGGABLE
มันมาจากการโพสต์ bundells จากที่นี่
getApplicationInfo().flags
การทำงาน
ใช่คุณจะไม่มีปัญหาในการใช้:
if (BuildConfig.DEBUG) {
//It's not a release version.
}
เว้นแต่ว่าคุณกำลังนำเข้าคลาส BuildConfig ที่ไม่ถูกต้อง ตรวจสอบให้แน่ใจว่าคุณกำลังอ้างอิงคลาส BuildConfig ของโครงการไม่ใช่จากไลบรารีอ้างอิงใด ๆ ของคุณ
เนื่องจากความคิดเห็นแบบผสมเกี่ยวกับ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
เป็นอะไรก็ได้ที่คุณต้องการ ฉันชอบวิธีนี้เพราะฉันสามารถดูการตั้งค่าสถานะในการกำหนดค่าและฉันสามารถควบคุมการตั้งค่าสถานะ
อีกวิธีหนึ่งคุณสามารถแยกความแตกต่างโดยใช้BuildConfig.BUILD_TYPE
หากคุณกำลังเรียกใช้ debug build
BuildConfig.BUILD_TYPE.equals("debug");
จะส่งคืนจริง และสำหรับรุ่นบิลด์BuildConfig.BUILD_TYPE.equals("release");
จะส่งคืนจริง
true
ในขณะที่ผลตอบแทน
ฉันใช้โซลูชันนี้เพื่อตรวจสอบว่าแอปของฉันกำลังทำงานในเวอร์ชันแก้ไขข้อบกพร่อง
if (BuildConfig.BUILD_TYPE.equals("Debug")){
//Do something
}
if (BuildConfig.DEBUG) {}
ในโมดูล gradle ที่ขึ้นต่อกันซึ่งไม่มีการอ้างอิงถึงไฟล์ build.gradle ของแอปซึ่งทำให้โหมดการดีบักได้รับการยอมรับในทางที่ผิด if (BuildConfig.BUILD_TYPE.equals("Debug")){ }
แก้ไขปัญหาแล้ว ขอบคุณ
ตรวจสอบให้แน่ใจว่าคุณกำลังนำเข้าคลาส BuildConfig ที่ถูกต้องและใช่คุณจะไม่มีปัญหาในการใช้:
if (BuildConfig.DEBUG) {
//It's not a release version.
}
BuildConfig
ตั้งอยู่ในแพ็คเกจแอปของคุณเช่นimport com.mycompany.myapp.BuildConfig;