Как отключить Crashlytics во время разработки

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

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

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

Ответ 1

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

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

  • Оберните вызов Crashlytics.start() в инструкции if, которая проверяет флаг отладки. Вы можете использовать либо настраиваемый флаг, либо такой подход, как предлагаемые здесь: Как проверить, подписана ли APK или "отладочная сборка" ?

Ответ 2

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

Поместите следующий код внутри класса 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());

(скопирован из Запрещенный метод устаревших отключений())


EDIT2:

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

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

Ответ 3

Выбранный ответ больше не верен. Google изменил интеграцию Crashlytics. Моя текущая версия - 2.9.1 и единственное, что мне нужно было сделать, это добавить implementation 'com.crashlytics.sdk.android:crashlytics:2.9.1' в мой файл Gradle. Больше ничего не требуется, приятно, но это означает, что Crashlytics всегда работает.

Решение 1

Скомпилируйте Crashlytics только в продакшен версии:

dependencies {
   ...
   releaseImplementation 'com.crashlytics.sdk.android:crashlytics:2.9.1' // update version
}

Решение 2

Если вы хотите дополнительно настроить Crashlytics, тогда Решение 1 не работает, так как классы Crashlytics не будут найдены в Отладочных сборках. Так что измените реализацию Gradle обратно на:

implementation 'com.crashlytics.sdk.android:crashlytics:2.9.1' // update version

Затем перейдите в манифест и добавьте следующий тег meta-data внутри тега application:

<application
        android:name="...>

        <meta-data
            android:name="firebase_crashlytics_collection_enabled"
            android:value="false" />

...

</application>

Добавьте к своей Launch-Activity (требуется только один раз, а не к каждой деятельности)

if (!BuildConfig.DEBUG) { // only enable bug tracking in release version
   Fabric.with(this, new Crashlytics());
}

Это включит Crashlytics только в версиях выпуска. Будьте внимательны, также проверьте BuildConfig.DEBUG при настройке Crashlytics, например:

if (!BuildConfig.DEBUG) {
   Crashlytics.setUserIdentifier("HASH_ID");
}

Ответ 4

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

ext.enableCrashlytics = false

Ответ 5

Ознакомьтесь с последним документом. 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

Я нашел этот самым легким решением:

    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() при тестировании на эмуляторе.

Ответ 7

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

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

ИЗМЕНИТЬ Если вы перешли на Fabric, вместо этого используйте .

Ответ 8

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

debug {
    versionNameSuffix "-DEBUG"
}

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

Ответ 9

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

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

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

Ответ 10

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

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 вашего прикладного модуля.

Ответ 11

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

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

 releaseCompile('com.crashlytics.sdk.android:crashlytics:[email protected]') {
        transitive = true
    }

Ответ 13

Еще одно простое решение, которое мне нравится, потому что оно не требует других файлов манифеста:

Шаг 1 - определить заполнители манифеста в build.gradle

android {
    ...
    buildTypes {
        release {
            manifestPlaceholders = [crashlytics:"true"]
        }
        debug {
            manifestPlaceholders = [crashlytics:"false"]
        }
    }
    ...
}

Шаг 2 - используйте их в вашем AndroidManifest.xml

<meta-data
        android:name="firebase_crashlytics_collection_enabled"
        android:value="${crashlytics}" />

Ответ 14

Простая версия при использовании Gradle для сборки:

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

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

Ответ 15

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

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

import com.yourpackagename.BuildConfig;

И не это:

import io.fabric.sdk.android.BuildConfig;    

Ответ 16

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

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

Ответ 17

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

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

    production {
        applicationId "io.yourapp.app"
    }

Ответ 18

Если вы хотите создать отладочную версию, выполните следующие действия:

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.

Истинный материал:

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);

Ответ 19

Мы можем использовать метод ткани isDebuggable().

import static io.fabric.sdk.android.Fabric.isDebuggable;

if(! isDebuggable()){
    // set Crashlytics ... 
}

Удачного кодирования :)

Ответ 20

Вы можете использовать выделенный файл манифеста для режима отладки (работает для меня с Crashlytics 2.9.7):

Создайте файл app/src/debug/AndroidManifest.xml и добавьте следующее:

<application>

    <meta-data
        android:name="firebase_crashlytics_collection_enabled"
        android:value="false"/>

</application>

Обратите внимание, что этот элемент мета-данные должны быть введены в отлаживать/только AndroidManifest.xml, а не в обычной AndroidManifest.xml

Решение, которое использует CrashlyticsCore.Builder().disabled(BuildConfig.DEBUG).build(), у меня не сработало, и я обнаружил, что crashlytics инициализируется CrashlyticsInitProvider до вызова Application.onCreate() или любой активности запущен, что означает, что ручная инициализация матрицы в приложении или действии не имеет никакого эффекта, поскольку ткань уже инициализирована.

Ответ 21

2019 Ответ

Я пытался включить Crashlytics только в выпуске и отключить в режиме отладки в течение 2 часов, проверяя консоль Firebase, чтобы узнать, были ли загружены исключения или нет.

Есть 2 возможных способа сделать это.

ОПЦИЯ 1

Это работает, но если вы Crashlytics какой- Crashlytics метод Crashlytics в отладочных сборках, приложение Crashlytics крах.

Приложение /build.gradle

android {
    buildTypes {
        release {
            manifestPlaceholders = [crashlyticsEnabled: true]
        }
        release {
            manifestPlaceholders = [crashlyticsEnabled: false]
        }

AndroidManifest.xml

<manifest
    <application
        <meta-data
            android:name="firebase_crashlytics_collection_enabled"
            android:value="${crashlyticsEnabled}" />

ВАРИАНТ 2

Альтернатива, если это позволяет вам вызывать методы Crashlytics без предварительной проверки BuildConfig.DEBUG. С помощью этой настройки вы можете безопасно вызывать такие методы, как Crashlytics.logException() - они просто ничего не делают в отладочных сборках. Я не вижу отчетов, загружаемых в отладке.

Приложение /build.gradle

android {
    buildTypes {
        release {
            ext.enableCrashlytics = true
        }
        release {
            ext.enableCrashlytics = false
        }

AndroidManifest.xml

<manifest
    <application
        <meta-data
            android:name="firebase_crashlytics_collection_enabled"
            android:value="false" />

Приложение onCreate()

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

Ответ 22

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

Ответ 23

  1. Добавьте это в ваши приложения build.gradle:

    android {
        buildTypes {
            debug {
              // Disable fabric build ID generation for debug builds
              ext.enableCrashlytics = false
              ...
    
  2. Отключите комплект Crashlytics во время выполнения. В противном случае комплект Crashlytics выдаст ошибку:

    // Set up Crashlytics, disabled for debug builds
    // Add These lines in your app Application class onCreate method
    
    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);
    
  3. В AndroidManifest.xml добавьте

    <meta-data
    android:name="firebase_crashlytics_collection_enabled"
    android:value="false" />
    

Ответ 24

Шаг 1: В build.grade

buildTypes {
        debug {
            debuggable true
            manifestPlaceholders = [enableCrashlytic:false]
        }
        release {
            debuggable false
            manifestPlaceholders = [enableCrashlytic:true]
        }
    }

Шаг 2: в манифесте

<meta-data
            android:name="firebase_crashlytics_collection_enabled"
            android:value="${enableCrashlytic}" />

Шаг 3: В приложении или в первом действии

private void setupCrashReport() {
        if (BuildConfig.DEBUG) return;
        Fabric.with(this, new Crashlytics());
    }

Я не уверен, что шаг 3 необходим, но чтобы продакшен версия работала без сбоев. источник: https://firebase.google.com/docs/crashlytics/customize-crash-reports#enable_opt-in_reporting

Ответ 25

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

    releaseCompile  'com.crashlytics.sdk.android:crashlytics:2.9.9'

и в buildTypes:

debug {
ext.enableCrashlytics = false
}

Ответ 26

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