Как определить, нахожусь ли я в режиме выпуска или отладки?
Как я могу определить в своем коде, что я нахожусь в режиме выпуска или в режиме отладки?
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
Убедитесь, что вы импортируете правильный класс 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"