ฉันจะตรวจจับในรหัสของฉันว่าฉันอยู่ในโหมด 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;