Làm cách nào để phát hiện nếu tôi ở chế độ phát hành hoặc gỡ lỗi?


374

Làm cách nào tôi có thể phát hiện trong mã của mình rằng tôi đang ở chế độ Phát hành hoặc chế độ Gỡ lỗi?

Câu trả lời:


770

Giải pháp đơn giản và lâu dài nhất là sử dụng BuildConfig.DEBUG. Đây là một booleangiá trị sẽ truedành cho bản dựng gỡ lỗi, falsenếu không:

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

Đã có báo cáo rằng giá trị này không đáng tin cậy 100% từ các bản dựng dựa trên Eclipse, mặc dù cá nhân tôi không gặp phải vấn đề nào, vì vậy tôi không thể nói nó thực sự là bao nhiêu vấn đề.

Nếu bạn đang sử dụng Android Studio hoặc nếu bạn đang sử dụng Gradle từ dòng lệnh, bạn có thể thêm nội dung của riêng mình vào BuildConfighoặc chỉnh sửa các loại debugreleasexây dựng để giúp phân biệt các tình huống này khi chạy.

Giải pháp từ Đối số bất hợp pháp dựa trên giá trị của android:debuggablecờ trong tệp kê khai. Nếu đó là cách bạn muốn phân biệt bản dựng "gỡ lỗi" với bản dựng "phát hành", thì theo định nghĩa, đó là giải pháp tốt nhất. Tuy nhiên, hãy nhớ rằng về phía trước, debuggablecờ thực sự là một khái niệm độc lập với những gì Gradle / Android Studio coi là bản dựng "gỡ lỗi". Bất kỳ loại bản dựng nào cũng có thể chọn đặt debuggablecờ thành bất kỳ giá trị nào có ý nghĩa đối với nhà phát triển đó và cho loại bản dựng đó.


34
BuildConfignằm trong gói phần mềm ứng dụng của bạn, ví dụ:import com.mycompany.myapp.BuildConfig;
Chris Cirefice

10
do lỗi trong AndroiStudio, nó không hoạt động nữa, nó luôn sai, ngay cả trong chế độ DEBUG
user387184

1
@ user387184: Trong Android Studio 1.2.2, tôi nhận được public static final boolean DEBUG = Boolean.parseBoolean("true");bản dựng gỡ lỗi. Trong khi đó là một cách kỳ lạ để thiết lập DEBUGđể true, cần làm việc. Nếu bạn thấy điều này trong một trong các bản phát hành thử nghiệm 1.3.0 hoặc nếu bạn có trường hợp kiểm tra có thể lặp lại cho 1.2.2, vui lòng gửi một vấn đề . Tôi không thấy bất kỳ vấn đề nổi bật nào báo cáo vấn đề này.
CommonsWare

2
Tôi đang sử dụng v1.2.2 và BuildConfig.DEBUG luôn luôn sai, sau đó tôi đã thử đề xuất bên dưới phù hợp với tôi - tôi cũng sẽ thử bạn - cảm ơn rất nhiều!
dùng387184

3
Hóa ra, điều này sẽ không hoạt động khi sử dụng thư viện (luôn trả về đúng): stackoverflow.com/q/20176284/878126 . Tự hỏi đâu là sự thay thế tốt nhất
nhà phát triển Android

59

Hãy thử như sau:

boolean isDebuggable =  ( 0 != ( getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE ) );

Kotlin:

val isDebuggable = 0 != applicationInfo.flags and ApplicationInfo.FLAG_DEBUGGABLE

Nó được lấy từ các gói bài từ đây


3
Câu trả lời này sẽ hoạt động trong mọi trường hợp bất kể dự án thư viện hoặc dự án ứng dụng.
Lavekush Agrawal

Những gì cần phải được nhập khẩu getApplicationInfo().flagsđể làm việc?
A1m

1
ok nó chỉ không hoạt động trong bối cảnh tĩnh, xem stackoverflow.com/questions/10641144/ cấp
A1m

54

Có, bạn sẽ không gặp vấn đề gì khi sử dụng:

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

Trừ khi bạn đang nhập sai lớp BuildConfig. Hãy chắc chắn rằng bạn đang tham khảo lớp BuildConfig của dự án của bạn, không phải từ bất kỳ thư viện phụ thuộc nào của bạn.

nhập mô tả hình ảnh ở đây


1
"Trừ khi bạn nhập sai lớp BuildConfig" ... Vâng, điểm rất hay: D
Benjamin Piette

Cảm ơn! Đây là vấn đề trong dự án của tôi, bằng cách nào đó, nó đã chọn BuildConfig của dự án thư viện (luôn ở chế độ phát hành cho đến khi Android Studio 3 xuất hiện)
Amit Garg

36

Do các ý kiến ​​trái chiều về BuildConfig.DEBUG, tôi đã sử dụng cách sau để vô hiệu hóa crashlytics (và phân tích) trong chế độ gỡ lỗi:

cập nhật /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'
        }
    }
}

sau đó, trong mã của bạn, bạn phát hiện ENABLE_CRASHLYTICScờ như sau:

    if (BuildConfig.ENABLE_CRASHLYTICS)
    {
        // enable crashlytics and answers (Crashlytics by default includes Answers)
        Fabric.with(this, new Crashlytics());
    }

sử dụng khái niệm tương tự trong ứng dụng của bạn và đổi tên ENABLE_CRASHLYTICSthành bất cứ điều gì bạn muốn. Tôi thích cách tiếp cận này vì tôi có thể thấy cờ trong cấu hình và tôi có thể điều khiển cờ.


Bạn không nên gọi riêng Crashlytics và câu trả lời. Chỉ cần sử dụng: Fabric.with (cái này, Crashlytics ()) mới; để bao gồm Crashlytics và câu trả lời.
Mike Bonell

1
Cảm ơn, @MikeBonnell, tôi đã thực hiện thay đổi mã thành mã ví dụ
Ai đó ở đâu đó vào

Tôi không thấy điều này khác với việc sử dụng BuildConfig.DEBUG như thế nào - nếu bạn chỉ đặt BuildConfig.ENABLE_CRASHLYTICS cho các bản dựng gỡ lỗi của mình thì BuildConfig.DEBUG và BuildConfig.ENABLE_CRASHLYTICS sẽ luôn có cùng giá trị phải không?
k2col

Tôi nghĩ rằng dev đang làm việc trên các dự án thư viện có vấn đề phát hiện các bản dựng gỡ lỗi / phát hành bằng BuildConfig.DEBUG. Có thể đã xảy ra lỗi Android Studio sớm ...
Ai đó ở đâu đó vào

13

Ngoài ra, bạn có thể phân biệt bằng BuildConfig.BUILD_TYPE;

Nếu bạn đang chạy bản dựng gỡ lỗi BuildConfig.BUILD_TYPE.equals("debug");trả về đúng. Và cho phát hành xây dựng BuildConfig.BUILD_TYPE.equals("release");trả về đúng sự thật.


1
Đây là câu trả lời chính xác. Trả về "phát hành" trong khi BuildConfig.DEBUG luôn trả về true.
Minas Mina

6

Tôi đang sử dụng giải pháp này trong trường hợp để biết rằng ứng dụng của tôi đang chạy trên phiên bản gỡ lỗi.

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

1
Vui lòng thêm mô tả vào câu trả lời của bạn. Nó sẽ hữu ích hơn chỉ là một đoạn mã.
Mathews Nắng

Tôi đã sử dụng if (BuildConfig.DEBUG) {} trong một mô-đun lớp phụ thuộc (dĩ nhiên) KHÔNG CÓ GIỚI THIỆU đối với tệp build.gradle của ứng dụng - điều này khiến chế độ gỡ lỗi bị nhận ra sai cách. if (BuildConfig.BUILD_TYPE.equals("Debug")){ }CỐ ĐỊNH vấn đề. Cảm ơn
kosiara - Bartosz Kosarzycki

Đây là câu trả lời thực sự, chỉ cần thay đổi "Gỡ lỗi" thành "gỡ lỗi"
Jetwiz

1

Đảm bảo rằng bạn đang nhập đúng lớp BuildConfig Và vâng, bạn sẽ không gặp vấn đề gì khi sử dụng:

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

Điều này chỉ hoạt động tốt! Cảm ơn bạn!
sud007
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.