Sürüm veya hata ayıklama modunda olduğumu nasıl tespit ederim?


Yanıtlar:


770

En basit ve en iyi uzun vadeli çözüm kullanmaktır BuildConfig.DEBUG. Bu, hata ayıklama derlemesi için kullanılacak bir booleandeğerdir true, falseaksi takdirde:

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

Kişisel olarak bir sorunla karşılaşmamamla birlikte, bu değerin Eclipse tabanlı yapılardan% 100 güvenilir olmadığına dair raporlar var, bu yüzden gerçekten bir sorunun ne kadar olduğunu söyleyemem.

Android Studio kullanıyorsanız veya komut satırından Gradle kullanıyorsanız, sen kendi eşyalarını ekleyebiliyorsanız BuildConfigveya başka çimdik debugve releaseyardımına inşa türlerini zamanında bu durumları ayırt eder.

Yasadışı Argüman'ın çözümü android:debuggable, manifest'teki bayrağın değerine dayanmaktadır . Eğer bir "hata ayıklama" derlemesini bir "serbest bırakma" derlemesinden ayırmak istiyorsanız, tanım gereği, bu en iyi çözümdür. Ancak, ileriye dönük olarak, debuggablebayrakın Gradle / Android Studio'nun "hata ayıklama" yapısını düşündüğü şeyden gerçekten bağımsız bir kavram olduğunu unutmayın. Herhangi bir derleme türü, debuggablebayrağı geliştirici ve bu derleme türü için anlamlı olan herhangi bir değere ayarlamayı seçebilir .


34
BuildConfiguygulamanızın paketinde yer alıyor, örneğinimport com.mycompany.myapp.BuildConfig;
Chris Cirefice

10
AndroiStudio bir hata nedeniyle bu artık çalışmıyor, DEBUG modunda bile her zaman yanlıştır
user387184

1
@ user387184: Android Studio 1.2.2'de public static final boolean DEBUG = Boolean.parseBoolean("true");bir hata ayıklama derlemesi alıyorum . Bu sette için garip bir yol olsa DEBUGiçin true, bu çalışması gerekir. Bunu 1.3.0 test sürümlerinden birinde görüyorsanız veya 1.2.2 için tekrarlanabilir bir test durumunuz varsa, lütfen sorun bildirin . Bu sorunu bildiren önemli sorunlar görmüyorum.
CommonsWare

2
Ben v1.2.2 kullanıyorum ve BuildConfig.DEBUG her zaman yanlış, o zaman benim için çalışan aşağıdaki öneri denedim - Ben de senin çalışacağım - çok teşekkürler!
user387184

3
Anlaşıldığı gibi, bir kütüphane kullanılırken çalışmaz (her zaman doğru döner): stackoverflow.com/q/20176284/878126 . En iyi alternatifin ne olduğunu merak et
android geliştirici

59

Takip etmeyi dene:

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

Kotlin:

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

Buradan buradan posta postasından alınır


3
Bu cevap, kütüphane projesi veya uygulama projesinden bağımsız olarak her durumda işe yarar.
Lavekush Agrawal

getApplicationInfo().flagsÇalışmak için ne ithal edilmesi gerekiyor?
A1m

1
tamam sadece statik bağlamda çalışmıyor, bkz. stackoverflow.com/questions/10641144/…
A1m

54

Evet, kullanırken sorun yaşamayacaksınız:

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

Yanlış BuildConfig sınıfını içe aktarmadığınız sürece. Bağımlılık kitaplıklarınızın hiçbirinden değil, projenizin BuildConfig sınıfına başvurduğunuzdan emin olun.

resim açıklamasını buraya girin


1
"Yanlış BuildConfig sınıfını içe aktarmadığınız sürece" ... Evet, çok iyi bir nokta: D
Benjamin Piette

Teşekkürler! Projemdeki sorun buydu, bir şekilde kütüphane projesinin BuildConfig'ini alıyordu (Android Studio 3 çıkana kadar her zaman yayın modu)
Amit Garg

36

Hakkında karışık yorumlar nedeniyle BuildConfig.DEBUG, hata ayıklama modunda kilitlenme (ve analitik) devre dışı bırakmak için aşağıdakileri kullandım:

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

kodunuzda ENABLE_CRASHLYTICSbayrağı aşağıdaki gibi tespit edersiniz :

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

uygulamanızda aynı kavramı kullanın ve ENABLE_CRASHLYTICSistediğiniz herhangi bir adla yeniden adlandırın . Bu yaklaşımı seviyorum çünkü konfigürasyonda bayrağı görebiliyorum ve bayrağı kontrol edebiliyorum.


Crashlytics ve Cevapları ayrı ayrı çağırmamalısınız. Sadece şunu kullanın: Fabric.with (bu, yeni Crashlytics ()); Crashlytics ve Cevapları dahil etmek.
Mike Bonnell

1
Teşekkürler, @MikeBonnell, örnek kodda kod değişikliği yaptım
Someone Somewhere

Bunun BuildConfig.DEBUG kullanmanın nasıl farklı olduğunu görmüyorum - hata ayıklama yapılarınız için yalnızca BuildConfig.ENABLE_CRASHLYTICS ayarladıysanız, BuildConfig.DEBUG ve BuildConfig.ENABLE_CRASHLYTICS her zaman aynı değere sahip olur mu?
k2col

Dev'in kütüphane projeleri üzerinde çalışmasının BuildConfig.DEBUG kullanarak hata ayıklama / yayın yapılarını tespit etmekte sorunları olduğunu düşünüyorum. Çok erken bir Android Studio hatası da olabilirdi ...
Birisi

13

Alternatif olarak, BuildConfig.BUILD_TYPE kullanarak farklılaştırabilirsiniz;

Hata ayıklama derlemesi çalıştırıyorsanız BuildConfig.BUILD_TYPE.equals("debug");true değerini döndürür. Ve sürüm derlemesi için BuildConfig.BUILD_TYPE.equals("release");true değerini döndürür.


1
Bu doğru cevap. BuildConfig.DEBUG her zaman geri dönerken "release" değerini döndürür true.
Minas Mina

6

Uygulamamın hata ayıklama sürümünde çalıştığını öğrenmek için bu çözümü kullanıyorum.

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

1
Lütfen cevabınıza açıklama ekleyin. Bir kod parçasından daha yararlı olurdu.
Mathews Sunny

if (BuildConfig.DEBUG) {} Uygulamanın build.gradle dosyasına (tabii ki) HİÇBİR REFERENCE vardı bağımlı bir gradle modülünde kullanıyordum - bu hata ayıklama modunun yanlış bir şekilde tanınmasına neden oldu. if (BuildConfig.BUILD_TYPE.equals("Debug")){ }Sorun DÜZELTİLDİ. Thanks
kosiara - Bartosz Kosarzycki

Bu gerçek bir cevap, sadece "Hata ayıklama" değiştirmek için "hata ayıklama"
Jetwiz

1

Doğru BuildConfig sınıfını içe aktardığınızdan emin olun Ve evet, aşağıdakileri kullanırken sorun yaşamayacaksınız:

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

Bu iyi çalışıyor! Teşekkür ederim!
sud007
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.