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

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

11 ответов

Решение

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

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

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

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

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

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

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

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

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

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

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

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

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

Вам нужно использовать это в файле gradle/kts, чтобы для вас был сгенерирован файл BuildConfig:

      buildFeatures {
   buildConfig = true
}

Затем доберитесь до поляBuildConfig.DEBUGкоторый принадлежит имени пакета вашего приложения.

Нечто похожее на это, но менее рекомендуемое (поскольку оно не удаляет код при создании релизной версии), заключается в проверке возможности отладки приложения:

      val isDebuggable = context.applicationInfo.flags and ApplicationInfo.FLAG_DEBUGGABLE != 0
      if (BuildConfig.DEBUG) { 



}

Это работает для меня

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

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

Из официальных документов флаттера вы можете использовать

      if(kDebugMode){
  // block to run if your app is in debug mode
 }

вы можете найти больше информации здесь https://api.flutter.dev/flutter/foundation/kDebugMode-constant.html

Build.IS_DEBUGGABLE может быть в порядке. Это происходит от "ro.debuggable"

Другие вопросы по тегам