Jak wykryć, czy jestem w trybie zwolnienia lub debugowania?


Odpowiedzi:


770

Najprostszym i najlepszym długoterminowym rozwiązaniem jest użycie BuildConfig.DEBUG. Jest to booleanwartość truedla kompilacji debugowania, w falseprzeciwnym razie:

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

Pojawiły się doniesienia, że ​​ta wartość nie jest w 100% wiarygodna w przypadku kompilacji opartych na Eclipse, chociaż osobiście nie napotkałem problemu, więc nie mogę powiedzieć, na ile tak naprawdę jest problem.

Jeśli korzystasz z Android Studio lub jeśli korzystasz z Gradle z wiersza poleceń, możesz dodawać własne rzeczy BuildConfiglub w inny sposób dostosowywać debugi releasebudować typy, aby pomóc rozróżnić te sytuacje w czasie wykonywania.

Rozwiązanie z nielegalnego argumentu oparte jest na wartości android:debuggableflagi w manifeście. Jeśli tak chcesz odróżnić kompilację „debugowania” od kompilacji „wydania”, to z definicji jest to najlepsze rozwiązanie. Należy jednak pamiętać, że w przyszłości debuggableflaga jest naprawdę niezależną koncepcją od tego, co Gradle / Android Studio uważa za kompilację „debugowania”. Każdy typ kompilacji może ustawić debuggableflagę na dowolną wartość, która ma sens dla tego programisty i dla tego typu kompilacji.


34
BuildConfigznajduje się w pakiecie aplikacji, np.import com.mycompany.myapp.BuildConfig;
Chris Cirefice,

10
z powodu błędu w AndroiStudio to już nie działa, zawsze jest fałszywe, nawet w trybie DEBUG
użytkownik387184

1
@ user387184: W Android Studio 1.2.2 dostaję wersję public static final boolean DEBUG = Boolean.parseBoolean("true");do debugowania. Chociaż jest to dziwaczny sposób ustawić DEBUGna true, to powinno działać. Jeśli widzisz to w jednej z wersji testowych 1.3.0 lub jeśli masz odtwarzalną walizkę testową dla wersji 1.2.2, zgłoś problem . Nie widzę żadnych zaległych problemów zgłaszających ten problem.
CommonsWare,

2
Korzystam z wersji 1.2.2 i BuildConfig.DEBUG jest zawsze fałszywy, a następnie wypróbowałem sugestię poniżej, która działa dla mnie - wypróbuję również twoją - wielkie dzięki!
user387184,

3
Jak się okazuje, nie będzie to działać podczas korzystania z biblioteki (zawsze zwraca true): stackoverflow.com/q/20176284/878126 . Zastanawiaj się, jaka jest najlepsza alternatywa
programista Androida

59

Spróbuj wykonać następujące czynności:

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

Kotlin:

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

To jest pobierane z paczki pakietów stąd


3
Ta odpowiedź będzie działać we wszystkich przypadkach, niezależnie od projektu biblioteki lub projektu aplikacji.
Lavekush Agrawal

Co należy zaimportować, getApplicationInfo().flagsaby działać?
A1m

1
ok, to po prostu nie działa w kontekście statycznym, patrz stackoverflow.com/questions/10641144/…
A1m

54

Tak, nie będziesz mieć problemów z użyciem:

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

Chyba że importujesz niewłaściwą klasę BuildConfig. Upewnij się, że odwołujesz się do klasy BuildConfig projektu, a nie z żadnej z bibliotek zależności.

wprowadź opis zdjęcia tutaj


1
„Chyba że importujesz niewłaściwą klasę BuildConfig” ... Tak, bardzo dobra uwaga: D
Benjamin Piette

Dzięki! To był problem w moim projekcie, jakimś sposobem było pobieranie BuildConfig projektu bibliotecznego (który zawsze jest w trybie wydawania, dopóki nie pojawi się Android Studio 3)
Amit Garg

36

Z powodu mieszanych komentarzy na temat BuildConfig.DEBUG, użyłem następujących opcji, aby wyłączyć awarie (i analizy) w trybie debugowania:

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

następnie w kodzie wykrywasz ENABLE_CRASHLYTICSflagę w następujący sposób:

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

użyj tej samej koncepcji w swojej aplikacji i zmień nazwę ENABLE_CRASHLYTICSna cokolwiek chcesz. Podoba mi się to podejście, ponieważ widzę flagę w konfiguracji i mogę kontrolować flagę.


Nie powinieneś dzwonić do Crashlytics i Odpowiedzi osobno. Wystarczy użyć: Fabric.with (this, new Crashlytics ()); zawierać Crashlytics i odpowiedzi.
Mike Bonnell,

1
Dzięki, @MikeBonnell, zmieniłem kod na przykładowy kod
Someone Somewhere

Nie rozumiem, jak to się różni od używania BuildConfig.DEBUG - jeśli ustawisz tylko BuildConfig.ENABLE_CRASHLYTICS dla kompilacji debugowania, wówczas BuildConfig.DEBUG i BuildConfig.ENABLE_CRASHLYTICS zawsze będą miały tę samą wartość, prawda?
k2col

Myślę, że deweloperzy pracujący nad projektami bibliotecznymi mieli problemy z wykryciem kompilacji debugowania / wydania za pomocą BuildConfig.DEBUG. Być może wystąpił też wczesny błąd Android Studio ...
Ktoś gdzieś

13

Alternatywnie możesz różnicować za pomocą BuildConfig.BUILD_TYPE;

Jeśli używasz debugowania, kompilacja BuildConfig.BUILD_TYPE.equals("debug");zwraca wartość true. A dla wydania kompilacji BuildConfig.BUILD_TYPE.equals("release");zwraca wartość true.


1
To jest poprawna odpowiedź. Zwraca „release”, podczas gdy BuildConfig.DEBUG zawsze zwraca true.
Minas Mina

6

Korzystam z tego rozwiązania, aby dowiedzieć się, że moja aplikacja działa w wersji do debugowania.

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

1
Dodaj opis do swojej odpowiedzi. Byłoby to bardziej pomocne niż tylko fragment kodu.
Mathews Sunny,

Używałem if (BuildConfig.DEBUG) {} w utrzymaniu Gradle modułu, który miał (oczywiście) bez odniesienia do pliku build.gradle o aplikacji - to spowodowane trybie debugowania, aby być uznanym w niewłaściwy sposób. if (BuildConfig.BUILD_TYPE.equals("Debug")){ }NAPRAWIONO problem. Dzięki
kosiara - Bartosz Kosarzycki

to jest prawdziwa odpowiedź, wystarczy zmienić „Debuguj” na „
debuguj

1

Upewnij się, że importujesz poprawną klasę BuildConfig I tak, nie będziesz mieć problemów z użyciem:

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

To po prostu działa dobrze! Dziękuję Ci!
sud007
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.