Подтвердить что ты не робот

Как отключить отчет о сбоях Firebase при запуске приложения при отладке?

Я успешно применил Firebase Crash Reporting, но мне нужно отключить службу, когда приложение работает, отменив вариант "debug" Build Variant, чтобы избежать непредвиденных сбоев в консоли во время разработки.

Официальная документация об этом ничего не говорит.

4b9b3361

Ответ 1

ОБНОВЛЕНО: В Google Play Services/Firebase 11+ теперь можно отключить отчеты о сбоях во время выполнения. FirebaseCrash.setCrashCollectionEnabled() (Спасибо @Tyler Carberry)

СТАРЫЙ ОТВЕТ:

Официальной поддержки для этого не существует, поскольку сообщество смогло догадаться. Лучший способ предложить это - настроить несколько приложений Firebase на панели управления, по одному для каждого типа сборки и настроить несколько файлов google_services.json, направляющих каждое приложение в зависимости от варианта сборки.

Ответ 2

В Google Play Services 11.0 теперь можно отключить отчеты о сбоях во время выполнения.

FirebaseCrash.setCrashCollectionEnabled(!BuildConfig.DEBUG);

Ответ 3

В последнее время появилась возможность отключить отчет о сбоях Firebase официальным способом. Вам необходимо обновить sdk firebase android до версии 11.0.0

Чтобы сделать это, вам нужно отредактировать свой AndroidManifest.xml и добавить:

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

Внутри блока <application>.

Вы можете проверить, включен ли отчет о сбое Firebase во время выполнения, используя FirebaseCrash.isCrashCollectionEnabled().

Ниже приведен полный пример для отключения отчетов о сбоях Firebase в ваших отладочных сборках.

build.gradle

...
 buildTypes {

    release {
        ...
        resValue("bool", "FIREBASE_CRASH_ENABLED", "true")
    }

    debug {
        ...
        resValue("bool", "FIREBASE_CRASH_ENABLED", "false")

    }

}
...
dependencies {
    ...
    compile "com.google.firebase:firebase-core:11.0.0"
    compile "com.google.firebase:firebase-crash:11.0.0"
    ...
}

AndroidManifest.xml

 <application>

    <meta-data
        android:name="firebase_crash_collection_enabled"
        android:value="@bool/FIREBASE_CRASH_ENABLED"/>
...

Ответ 4

в моем классе Application, onCreate()

if (BuildConfig.DEBUG) {
    Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler() {
        @Override
        public void uncaughtException(Thread paramThread, Throwable paramThrowable) {
            Log.wtf("Alert", paramThrowable.getMessage(), paramThrowable);
            System.exit(2); //Prevents the service/app from freezing
        }
    });
}

Он работает, потому что он принимает oldHandler, который включает Firebase one

 final UncaughtExceptionHandler oldHandler = Thread.getDefaultUncaughtExceptionHandler();

из пути обработки

Ответ 5

Вы можете изменить зависимость сбоя firebase к зависимости только от версии.

Чтобы сделать это, вы определяете его как зависимость releaseCompile

releaseCompile 'com.google.firebase:firebase-crash:9.4.0'

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

customBuildTypeCompile 'com.google.firebase:firebase-crash:9.4.0'

Ответ 6

Простой и простой трюк, который я использовал, заключается в том, чтобы добавить зависимость отчетов о сбоях в firebase в сборке выпуска только в файле build.gradle.

Это приведет к удалению библиотеки отчетов об ошибках из типа сборки отладки и добавит это только в сборку выпуска.

dependencies {
    releaseCompile 'com.google.firebase:firebase-crash:10.2.0'
}

Ответ 7

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

Используя Timber для ведения журнала, я создал различные реализации подкласса дерева для отладки и выпуска. При отладке он отлаживает DebugTree, который записывает в logcat. В выпуске он пересылает исключения и журналы с высоким приоритетом в Firebase, отбрасывая остальные.

build.gradle

dependencies {
  ...
  compile 'com.jakewharton.timber:timber:4.3.0'
  releaseCompile 'com.google.firebase:firebase-crash:9.0.2'
}

ЦСИ/отладки/Java/[пакет]/ForestFire.java

import timber.log.Timber;

public class ForestFire extends Timber.DebugTree {}

ЦСИ/выпуск/Java/[пакет]/ForestFire.java

import android.util.Log;
import com.google.firebase.crash.FirebaseCrash;
import timber.log.Timber;

public class ForestFire extends Timber.Tree {
  @Override
  protected void log(int priority, String tag, String message, Throwable t) {
    if (Log.WARN <= priority) {
      FirebaseCrash.log(message);
      if (t != null) {
        FirebaseCrash.report(t);
      }
    }
  }
}

Запуск приложения

Timber.plant(new ForestFire());

Ответ 8

Сначала инициализируйте переменные в файле gradle и проверьте, находится ли он в режиме отладки или в режиме выпуска. Лучший способ отправить отчет о сбое - это класс приложения.

build.gradle

    buildTypes {
         release {
             buildConfigField "Boolean", "REPORT_CRASH", '"true"'
             debuggable false
         }
         debug {
             buildConfigField "Boolean", "REPORT_CRASH", '"false"'
             debuggable true
         }
    }

Теперь сначала проверьте режим и отправьте отчет о сбое, если он разбился.

Application.java

    /** Report FirebaseCrash Exception if application crashed*/
    Thread.setDefaultUncaughtExceptionHandler (new Thread.UncaughtExceptionHandler()
    {
        @Override
        public void uncaughtException (Thread thread, Throwable e)
        {
            /** Check whether it is development or release mode*/
            if(BuildConfig.REPORT_CRASH)
            {
                FirebaseCrash.report( e);
            }
        }
    });

Ответ 9

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

Таким образом, один из способов сделать это - создать другое приложение с другим идентификатором в одном проекте Firebase. После этого вам просто нужно изменить appID, чтобы включить или отключить создание отчетов о сбоях Firebase. Для удобства я создал два приложения:

AppID: com.android - для версии сборки

AppID: com.android.debug - для отладочного типа сборки

Пожалуйста, перейдите по ссылке ниже для получения более подробной информации:

https://firebase.googleblog.com/2016/08/organizing-your-firebase-enabled-android-app-builds.html

Изменить: Вам не нужно менять appID в проекте Android снова и снова. Есть лучший способ использовать разные appID для отладочной сборки type-

android {
    defaultConfig {
        applicationId "com.android"
        ...
    }
    buildTypes {
        debug {
            applicationIdSuffix ".debug"
        }
    }
}

Проверьте ссылку для более подробной информации:

https://developer.android.com/studio/build/application-id.html

Edit2:

В основном в приведенном выше решении вы создаете два разных приложения в проекте Firebase, и таким образом вы можете разделить ошибки разработки и производства.

FYI Firebase отчеты о сбоях устарели. Вам следует использовать Fabrics Crashlytics (принадлежит Google). У него есть действительно классные функции.

Ответ 10

Для класса FirebaseAnalytics.
Отключить сбор: setAnalyticsCollectionEnabled(false);
Включить сбор: setAnalyticsCollectionEnabled(true); или напишите в AndroidManifest.xml в теге приложения: <meta-data android:name="firebase_analytics_collection_enabled" android:value="false" />

Возможное использование:

if (BuildConfig.DEBUG){ //disable for debug
    mFirebaseAnalytics.setAnalyticsCollectionEnabled(false);
}

Источник

Ответ 11

Сначала вам нужно будет создать варианты debug и release build, а затем установить переменную с логическим значением. Затем вам нужно будет получить это значение из вашего java файла, который расширяет application i.e, откуда вы включаете отчет о сбоях Fabric.

Ниже приведен пример кода.

В вашем приложении build.gradle добавьте следующие строки для создания 2 вариантов сборки debug и release, а затем добавьте переменную с логическим значением.

defaultConfig {
    buildConfigField 'boolean', 'ENABLE_ANALYTICS', 'true'
}

buildTypes {
    debug {
        applicationIdSuffix ".debug"
        versionNameSuffix 'DEBUG'
        buildConfigField 'boolean', 'ENABLE_ANALYTICS', 'false'
    }
    release {
        minifyEnabled false
    }
}

Затем, когда вы пытаетесь добавить отчет о сбоях Fabric, проверьте значение ENABLE_ANALYTICS

Открытый класс Test расширяет приложение {

private GoogleAnalytics googleAnalytics;
private static Tracker tracker;

@Override
public void onCreate() {
    super.onCreate();
    if (BuildConfig.ENABLE_ANALYTICS)
        Fabric.with(this, new Crashlytics());
    }
}

Вы можете увидеть значение ENABLE_ANALYTICS на ctrl + щелчок по значению. Надеюсь, это поможет.

Ответ 12

Я использую versionCode как фильтр для локальных/производственных сборок.

gradle.properties

VERSION_CODE=1

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

android {
    defaultConfig {
        versionCode VERSION_CODE as int
    }
}

При публикации новой версии приложения просто установите новое значение из командной строки:

./gradlew build -PVERSION_CODE=new_value

В противном случае, когда вы будете строить из Android Studio, вы всегда получите тот же versionCode, чтобы вы могли легко отличать отчеты о сбоях в консоли Firebase.

Ответ 13

Как уже было сказано, официального способа сделать это не существует. Но худшим обходным решением для меня, как упомянуто @mark-d, является reset DefaultUncaughtExceptionHandler (fooobar.com/questions/99670/...).

Но если вы просто вызываете System.exit(2), как было предложено, приложение будет немедленно закрыто на исключение, без какого-либо диалогового сообщения и жесткого получения журналов отладки. Если это важно для вас, есть способ восстановить обработчик по умолчанию:

if (BuildConfig.DEBUG) {
        final Thread.UncaughtExceptionHandler currentHandler = Thread.getDefaultUncaughtExceptionHandler();
        if (currentHandler.getClass().getPackage().getName()
                                                .startsWith("com.google.firebase")) {
            final Thread.UncaughtExceptionHandler defaultHandler = 
                getPrivateFieldByType(currentHandler, Thread.UncaughtExceptionHandler.class);
            Thread.setDefaultUncaughtExceptionHandler(defaultHandler);
        }
}

Где

public static <T> T getPrivateFieldByType(Object obj, Class<T> fieldType) {
    if (obj != null && fieldType != null) {
        for (Field field : obj.getClass().getDeclaredFields()) {
            if (field.getType().isAssignableFrom(fieldType)) {
                boolean accessible = field.isAccessible();
                if (!accessible) field.setAccessible(true);
                T value = null;
                try {
                    //noinspection unchecked
                    value = (T) field.get(obj);
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
                if (!accessible) field.setAccessible(false);
                return value;
            }
        }
    }
    return null;
}

Ответ 14

public class MyApp extends Application {
    public static boolean isDebuggable;

    public void onCreate() {
        super.onCreate();
        isDebuggable = (0 != (getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE));
        FirebaseCrash.setCrashCollectionEnabled(!isDebuggable);
    }
}

Ответ 15

Самое простое решение для пользователей, когда они используют приложение в режиме отладки или в режиме выпуска:

AndroidManifest.xml:

<meta-data
            android:name="firebase_crash_collection_enabled"
            android:value="${analytics_deactivated}"/>

build.gradle(Module:app)

buildTypes {

        debug {
            manifestPlaceholders = [analytics_deactivated: "false"]
        }

        release {
            manifestPlaceholders = [analytics_deactivated: "true"]

        }
    }

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