2013-06-07 2 views
173

Есть ли какой-либо простой способ отключить Crashlytics Android SDK во время разработки?Как отключить Crashlytics при разработке

Я не хочу, чтобы отправить аварии каждый раз, когда я делаю что-то глупое

С другой стороны, я не хочу, чтобы закомментировать Crashlytics.start() и, возможно, рискуют забыть раскоментировать и совершить

+0

Вы пытались просто удалить свой ключ api из манифеста, я не помню, если это катастрофа. – Timmetje

+0

@timmied Он падает. Также комментирование всей строки в «Manifest» приводит к сбою приложения, поэтому это делает вопрос немного более законным. – Michael

ответ

133

Марк от Crashlytics здесь. Вот несколько способов отключить Crashlytics, пока вы делаете свои отладочные сборки!

  1. Использование другого андроида: versionString для отладки и выпуска сборки, а затем отключить аварии отчетов с веб-панели управления Crashlytics для версии отладки.

  2. Оберните вызов Crashlytics.start() в инструкции if, которая проверяет флаг отладки. Вы можете использовать либо пользовательский флаг, или подход, как те, предлагаемых здесь: How to check if APK is signed or "debug build"?

+3

@marcr Как насчет использования BuildConfig.DEBUG? – dannyroa

+2

@dannyroa BuildConfig.DEBUG не является стандартным флагом, который работает во всех средах сборки. Я считаю, что он устанавливается последовательно при построении с Eclipse & ADT, но не в другом месте. – marcr

+1

@marcr было бы хорошо, если бы мы могли отключить задачу в градиенте для определенных вкусов/типов. таким образом мы сможем экономить время на компиляции ресурсов – robotoaster

11

Используйте это в MyApplication#onCreate()

if (!BuildConfig.DEBUG) Crashlytics.start(this); 

EDIT Если вы обновляли в ткани, используйте этот answer вместо этого.

+0

BuildConfig.DEBUG не всегда устанавливается должным образом. Опираясь на это, чтобы включить/отключить Crashlytics, для меня было довольно много проблем при использовании IntelliJ. –

+5

Какие инструменты сборки вы используете? Gradle будет ВСЕГДА установить это значение. Это была проблема год назад, но новые инструменты сборки намного лучше. –

+0

Я на v0.9. + Плагина Gradle для IntelliJ и v1.11 для самого Gradle. –

0

Другой способ, если вы хотите сделать это только на своей IDE, - это выйти из плагина. По-видимому, он перестанет отправлять отчеты, пока вы создаете сборку, не войдя в систему снова.

23

Если вы используете Gradle просто добавить это аромат:

ext.enableCrashlytics = false 
+1

это только для аромата? как насчет debug vs. release? Я попытался отключить для отладки, но все равно отправить краш – xialin

+0

Я думаю, что он работает только на вкус. ИМО, используя флаг Остин и Маркс, указана самым простым. – user1998494

+0

Я нашел решение. но не уверен, совместим ли он с старыми Crashlytics. это для новых Crashlytics в Fabric SDK. проверьте мой ответ ниже – xialin

308

Я нашел решение от Crashlytics (с интеграцией Fabric)

Put следующий код внутри вашего класса Application onCreate()

Crashlytics crashlytics = new Crashlytics.Builder().disabled(BuildConfig.DEBUG).build(); 
Fabric.with(this, crashlytics); 

EDIT:

В Crashalitics 2.3 и выше это устарело. Правильный код:

CrashlyticsCore core = new CrashlyticsCore.Builder().disabled(BuildConfig.DEBUG).build(); 
Fabric.with(this, new Crashlytics.Builder().core(core).build()); 

или

Fabric.with(this, new Crashlytics.Builder().core(new CrashlyticsCore.Builder().disabled(BuildConfig.DEBUG).build()).build()); 

(копируется из Crashlytics deprecated method disabled())


EDIT2:

Вы можете также опционально добавить к вашей buildType в Gradle. Эта команда отключает отправку файла сопоставления crashlytics и генерирует идентификатор для каждой сборки, что ускоряет создание градиентов этих ароматов. (Он не отключает Crashlytics во время выполнения.) See Mike B's answer here.

buildTypes { 
    release { 
      .... 
    } 
    debug { 
     ext.enableCrashlytics = false 
    } 
} 
+2

Это гораздо приятнее использовать и прекратит сбой приложения, если вы совершаете вызовы Crashlytics в своем коде вне вашего класса Application. – speedynomads

+0

Он отлично работает! Теперь я могу удалить всю проверку BuildConfig.DEBUG во всех моих аналитических методах обертки, не опасаясь сбоев. – akhyar

+1

Это устарело в Crashlytics 2.3.0 :( –

3

Обратите внимание, что вы также можете отключить раздражающие загрузку символов в отладочных:

def crashlyticsUploadStoredDeobsDebug = "crashlyticsUploadStoredDeobsDebug" 
def crashlyticsUploadDeobsDebug = "crashlyticsUploadDeobsDebug" 
tasks.whenTaskAdded { task -> 
    if (crashlyticsUploadStoredDeobsDebug.equals(task.name) || 
      crashlyticsUploadDeobsDebug.equals(task.name)) { 

     println "Disabling $task.name." 
     task.enabled = false 
    } 
} 

Просто поместите его в build.gradle вашего модуля приложения.

4

Если вы хотите, чтобы захватить все аварии (для отладки и выпуска сборки), но хотят, чтобы отделить их в Crashlytics панели инструментов, вы можете добавить эту строку кода в build.gradle:

debug { 
    versionNameSuffix "-DEBUG" 
} 

Например, если версия вашего приложенияName 1.0.0, ваши версии релизов будут помечены как 1.0.0, тогда как отладочные сборки будут 1.0.0-DEBUG

+0

Это не нужно делать ароматы? – portfoliobuilder

1

Если вы беспокоитесь о том, что BuildConfig.DEBUG не настроены правильно, используйте вместо этого ApplicationInfo:

boolean isDebug = (mAppContext.getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0; 
Crashlytics crashlytics = new Crashlytics.Builder().disabled(isDebug).build(); 
Fabric.with(uIContext, crashlytics); 
19

Я нашел this быть самым простым решением:

release { 
     ... 
     buildConfigField 'Boolean', 'enableCrashlytics', 'true' 
    } 
    debug { 
     buildConfigField 'Boolean', 'enableCrashlytics', 'false' 
    } 

Вышеуказанные линии будут создавать статическое булево поле, называемое enableCrashlytics в BuildConfig файл, который вы можете использовать, чтобы решить, следует ли начать Fabric или нет:

if (BuildConfig.enableCrashlytics) 
     Fabric.with(this, new Crashlytics()); 

ПРИМЕЧАНИЕ: С помощью этого метода Ткани инициализируются только в выпусках (как указано в приведенном выше коде). Это означает, что вам нужно поместить вызовы к методам статистики в классе Crashlytics в блоке if, который проверяет, была ли Инициализирована Ткань, как показано ниже.

if (Fabric.isInitialized()) 
    Crashlytics.logException(e); 

В противном случае приложение будет врезаться с Must Initialize Fabric before using singleton() ошибки при тестировании на эмуляторе.

+1

Это вызывает сбой во всех случаях Crashlytics .logException (e): «Обязательное начальное ize Ткань перед использованием singleton() " – jwBurnside

+0

@jwBurnside Это связано с тем, что при запуске приложения на эмуляторе (т. debug builds). Crashlytics не инициализируется как показательный 'if (BuildConfig.enableCrashlytics == true)'. Он инициализируется только в версиях. Оберните вызовы статическим методам в Crashytics с помощью 'if (Fabric.isInitialized())'. Например: 'if (Fabric.isInitialized()) Crashlytics.logException (e)'. Это должно решить проблему. – fahmy

+0

Ah ok gotcha, спасибо, что очистил это – jwBurnside

3

до даты простой версии при использовании Gradle построить:

if (!BuildConfig.DEBUG) { 
    Fabric.with(this, new Crashlytics()); 
} 

Он использует новый встроенный в синтаксисе из ткани для Crashlytics и работает в автоматическом режиме с а Gradle строить.

23

Ознакомьтесь с последним документом. https://docs.fabric.io/android/crashlytics/build-tools.html#gradle-advanced-setup.

Помимо добавления ext.enableCrashlytics = false в build.grade вам нужно сделать,

Crashlytics crashlyticsKit = new Crashlytics.Builder() 
    .core(new CrashlyticsCore.Builder().disabled(BuildConfig.DEBUG).build()) 
    .build(); 

// Initialize Fabric with the debug-disabled crashlytics. 
Fabric.with(this, crashlyticsKit); 
-6

Это глупо ответ, я знаю
Просто раскомментируйте Fabric.with(this, new Crashlytics());, работа над этим и раскомментировать ее, когда вы хотите, чтобы освободить его ,

6

Здесь есть много хороших ответов, но для моего тестирования я использую отладочные сборки для собственных бета-тестов и тестирования вне лаборатории, где журналы сбоев по-прежнему очень полезны, и я все равно хотел бы сообщить об этом. Как и OP, все, что я хотел, было отключить их во время активной разработки, где я часто вызываю и быстро разрешаю аварии.

Вместо удаления всех отладочных аварийных сообщений вы можете отключать отчеты только в том случае, если устройство подключено к вашей машине разработки с помощью следующего кода.

if (!Debug.isDebuggerConnected()) { 
    Fabric.with(this, new Crashlytics()); 
} 
0

Использовать ароматизаторы или строить конфиги. Используйте отдельный идентификатор сборки для сборки dev, и все ваши сбои будут продолжаться в отдельном приложении. Может пригодиться в случае совместного использования сборки с одноранговыми узлами или использования ее без отладчика. Что-то вроде этого -

productFlavors { 
    dev { 
     applicationId "io.yourapp.developement" 
    } 
    staging { 
     applicationId "io.yourapp.staging" 
    } 

    production { 
     applicationId "io.yourapp.app" 
    } 
1

Странная проблема с которой я столкнулся: я последовал за xialin «s ответ (который также появляется на официальном сайте), и это не сработало. Оказалось, что я ссылался на BuildConfig в пакете Fabric, который также содержит статическую переменную DEBUG, которая была установлена ​​равной false даже в режиме отладки.

Так что, если вы будете следовать вышеупомянутым решением, и вы по-прежнему получать отчеты отладки, убедитесь, что вы ссылки это:

import com.yourpackagename.BuildConfig; 

И не так:

import io.fabric.sdk.android.BuildConfig;  
0

Если вы хотите релиз сборка отладки, вот так:

buildTypes { 
    release { 
     signingConfig signingConfigs.config 
     debuggable true //-> debuggable release build 
     minifyEnabled true 
     multiDexEnabled false 
     ext.enableCrashlytics = true 
     proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     buildConfigField 'boolean', 'BUILD_TYPE_DEBUG', 'false' 
    } 
    debug { 
     minifyEnabled false 
     multiDexEnabled true 
     ext.enableCrashlytics = false 
     ext.alwaysUpdateBuildId = false 
     // Disable fabric build ID generation for debug builds 
     proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     buildConfigField 'boolean', 'BUILD_TYPE_DEBUG', 'true' 
    } 
} 

При установке debuggable true ваших BuildConfig.DEBUG инициализируется с помощью true, поэтому я добавил эту переменную в класс BuildConfig.

Init Ткань:

Crashlytics crashlytics = new Crashlytics.Builder() 
      // disable crash reporting in debug build types with custom build type variable 
      .core(new CrashlyticsCore.Builder().disabled(BuildConfig.BUILD_TYPE_DEBUG).build()) 
      .build(); 

    final Fabric fabric = new Fabric.Builder(this) 
      .kits(crashlytics) 
      //enable debugging with debuggable flag in build type 
      .debuggable(BuildConfig.DEBUG) 
      .build(); 

    // Initialize Fabric with the debug-disabled crashlytics. 
    Fabric.with(fabric); 
0

Проблема заключается в том, что ни одно из решений не делает работу за последний crashlytics SDK. (Я использую 2.9.0)

Вы не можете отключить его по коду, поскольку он компилируется в ваш проект и запускается даже до вызова onCreate вашего приложения. Поэтому другое решение простое - не компилируйте crashlytics, когда это не нужно. Заменить вызов 'compile' с помощью 'releaseCompile' в файле build.gradle.

releaseCompile('com.crashlytics.sdk.android:crashlytics:[email protected]') { 
     transitive = true 
    } 
Смежные вопросы