Bagaimana saya mendeteksi jika saya dalam mode rilis atau debug?

374

Bagaimana saya bisa mendeteksi dalam kode saya bahwa saya dalam mode Rilis atau mode Debug?

David
sumber

Jawaban:

770

Solusi jangka panjang yang paling sederhana dan terbaik adalah menggunakan BuildConfig.DEBUG. Ini adalah booleannilai yang akan trueuntuk membangun debug, falsejika tidak:

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

Ada laporan bahwa nilai ini tidak dapat diandalkan 100% dari build berbasis Eclipse, meskipun saya secara pribadi belum mengalami masalah, jadi saya tidak bisa mengatakan berapa banyak masalah sebenarnya.

Jika Anda menggunakan Android Studio, atau jika Anda menggunakan Gradle dari baris perintah, Anda dapat menambahkan barang-barang Anda sendiri BuildConfigatau men-tweak debugdan releasemembangun tipe untuk membantu membedakan situasi ini saat runtime.

Solusi dari Argumen Ilegal didasarkan pada nilai android:debuggablebendera dalam manifes. Jika Anda ingin membedakan build "debug" dari build "release", maka menurut definisi, itulah solusi terbaik. Namun, ingatlah bahwa untuk maju, debuggablebendera tersebut benar-benar sebuah konsep independen dari apa yang dianggap Gradle / Android Studio sebagai build "debug". Setiap tipe build dapat memilih untuk mengatur debuggableflag ke nilai apa pun yang masuk akal untuk developer itu dan untuk tipe build tersebut.

CommonsWare
sumber
34
BuildConfigterletak di paket aplikasi Anda, mis.import com.mycompany.myapp.BuildConfig;
Chris Cirefice
10
karena bug di AndroiStudio ini tidak berfungsi lagi, itu selalu salah, bahkan dalam mode DEBUG
user387184
1
@ user387184: Di Android Studio 1.2.2, saya dapat public static final boolean DEBUG = Boolean.parseBoolean("true");debug build. Sementara itu adalah cara aneh untuk set DEBUGke true, itu harus bekerja. Jika Anda melihat ini di salah satu rilis uji 1.3.0, atau jika Anda memiliki case uji yang dapat direproduksi untuk 1.2.2, silakan ajukan masalah . Saya tidak melihat masalah luar biasa yang melaporkan masalah ini.
CommonsWare
2
Saya menggunakan v1.2.2 dan BuildConfig.DEBUG selalu salah, maka saya mencoba saran di bawah ini yang berfungsi untuk saya - saya akan mencoba milik Anda juga - terima kasih banyak!
user387184
3
Ternyata, ini tidak akan berfungsi ketika menggunakan perpustakaan (selalu mengembalikan true): stackoverflow.com/q/20176284/878126 . Bertanya-tanya apa alternatif terbaik
pengembang android
59

Coba yang berikut ini:

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

Kotlin:

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

Ini diambil dari pos bundel dari sini

Argumen Ilegal
sumber
3
Jawaban ini akan berfungsi dalam semua kasus terlepas dari proyek perpustakaan atau proyek aplikasi.
Lavekush Agrawal
Apa yang perlu diimpor untuk getApplicationInfo().flagsbekerja?
A1m
1
ok itu tidak berfungsi dalam konteks statis, lihat stackoverflow.com/questions/10641144/...
A1m
54

Ya, Anda tidak akan mengalami masalah dalam menggunakan:

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

Kecuali Anda mengimpor kelas BuildConfig yang salah. Pastikan Anda mereferensikan kelas BuildConfig proyek Anda, bukan dari pustaka dependensi Anda.

masukkan deskripsi gambar di sini

Vansuita Jr.
sumber
1
"Kecuali kamu mengimpor kelas BuildConfig yang salah" ... Ya, poin yang sangat bagus: D
Benjamin Piette
Terima kasih! Ini adalah masalah dalam proyek saya, entah bagaimana ia mengambil BuildConfig proyek perpustakaan (yang selalu melepaskan mode hingga Android Studio 3 keluar)
Amit Garg
36

Karena komentar campuran tentang BuildConfig.DEBUG , saya menggunakan berikut ini untuk menonaktifkan crashlytics (dan analitik) dalam mode debug:

perbarui / 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'
        }
    }
}

kemudian, dalam kode Anda, Anda mendeteksi ENABLE_CRASHLYTICSbendera sebagai berikut:

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

gunakan konsep yang sama di aplikasi Anda dan ganti nama ENABLE_CRASHLYTICSmenjadi apa pun yang Anda inginkan. Saya suka pendekatan ini karena saya bisa melihat flag di konfigurasi dan saya bisa mengendalikan flag.

Seseorang disuatu tempat
sumber
Anda seharusnya tidak memanggil Crashlytics dan Answers secara terpisah. Cukup gunakan: Fabric.with (ini, Crashlytics baru ()); untuk memasukkan Crashlytics dan Answers.
Mike Bonnell
1
Terima kasih, @MikeBonnell, saya membuat kode berubah menjadi kode contoh
Seseorang di suatu tempat
Saya tidak melihat bagaimana ini berbeda dari menggunakan BuildConfig.DEBUG - jika Anda hanya menetapkan BuildConfig.ENABLE_CRASHLYTICS untuk build debug Anda, maka BuildConfig.DEBUG dan BuildConfig.EABLE_CRASHLYTICS akan selalu memiliki nilai yang sama, kan?
k2col
Saya pikir dev yang bekerja pada proyek perpustakaan memiliki masalah dalam mendeteksi debug / rilis build menggunakan BuildConfig.DEBUG. Mungkin ada bug Android Studio awal yang terlibat juga ...
Seseorang di suatu tempat
13

Atau, Anda dapat membedakan menggunakan BuildConfig.BUILD_TYPE;

Jika Anda menjalankan debug build BuildConfig.BUILD_TYPE.equals("debug");menghasilkan true. Dan untuk rilis build BuildConfig.BUILD_TYPE.equals("release");mengembalikan true.

Prudhvi
sumber
1
Ini jawaban yang benar. Mengembalikan "rilis" sedangkan BuildConfig.DEBUG selalu kembali true.
Minas Mina
6

Saya menggunakan solusi ini untuk mengetahui bahwa aplikasi saya berjalan pada versi debug.

if (BuildConfig.BUILD_TYPE.equals("Debug")){
   //Do something
}
Giedrius Šlikas
sumber
1
Harap tambahkan deskripsi ke jawaban Anda. Ini akan lebih membantu daripada hanya sepotong kode.
Mathews Sunny
Saya menggunakan if (BuildConfig.DEBUG) {} dalam modul gradle dependen yang (tentu saja) TIDAK ADA REFERENSI ke file build.gradle aplikasi - ini menyebabkan mode debug dikenali dengan cara yang salah. if (BuildConfig.BUILD_TYPE.equals("Debug")){ }Memperbaiki masalah. Terima kasih
kosiara - Bartosz Kosarzycki
ini jawaban nyata, ubah saja "Debug" menjadi "debug"
Jetwiz
1

Pastikan Anda mengimpor kelas BuildConfig yang benar Dan ya, Anda tidak akan mengalami masalah dalam menggunakan:

if (BuildConfig.DEBUG) {
   //It's not a release version.
}
Salim Lachdhaf
sumber
Ini berfungsi dengan baik! Terima kasih!
sud007