ADT ตั้งค่า BuildConfig.DEBUG เป็นเท็จเมื่อใด


110

ใน ADT (r17) เวอร์ชันใหม่ล่าสุดมีการเพิ่มค่าคงที่ที่สร้างขึ้นBuildConfig.DEBUGซึ่งตั้งค่าตามประเภทการสร้าง ปัญหาที่ฉันมีคือไม่เคยตั้งค่าเป็นเท็จฉันคาดว่ามันจะเปลี่ยนไปเมื่อทำ "Android Tools -> Export Signed Application Package" แต่มันไม่ได้สำหรับฉัน

แล้วฉันจะเปลี่ยนประเภทการสร้างได้อย่างไร?

เพิ่มคุณสมบัติที่ช่วยให้คุณสามารถรันโค้ดบางส่วนในโหมดดีบักเท่านั้น ตอนนี้บิวด์สร้างคลาสที่เรียกว่า BuildConfig ที่มีค่าคงที่ DEBUG ที่ตั้งค่าโดยอัตโนมัติตามประเภทการสร้างของคุณ คุณสามารถตรวจสอบค่าคงที่ (BuildConfig.DEBUG) ในโค้ดของคุณเพื่อเรียกใช้ฟังก์ชันดีบักเท่านั้น


2
BuildConfig.java ถูกสร้างขึ้นโดยอัตโนมัติโดยเครื่องมือสร้างของ Android และวางไว้ในโฟลเดอร์ gen APK ที่ลงนามควรมี BuildConfig.DEBUG = false ไม่น่าจะเป็นปัญหาสำหรับคุณ คุณไม่ควรสัมผัสไฟล์นั้นด้วยตนเอง ...
IgorGanapolsky

1
หากคุณใช้ gradle เพื่อปลดธงนี้เชื่อถือได้ 100% ดังนั้นเมื่อคุณทำ. /gradlew AssembleDebug เป็นจริงและเมื่อทำการรวบรวมปล่อยเท็จ
slott

คำตอบ:


56

ขณะนี้คุณสามารถรับพฤติกรรมที่ถูกต้องได้โดยปิดใช้งาน "Build Automatically" ล้างโปรเจ็กต์จากนั้นส่งออกผ่าน "Android Tools -> Export Signed Application Package" เมื่อคุณเรียกใช้แอปพลิเคชันBuildConfig.DEBUGควรเป็นเท็จ


เสียด้วย. ซึ่งมีผลจากการแสดงข้อความ Log.d ทั้งหมดซึ่งควรละเว้นโดยแฟล็กนี้ ปล. จะยื่นรายงานข้อบกพร่องได้ที่ไหน
tomi

ของฉันเป็นเท็จเสมอแม้ว่าจะทำการดีบั๊กก็ตาม
behelit

40

ด้วยEclipseฉันมักจะปิดใช้งานตัวเลือก "Build Automatically" ก่อนที่จะส่งออกแอปในรุ่น จากนั้นฉันทำความสะอาดโครงการและส่งออก มิฉะนั้นจะเริ่มคอมไพล์ในโหมดดีบักจากนั้นค่าของ BuildConfig.DEBUG อาจผิด

ด้วยAndroid Studioฉันเพียงแค่เพิ่มตัวแปรที่กำหนดเองใน build.gradle:

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

เมื่อฉันสร้างโครงการ BuildConfig.java จะถูกสร้างขึ้นดังนี้:

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

จากนั้นในรหัสของฉันฉันสามารถใช้:

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

ฉันขอแนะนำให้ทำความสะอาดหลังจากเปลี่ยนการแก้จุดบกพร่อง / ปล่อยบิลด์


1
วิธีนี้ดีที่สุดถ้าคุณใช้ proguard เพราะจะสร้างค่าคงที่ที่มีค่าตามตัวอักษรดังนั้นโค้ดดีบักของคุณจะถูกลบออกจากไบนารีในโหมดรีลีสโดยสิ้นเชิง
Victor Laerte

33

มันทำงานไม่ถูกต้อง:

ปัญหา27940 : BuildConfig.DEBUG เป็น "จริง" สำหรับแพ็กเกจแอปพลิเคชันที่ส่งออก

มันน่าผิดหวังที่บางครั้งพวกเขาปล่อยฟีเจอร์บั๊กกี้


9
โปรดไปที่ลิงก์ไปยังปัญหาที่กล่าวถึงข้างต้นและ "ติดดาว" หากคุณต้องการแก้ไขปัญหานี้
Guy

11

มันใช้งานได้ แต่โปรดทราบว่าไฟล์โค้ดจะไม่เปลี่ยนแปลงแม้ว่าจะส่งออกไฟล์ที่เซ็นชื่อแล้วก็ตาม กระบวนการส่งออกจะเปลี่ยนค่าของตัวแปรนี้เป็นเท็จซึ่งอาจทำให้คุณเข้าใจผิดว่าไม่ทำงาน ฉันทดสอบสิ่งนี้ด้วยคำสั่งการบันทึกเช่น

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

เมื่อทำการทดสอบคำสั่ง Log ของฉันจะไม่สร้างผลลัพธ์ใด ๆ อีกต่อไป


1
คุณทำอะไรกันแน่?
pbhowmick

2
ฉันเปลี่ยนอินสแตนซ์ของ BuildConfig.DEBUG เป็น com.mypackage.BuildConfig.DEBUG จากนั้นเรียกใช้แอปอีกครั้ง ... และมันก็ยังคงเป็นจริงตลอดเวลา บางทีฉันอาจเข้าใจคำแนะนำของคุณผิด
Chris Rae

1
สิ่งที่ฉันพูดคือรหัสจะไม่เปลี่ยนแปลง อย่างไรก็ตาม com.mypackage.BuildConfig.DEBUG จะถูกตั้งค่าเป็น False post compilation ลองทดสอบคำสั่งการบันทึกตามด้านบน (เลือกสตริงที่กำหนดเองเพื่อบันทึก) ทำการส่งออกจากนั้นเรียกใช้ ดูว่า adb แสดงคำสั่งการบันทึกหรือไม่ ฉันจะพนันว่า adb จะไม่รายงานคำสั่งการบันทึกนั้นแสดงว่า DEUBUG ถูกตั้งค่าเป็นเท็จ
pbhowmick

1
ฉันไม่แน่ใจว่าฉันรู้ว่าคุณหมายถึงอะไรเกี่ยวกับ "รหัส" ... อย่างไรก็ตามฉันจะบอกว่าการทำความสะอาดก่อนส่งออก APK (ตามที่แนะนำในคำตอบที่ยอมรับ) ทำให้ทั้ง BuildConfig.DEBUG และ com.mypackage.BuildConfig .DEBUG รายงานเท็จตามที่คาดไว้
Chris Rae

คุณเข้าใจแล้ว นั่นคือพฤติกรรมที่คาดหวัง
pbhowmick

10

ตรวจสอบimportsบางครั้งBuildConfigถูกอิมพอร์ตจากคลาสของไลบรารีใด ๆ โดยไม่ได้ตั้งใจ ตัวอย่างเช่น:

import io.fabric.sdk.android.BuildConfig;

ในกรณีนี้BuildConfig.DEBUGมักจะกลับเท็จ ;

import com.yourpackagename.BuildConfig;

ในกรณีนี้BuildConfig.DEBUGจะกลับมาของคุณสร้างความแตกต่างที่แท้จริง

ps ฉันเพิ่งคัดลอกอันนี้จากคำตอบของฉันที่นี่: BuildConfig.DEBUG เท็จเสมอเมื่อสร้างโครงการไลบรารีด้วย gradle


1
ใช่สำหรับฉันมันถูกนำเข้าโดยบังเอิญจากandroid.support.compat. ฉันเดาว่านั่นเป็นอีกเหตุผลหนึ่งในการกำหนดเขตข้อมูลของคุณเองด้วยชื่ออื่น
arekolek

5

จากการเตรียมการเปิดตัว :

ปิดการบันทึกและการดีบัก

ตรวจสอบให้แน่ใจว่าคุณปิดใช้งานการบันทึกและปิดใช้งานตัวเลือกการดีบักก่อนที่จะสร้างแอปพลิเคชันของคุณสำหรับรุ่น คุณสามารถปิดใช้งานการบันทึกได้โดยลบการโทรไปยังเมธอด Log ในไฟล์ต้นทางของคุณ คุณสามารถปิดใช้งานการดีบักได้โดยการลบแอตทริบิวต์ android: debuggable ออกจากแท็กในไฟล์ manifest หรือโดยการตั้งค่าแอตทริบิวต์ android: debuggable เป็น false ในไฟล์รายการของคุณ นอกจากนี้ให้ลบไฟล์บันทึกหรือไฟล์ทดสอบแบบคงที่ที่สร้างขึ้นในโครงการของคุณ

นอกจากนี้คุณควรลบการเรียกการติดตามแก้จุดบกพร่องทั้งหมดที่คุณเพิ่มลงในโค้ดของคุณเช่นการเรียกเมธอด startMethodTracing () และ stopMethodTracing ()

ข้อมูลเพิ่มเติมตามลิงค์


1
ฉันคิดว่ากระบวนการนี้เกิดขึ้นโดยอัตโนมัติในเวลาสร้าง: developer.android.com/tools/sdk/tools-notes.html
IgorGanapolsky

ทำให้เกิดข้อผิดพลาดเวลาคอมไพล์: «หลีกเลี่ยงการฮาร์ดโค้ดโหมดดีบัก การปล่อยทิ้งไว้จะช่วยให้การดีบักและรีลี
สบิวด์

5

ทางออกสำหรับฉัน:

  1. โครงการ -> สร้างโดยอัตโนมัติ
  2. โครงการ -> ทำความสะอาด
  3. โครงการ -> สร้าง
  4. โครงการส่งออกแอปพลิเคชัน Android

มันทำงานใน r20


1
สิ่งนี้ใช้ได้ผลสำหรับฉันในตอนนี้ (โดยใช้ ADT ล่าสุดฉันเดา) บางทีการทำความสะอาดคงไม่แน่ใจ
จอนนี่

3

ฉันต้องการเสนอวิธีแก้ปัญหาง่ายๆหากคุณใช้ proguard ระหว่างการส่งออก APK

Proguard มีวิธีลบการโทรไปยังฟังก์ชันเฉพาะในโหมดปลด 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

ด้วยสิ่งนี้คุณไม่จำเป็นต้องกังวลเกี่ยวกับการคำนวณสตริงที่ไม่จำเป็นใด ๆ ที่ส่งผ่านไปยังบันทึกการดีบักที่ @Jeremyfa ชี้ไว้ การคำนวณจะถูกลบออกในรุ่นรุ่น

ดังนั้นวิธีแก้ปัญหาสำหรับ BuildConfig.DEBUG ใช้คุณสมบัติเดียวกันของ proguard ดังต่อไปนี้

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ตัวเลือกนี้เนื่องจากไม่ได้ขึ้นอยู่กับการตั้งค่า IDE ของผู้สร้าง แต่จะเก็บรักษาเป็นไฟล์ที่มีการผูกมัดซึ่งจะแชร์ระหว่างนักพัฒนา


1

ทำงานไม่ถูกต้องเท่าที่ฉันเข้าใจ ( ปัญหา Android 22241 )

ฉันมีปัญหากับโปรเจ็กต์ (ทำงานกับ Eclipse) ค่าคงที่นั้นไม่ได้ถูกตั้งค่าเป็นจริงเมื่อส่งออก APK ที่เซ็นชื่อของโปรเจ็กต์ของฉัน :(

ชอบที่จะได้ยินว่ามันใช้งานได้ดี


1
ควรได้รับการแก้ไขใน r17 ซึ่งมีเครื่องหมายในตัวติดตามข้อบกพร่อง
smith324

1
จริงๆแล้ว libs จะไม่ถูกคอมไพล์ในโหมดรีลีสใน ADT เมื่อส่งออก (ทำงานใน Ant) ฉันอัปเดตcode.google.com/p/android/issues/detail?id=27940
Xavier Ducrohet

1
@Xav ขอบคุณสำหรับการตรวจสอบฉันจะหยุดส่งสแปมคุณตอนนี้สัญญา จริงๆแล้วมันเป็นโปรเจ็กต์หลักที่ฉันมีปัญหา (ไม่ได้ดูที่ไลบรารีที่เกี่ยวข้อง) ถ้าฉันสามารถสร้างกรณีทดสอบที่เป็นรูปธรรมได้ฉันจะโพสต์ไปที่ตัวติดตามข้อบกพร่องภายใต้ปัญหาเดียวกัน
smith324

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 เป็นเท็จ java จะยังคงคำนวณแต่ละ String เพื่อส่งต่อไปยังคลาสที่คุณกำหนดเอง ถ้า (DEBUG) Log.d (... ) มีความหรูหราน้อยกว่า แต่มีประสิทธิภาพมากกว่า
Jeremyfa

0

ฉันเคยเห็นพฤติกรรมแปลก ๆ บางอย่างที่เกี่ยวข้องกับเมื่อค่าใน BuildConfig ถูกตั้งค่าเป็นค่าสุดท้าย สิ่งนี้อาจเกี่ยวข้องกับปัญหาของคุณ

คำอธิบายง่ายๆคือค่าดีฟอลต์จะถูกตั้งค่าในขั้นต้นก่อนที่จะรัน Proguard จากนั้นหลังจากที่ Proguard รันไฟล์ BuildConfig จะถูกสร้างใหม่ด้วยค่าที่เหมาะสม อย่างไรก็ตาม Proguard ได้เพิ่มประสิทธิภาพโค้ดของคุณแล้ว ณ จุดนี้และคุณมีปัญหา

นี่คือจุดบกพร่องที่ฉันสร้างขึ้นกับ Gradle https://code.google.com/p/android/issues/detail?id=182449

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