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

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

Ответ 1

Простейшим и лучшим долгосрочным решением является использование 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 в манифесте. Если вы хотите отличить "отладочную" сборку от сборки "release", то по определению это лучшее решение. Однако имейте в виду, что в будущем флаг debuggable действительно является независимым понятием, из которого Gradle/Android Studio считает, что сборка "отладки" будет. Любой тип сборки может выбрать, чтобы установить флаг debuggable на любое значение, которое имеет смысл для этого разработчика и для этого типа сборки.

Ответ 2

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

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

Котлин:

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

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

Ответ 3

Да, у вас не будет проблем с использованием:

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

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

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

Ответ 4

Из-за смешанных комментариев о BuildConfig.DEBUG я использовал следующее для отключения crashlytics (и аналитики) в режиме отладки:

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 на все, что захотите. Мне нравится этот подход, потому что я могу видеть флаг в конфигурации, и я могу управлять флагом.

Ответ 5

В качестве альтернативы вы можете различать, используя BuildConfig.BUILD_TYPE;

Если вы используете сборку отладки BuildConfig.BUILD_TYPE.equals("debug"); возвращает значение true. И для выпуска build BuildConfig.BUILD_TYPE.equals("release"); возвращает true.

Ответ 6

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

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

Ответ 7

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

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