Як визначити, чи перебуваю у режимі випуску чи налагодження?


Відповіді:


770

Найпростіше і найкраще довгострокове рішення - це використовувати BuildConfig.DEBUG. Це booleanзначення, яке буде trueрозроблено для налагодження, falseінакше:

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

Повідомлялося, що це значення не є на 100% надійним для складання на основі Eclipse, хоча я особисто не стикався з проблемою, тому не можу сказати, наскільки це проблема насправді.

Якщо ви використовуєте Android Studio або використовуєте Gradle з командного рядка, ви можете додати свої речі до BuildConfigчи іншим чином налаштувати типи debugта releaseскладати типи, щоб допомогти розрізнити ці ситуації під час виконання.

Рішення з незаконного аргументу базується на значенні android:debuggableпрапора в маніфесті. Якщо саме так ви хочете відрізнити збірку "налагодження" від збірки "реліз", то, за визначенням, це найкраще рішення. Однак майте на увазі, що рухаючись вперед, debuggableпрапор - це справді незалежна концепція, від якої Gradle / Android Studio вважають побудову «налагодження». Будь-який тип збірки може встановити debuggableпрапор будь-якого значення, яке має сенс для цього розробника та для цього типу збірки.


34
BuildConfigзнаходиться в пакеті вашого додатка, наприкладimport com.mycompany.myapp.BuildConfig;
Chris Cirefice

10
через помилку в AndroiStudio це більше не працює, він завжди помилковий, навіть у режимі DEBUG
user387184

1
@ user387184: В Android Studio 1.2.2 я отримую public static final boolean DEBUG = Boolean.parseBoolean("true");збірку налагодження. Хоча це дивно спосіб набору DEBUGдо true, він повинен працювати. Якщо ви бачите це в одному з тестових випусків 1.3.0 або у вас є відтворюваний тестовий зразок для 1.2.2, подайте проблему . Я не бачу жодних невирішених проблем, які б повідомили про цю проблему.
CommonsWare

2
Я використовую v1.2.2 та BuildConfig.DEBUG - це завжди помилково, тоді я спробував пропозицію, нижче якої працює для мене - я спробую і ваш - велике спасибі!
користувач387184

3
Як виявляється, це не буде працювати при використанні бібліотеки (завжди повертає істину): stackoverflow.com/q/20176284/878126 . Цікаво, яка найкраща альтернатива
андроїд розробник

59

Спробуйте наступне:

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

Котлін:

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

Його взято з bundells поста від сюди


3
Ця відповідь спрацює у всіх випадках незалежно від проекту бібліотеки чи проекту програми.
Lavekush Agrawal

Для чого потрібно імпортувати getApplicationInfo().flagsроботу?
A1m

1
нормально це просто не працює в статичному контексті см stackoverflow.com/questions/10641144 / ...
A1M

54

Так, у вас не буде проблем із використанням:

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

Якщо ви не імпортуєте неправильний клас BuildConfig. Переконайтеся, що ви посилаєтесь на клас BuildConfig вашого проекту, а не з будь-якої з ваших бібліотек залежностей.

введіть тут опис зображення


1
"Якщо ви не імпортуєте неправильний клас BuildConfig" ... Так, дуже хороший момент: D
Бенджамін Піет

Дякую! Ця проблема була в моєму проекті, якимось чином збирав BuildConfig бібліотечного проекту (який завжди випускається до виходу Android Studio 3)
Аміт Гарг

36

Через неоднозначні коментарі о BuildConfig.DEBUG використання я використовував наступне для відключення аварійних ситуацій (та аналітики) в режимі налагодження:

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

то у своєму коді ви визначаєте ENABLE_CRASHLYTICSпрапор таким чином:

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

використовувати ту саму концепцію у своєму додатку та перейменувати ENABLE_CRASHLYTICSвсе, що завгодно. Мені подобається такий підхід, тому що я бачу прапор у конфігурації і можу контролювати прапор.


Не варто називати Crashlytics і відповіді окремо. Просто використовуйте: Fabric.with (це нові Crashlytics ()); включити Crashlytics та відповіді.
Майк Боннелл

1
Дякую, @MikeBonnell, я змінив код на зразок коду
Хтось десь

Я не бачу, чим це відрізняється від використання BuildConfig.DEBUG - якщо ви встановлюєте BuildConfig.ENABLE_CRASHLYTICS для вашої побудови налагодження, тоді BuildConfig.DEBUG і BuildConfig.ENABLE_CRASHLYTICS завжди матиме однакове значення, правда?
k2col

Я думаю, що робота розробника над бібліотечними проектами мала проблеми з виявленням налагодження / випуску версій за допомогою BuildConfig.DEBUG. Можливо, тут також була пов’язана помилка Android Studio ...
Хтось десь

13

Крім того, ви можете диференціювати використання BuildConfig.BUILD_TYPE;

Якщо ви працюєте з налагодженням, збірка BuildConfig.BUILD_TYPE.equals("debug");повертає значення true. А для випуску версії BuildConfig.BUILD_TYPE.equals("release");повертається true.


1
Це правильна відповідь. Повертає "випуск", тоді як BuildConfig.DEBUG завжди повертається true.
Мінас Міна

6

Я використовую це рішення, щоб дізнатися, що моя програма працює на версії налагодження.

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

1
Будь ласка, додайте опис до своєї відповіді. Це було б корисніше, ніж просто фрагмент коду.
Mathews Sunny

Я використовував if (BuildConfig.DEBUG) {} у залежному модулі gradle, який не мав (звичайно) НЕ ПОЯСНЕННЯ до файлу build.gradle програми - це спричинило неправильне розпізнавання режиму налагодження. if (BuildConfig.BUILD_TYPE.equals("Debug")){ }Виправлена ​​проблема. Спасибі
kosiara - Бартош Косаржицький

це реальна відповідь, просто змініть "Налагодження" на "налагодження"
Jetwiz

1

Переконайтесь, що ви імпортуєте правильний клас BuildConfig. Так, у вас не виникне проблем із використанням:

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

Це просто чудово працює! Дякую!
sud007
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.