Как определить, нахожусь ли я в режиме выпуска или отладки?

374

Как я могу определить в своем коде, что я нахожусь в режиме выпуска или в режиме отладки?

Дэвид
источник

Ответы:

770

Самое простое и лучшее долгосрочное решение - использовать BuildConfig.DEBUG. Это booleanзначение trueдля отладочной сборки, в falseпротивном случае:

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

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

Если вы используете Android Studio или Gradle из командной строки, вы можете добавить свои собственные вещи BuildConfigили иным образом настроить типы debugи releaseсборки, чтобы помочь различать эти ситуации во время выполнения.

Решение от Illegal Argument основано на значении android:debuggableфлага в манифесте. Если именно так вы хотите отличить «отладочную» сборку от «выпускной», то по определению это лучшее решение. Однако имейте в виду, что в будущем debuggableфлаг действительно будет независимой концепцией от того, что Gradle / Android Studio считает «отладочной» сборкой. Любой тип сборки может установить debuggableфлаг в любое значение, которое имеет смысл для этого разработчика и для этого типа сборки.

CommonsWare
источник
34
BuildConfigнаходится в пакете вашего приложения, напримерimport com.mycompany.myapp.BuildConfig;
Крис Cirefice
10
из-за ошибки в AndroiStudio это больше не работает, всегда ложно, даже в режиме отладки
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 всегда ложен, тогда я попробовал приведенное ниже предложение, которое работает для меня - я попробую и ваше - большое спасибо!
user387184
3
Оказывается, это не будет работать при использовании библиотеки (всегда возвращает true): stackoverflow.com/q/20176284/878126 . Интересно, что является лучшей альтернативой
Android-разработчик
59

Попробуйте следующее:

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

Котлин:

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

Это взято из поста Bundells отсюда

Незаконный аргумент
источник
3
Этот ответ будет работать во всех случаях независимо от проекта библиотеки или проекта приложения.
Лавекуш Агравал
Что нужно импортировать для 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, я использовал следующее, чтобы отключить сбои (и аналитику) в режиме отладки:

обновить /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. А для релиза build BuildConfig.BUILD_TYPE.equals("release");возвращает true.

Prudhvi
источник
1
Это правильный ответ. Возвращает «release», тогда как BuildConfig.DEBUG всегда возвращает true.
Минас Мина
6

Я использую это решение на случай, если узнаю, что мое приложение работает на отладочной версии.

if (BuildConfig.BUILD_TYPE.equals("Debug")){
   //Do something
}
Гедриус ​​Шликас
источник
1
Пожалуйста, добавьте описание к вашему ответу. Это было бы более полезно, чем просто кусок кода.
Мэтьюз Санни
Я использовал if (BuildConfig.DEBUG) {} в зависимом модуле Gradle, который (конечно) не имел ссылки на файл build.gradle приложения - это вызвало неправильное распознавание режима отладки. if (BuildConfig.BUILD_TYPE.equals("Debug")){ }Исправлена ​​проблема. Спасибо
Косиара - Бартош Косаржицкий
это реальный ответ, просто измените «Debug» на «debug»
Jetwiz
1

Убедитесь, что вы импортируете правильный класс BuildConfig. И да, у вас не будет проблем с использованием:

if (BuildConfig.DEBUG) {
   //It's not a release version.
}
Салим Лахдхаф
источник
Это просто отлично работает! Спасибо!
sud007